728x90

 

문제 소개

백준 1436번 문제는 '숌' 감독이 좋아하는 숫자인 '666'이 포함된 영화 제목을 찾는 문제입니다. 간단히 말해, '666'이 연속적으로 포함된 숫자들을 찾는 것이 목표입니다. 예를 들어, 첫 번째 영화 제목은 666, 두 번째 영화 제목은 1666, 세 번째는 2666입니다. 이렇게 '666'이 들어가는 숫자를 순서대로 나열해 찾는 과정이 필요합니다.

문제 접근 방법

이 문제를 해결하기 위해서는 숫자를 하나씩 증가시키며 '666'이 포함되는지를 확인해야 합니다. 단순히 1부터 시작해 조건에 맞는 숫자를 찾을 때까지 반복하면 해결할 수 있죠. 이 과정에서 중요한 점은 어떤 데이터 구조나 알고리즘의 사용보다는, 반복문을 어떻게 효율적으로 작성하는가에 있습니다.

제가 사용한 접근 방법은 다음과 같습니다:

  1. 숫자 증가시키기: 시작은 666부터 합니다. 숫자를 하나씩 증가시키면서 '666'이 포함되는지를 체크합니다.
  2. '666' 포함 여부 확인: 파이썬에서는 문자열의 부분 문자열을 손쉽게 확인할 수 있기 때문에, 이를 이용해 조건을 만족하는 숫자를 찾습니다.
  3. N번째로 찾기: 문제에서 주어진 N번째 제목을 찾기 위해, 조건을 만족할 때마다 카운트를 증가시키고, 원하는 값에 도달하면 출력합니다.

코드 구현

n = int(input())
count = 0
num = 666

while True:
    if '666' in str(num):
        count += 1
        if count == n:
            print(num)
            break
    num += 1

 

이 코드의 핵심은 while 루프를 사용해 모든 숫자를 순차적으로 검사하는 것입니다. if '666' in str(num) 구문을 통해 현재 숫자가 '666'을 포함하고 있는지 여부를 확인할 수 있습니다. 조건을 만족할 때마다 카운트를 증가시키고, N번째 숫자에 도달하면 결과를 출력하는 방식입니다.

문제 해결 후 느낀 점

이 문제는 알고리즘의 복잡함보다는 기본적인 반복과 조건 확인을 얼마나 정확하게 구현할 수 있는지를 테스트하는 문제입니다. 코드를 작성하면서 '단순 반복문'이 얼마나 강력한 도구인지를 다시금 느꼈습니다. 또한, 문자열 조작이 문제 해결에 얼마나 유용한지를 깨닫게 되었죠.

728x90
반응형
728x90

 

백준 2869번: 달팽이는 올라가고 싶다


문제 설명
달팽이가 낮에는 올라가고, 밤에는 미끄러지며 나무 꼭대기에 도달하는 데 걸리는 일수를 계산하는 문제입니다.


문제 조건

  • 낮에는 A만큼 올라가고, 밤에는 B만큼 미끄러집니다.
  • 나무의 높이는 V입니다.
  • 마지막 날에는 꼭대기에 도달하면 미끄러지지 않습니다.

 

핵심 포인트

  1. 수식 활용:
    • 반복문 없이 간단히 계산식으로 해결 가능.
  2. 올림 연산:
    • 나눗셈 결과를 올림하여 최소 일수를 정확히 계산.

 

결과 코드

import math

a, b, v = map(int, input().split())

# a, b, v = 2, 1, 5

result = (v - b) / (a - b)

result = math.ceil(result)

print(result)

 

 

 

728x90
반응형
728x90

 

문제 설명

  1. 주어진 정수 N에 따라 아래와 같은 형태의 별(*)을 출력해야 합니다:
    • N=5 일 때:
          *
         ***
        *****
       *******
      *********
       *******
        *****
         ***
          *
       
  2. 이 문제는 중앙을 기준으로 대칭적인 피라미드 모양을 출력하는 문제입니다.

문제 해결 전략

  1. 첫 번째 피라미드 (위쪽 절반):
    • i-번째 줄에 출력되는 별의 개수는 2i−1
    • 공백의 개수는 N−i
  2. 두 번째 피라미드 (아래쪽 절반):
    • i-번째 줄(위 절반 이후)의 별의 개수는 2(N−i)−1
    • 공백의 개수는 i−N
  3. 이를 반복문으로 처리하여 출력합니다.

코드 구현

N = int(input())  # 입력값

# 위쪽 피라미드
for i in range(1, N + 1):
    print(" " * (N - i) + "*" * (2 * i - 1))

# 아래쪽 피라미드
for i in range(N - 1, 0, -1):
    print(" " * (N - i) + "*" * (2 * i - 1))

 


코드 설명

위쪽 피라미드:

  • i-번째 줄에서:
    • " " * (N - i) → 왼쪽 공백 출력.
    • "*" * (2 * i - 1) → 별 출력.
  • 예를 들어 N=5일 때:
    *
   ***
  *****
 *******
*********

 

아래쪽 피라미드:

  • i-번째 줄에서:
    • " " * (N - i) → 왼쪽 공백 출력.
    • "*" * (2 * i - 1) → 별 출력.
  • i N−1부터 1까지 감소시키면서 처리.
  • 예를 들어 N=5일 때:
 *******
  *****
   ***
    *

 

출력:

  • 두 반복문을 순차적으로 실행하여 최종 출력물을 완성합니다.

시간 복잡도

  • 각 반복문은 O(N)으로 실행됩니다.
  • 전체 시간 복잡도는 O(N)+O(N)=O(N)

자주 하는 실수

  1. 공백과 별의 관계를 잘못 설정:
    • 공백의 개수는 N−i이고, 별의 개수는 2i−1임을 놓치면 출력 형식이 잘못됩니다.
  2. 아래쪽 피라미드의 시작을 으로 설정:
    • 아래쪽 피라미드는 부터 시작해야 정상적으로 대칭 구조를 유지합니다.

 

728x90
반응형
728x90

 

백준 1316번 문제: 그룹 단어 체커


문제 설명

  1. 그룹 단어란, 단어에 포함된 문자들이 각각 연속해서 나타나는 경우를 말합니다.
    • 예: happy, new, year는 그룹 단어.
    • 예: abc, aab는 그룹 단어.
    • 예: aabbcc, abca는 그룹 단어가 아님 (abca에서 a가 떨어져 다시 등장).
  2. 입력으로 주어진 단어들이 그룹 단어인지 판단하고, 그룹 단어의 개수를 출력합니다.

문제 해결 전략

  1. 문자 등장 순서 추적:
    • 단어를 한 글자씩 순회하며, 이미 등장한 문자와 현재 문자가 연속적인지 확인합니다.
    • 이전 문자와 같으면 계속 진행.
    • 이전 문자와 다르지만 이미 등장했던 문자라면 그룹 단어가 아님.
  2. 각 단어를 독립적으로 처리:
    • 주어진 단어마다 독립적으로 판단.
    • 결과적으로 그룹 단어인 단어의 개수를 세면 됩니다.

코드 구현

def is_group_word(word):
    seen = set()  # 등장한 문자를 저장할 집합
    prev_char = None  # 이전 문자를 저장

    for char in word:
        if char != prev_char:  # 이전 문자와 다를 때
            if char in seen:  # 이미 등장했던 문자면 그룹 단어 아님
                return False
            seen.add(char)  # 새로운 문자를 추가
        prev_char = char  # 이전 문자를 갱신

    return True  # 모든 문자가 조건을 만족하면 그룹 단어

# 입력 처리
n = int(input())  # 단어 개수
count = 0

for _ in range(n):
    word = input()
    if is_group_word(word):  # 그룹 단어라면 카운트 증가
        count += 1

print(count)

코드 설명

  1. is_group_word 함수:
    • seen 집합:
      • 등장했던 문자를 저장합니다.
    • prev_char 변수:
      • 현재 문자와 이전 문자가 연속인지 판단하는 데 사용합니다.
    • 문자 순회 중:
      • 이전 문자와 다르고, 이미 등장한 문자라면 그룹 단어가 아님.
      • 새로운 문자는 seen 집합에 추가합니다.
  2. 단어 입력 및 판별:
    • 주어진 n개의 단어를 하나씩 판별.
    • 그룹 단어라면 count를 증가시킵니다.
  3. 결과 출력:
    • 그룹 단어의 총 개수를 출력합니다.

입출력 예시

입력:

3
happy
new
year

출력:

3

입력:

4
aba
abab
abcabc
a

출력:

1

 

풀이 과정:

  1. aba: a  b  a (떨어진 a가 다시 등장 → 그룹 단어 아님).
  2. abab: a  b  a (떨어진 a가 다시 등장 → 그룹 단어 아님).
  3. abcabc: a  b  c → 다시 a 등장 (그룹 단어 아님).
  4. a: 한 글자이므로 그룹 단어.

시간 복잡도

  • 단어 개수: n
  • 단어의 평균 길이: m
  • 각 단어를 순회하므로 전체 시간 복잡도는 O(n⋅m)

자주 하는 실수

  1. 이미 등장한 문자를 확인하지 않음:
    • 떨어진 문자가 다시 등장할 경우를 확인하지 않으면 틀린 결과가 나옵니다.
  2. 이전 문자와 연속된 경우를 놓침:
    • 이전 문자와 연속된 경우는 문제없으므로 조건을 명확히 처리해야 합니다.

 

728x90
반응형
728x90

 

백준 1193번 문제: 분수찾기


문제 설명

  1. 양의 정수를 순서대로 분수에 배치하여 다음과 같은 규칙을 따릅니다:
    • 1/1 → 1/2 → 2/1 → 3/1 → 2/2 → 1/3 → ...
  2. 주어진 정수 X에 대해, 번째에 해당하는 분수를 구해야 합니다.

문제 해결 전략

  1. 규칙 분석:
    • 분수는 대각선 그룹으로 나뉩니다.
    • 그룹 1: 1/1 (1개)
    • 그룹 2: 1/2,2/1 (2개)
    • 그룹 3: 3/1,2/2,1/3 (3개)
    • 그룹 : n개의 분수로 이루어짐.
  2. 그룹 번호 찾기:
    • X번째 분수는 어느 대각선 그룹에 속하는지 알아야 합니다.
    • 그룹 n까지의 합은 삼각수: sum=1+2+3+⋯+n=n(n+1) / 2
    • 가 포함되는 그룹 n n(n+1) / 2 ≥ X일 때 찾을 수 있습니다.
  3. 해당 그룹에서의 위치 계산:
    • 그룹 의 시작 번호는 (n−1)n / 2 + 1
    • 는 그룹의 시작 번호로부터 몇 번째에 위치하는지 계산합니다.
  4. 분수 방향:
    • 그룹 번호가 홀수: 분자 감소, 분모 증가.
    • 그룹 번호가 짝수: 분자 증가, 분모 감소.

코드 구현

X = int(input())  # 입력값 X

# 그룹 번호 찾기
group = 1
while X > group * (group + 1) // 2:
    group += 1

# 해당 그룹에서의 위치
start_of_group = (group - 1) * group // 2 + 1
position_in_group = X - start_of_group

# 분수 계산
if group % 2 == 0:  # 짝수 그룹
    numerator = 1 + position_in_group
    denominator = group - position_in_group
else:  # 홀수 그룹
    numerator = group - position_in_group
    denominator = 1 + position_in_group

print(f"{numerator}/{denominator}")

코드 설명

  1. 그룹 번호 찾기:
    • 그룹 번호는 n(n+1) / 2 ≥ X 조건을 만족할 때까지 증가시킵니다.
  2. 그룹 시작 번호:
    • 그룹 n의 시작 번호는 (n−1)n / 2 +1 로 계산합니다.
  3. 그룹 내 위치:
    • 가 그룹에서 몇 번째인지 계산:
      position_in_group = X - start_of_group
  4. 분수 계산:
    • 짝수 그룹이면 분자가 증가하고 분모가 감소.
    • 홀수 그룹이면 분자가 감소하고 분모가 증가.

입출력 예시

입력:

14

출력:

2/4

 

풀이 과정:

  1. X = 14 → 그룹 5에 속함 (5(5+1) / 2 = 15)
  2. 그룹 5의 시작 번호: (5−1)5 / 2 + 1 = 11
  3. 그룹 내 위치: 14 − 11 = 3
  4. 그룹 5는 홀수 그룹 → 분자 = 5−3=2, 분모=1+3=4
728x90
반응형

+ Recent posts

728x90
반응형
728x90
반응형