티스토리 뷰

반응형

🎬 [백준 1436] 영화감독 숌 - "666"이 들어간 n번째 수 찾기 (Python 구현)

🔍 문제 설명

"종말의 수"란 숫자에 연속된 666이 포함된 수를 말합니다. 이 종말의 수 중에서 N번째로 작은 수를 구하는 것이 목표입니다.

📌 조건 요약:

  • 입력: 정수 N
  • 출력: N번째 종말의 수 (예: 1 → 666, 2 → 1666, 3 → 2666...)



💡 접근 방법

🎯 목표:

숫자 중에서 '666'연속해서 들어간 수를 순서대로 탐색하고, N번째로 등장하는 수를 출력한다.




🧩 단계별 접근

🧩 1단계: 배열에 종말의 수를 저장한 후 출력

아이디어

  • 숫자를 666부터 하나씩 올려가며
  • '666'이 포함된 수를 찾아 arr[]에 저장
  • arr[k-1]을 출력



✅ 전체 코드 1: 배열 저장 방식

k = int(input())

arr = []
i = 666

while len(arr) != 10000:
    if '666' in str(i):
        arr.append(i)
    i += 1

print(arr[k - 1])



🔍 코드 분해 설명

✅ 1. 입력 받기

k = int(input())
  • 사용자로부터 몇 번째 종말의 수를 찾을지 입력받음

✅ 2. 숫자 증가하면서 검사

i = 666
arr = []
while len(arr) != 10000:
    if '666' in str(i):
        arr.append(i)
    i += 1
  • 666부터 시작해서 하나씩 증가하면서
  • str(i) 안에 '666'이 포함되면 arr에 저장
  • 10000개 찾을 때까지 반복

✅ 3. 출력

print(arr[k - 1])
  • arr는 0-indexed → k-1번째 요소 출력



🔧 개선 코드 1: 메모리 낭비 없이 구현

배열을 만들 필요가 없으므로, 찾을 때마다 count만 증가시키면 됨!

✅ 전체 코드 2: 메모리 최적화 방식

k = int(input())

i = 666
count = 0

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



✅ 어떤 점이 개선되었나?

항목 배열 저장 방식 메모리 최적화 방식
메모리 사용량 O(N) (최대 10000개 저장) O(1)
코드 단순성 비교적 간단 더 간단하고 직관적
실행 속도 빠름 동일 또는 약간 빠름
정렬/중복 문제 없음 없음
확장성 N 커지면 부담 유리



🚀 개선 코드 2: 숫자 기반 666 연속 검사 (더 빠름)

문자열 변환 없이 숫자를 직접 나눠서 검사해 속도를 개선한 버전입니다.

✅ 전체 코드 3: 정수 기반 방식

k = int(input())

def has_666(n):
    consecutive = 0
    while n > 0:
        if n % 10 == 6:
            consecutive += 1
            if consecutive == 3:
                return True
        else:
            consecutive = 0
        n //= 10
    return False

i = 666
count = 0

while True:
    if has_666(i):
        count += 1
        if count == k:
            print(i)
            break
    i += 1



🔍 코드 분해 설명

✅ 핵심 아이디어

  • 문자열 변환 없이 n % 10으로 뒷자리부터 확인
  • 6이 연속으로 세 번 나오면 True 반환
  • str() 호출이 없으므로 속도 개선



⚡ 성능 비교

기준 문자열 방식 ('666' in str(i)) 정수 검사 방식 (has_666())
실행 시간 약 0.28초 (k=10000 기준) 약 0.23초 (최대 20% 개선)
문자열 변환 필요 없음
가독성 높음 약간 낮음
추천 상황 일반 풀이용 시간 제한 빡빡할 때



📌 결론

  • 종말의 수 문제는 str(i) 또는 정수 검사로 모두 풀 수 있습니다.
  • 문자열 방식은 직관적이고 입문자에게 좋습니다.
  • 성능 최적화가 필요한 경우 정수 기반 검사 방식이 더 유리합니다.



✅ 마무리 요약

방법 특징 추천 대상
배열 저장 방식 이해 쉬움, 구현 간단 연습/학습용
카운트 방식 메모리 낭비 없음, 깔끔한 코드 기본 풀이 방식
정수 검사 방식 가장 빠름, 문자열 변환 없음 고성능이 필요한 경우



이 글은 백준 1436번 문제를 기반으로 정리되었습니다.
필요하시면 C++ 버전, 성능 테스트 코드, 그래프 시각화 자료도 추가 제공 가능합니다. 😊

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/11   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
글 보관함
반응형