[python_파이썬_pass]백준_1436번_영화감독 숌_풀이

2024. 4. 30. 12:12코드리뷰

728x90
반응형

공부하는허딩크 : https://www.youtube.com/live/wAItg8urY5U?feature=shared

 


일단 말이 길다. 다 떠나서 예제를 보자.
입력이 1이면 666, 2이면 1666, 3이면 2666이다.
쉽게 보면 2부터 666 세자리 앞에 1, 2, 3, 4, 이렇게 붙이면 되는건가? 라는 오해를 할 수 있다.

예제를 다시 보자.
6까지는 5666출력, 187입력시 66666출력, 500입력시 166699출력이다.

다시 문제를 읽어보고 이해를 했다.
단순하게 내가 원하는 순서 -1 + 666이 아니라
666이 들어간 숫자를 차례로 구하면 되는구나. 라는 결론을 내렸다.
즉 입력값이 1부터 6까지는 666, 1666, 2666, 3666, 4666, 5666이다. 이 중간에 666이 나오는 숫자가 없나보다. 계산은 안해봤지만 그렇게 추정을 하자. (언제 다 계산해...)

즉 while로 반복을 돌려서 내가 원하는 입력값에서 멈추도록 설계해 보자.

<첫번째 시도 : 정답. 어? 이렇게 한번에???>

import sys
input = sys.stdin.readline

N = int(input())
cnt = 1
num = 666

while (N > cnt):
    num += 1
    if str(666) in str(num):
        cnt += 1
        num = num      

print(num)

 

다른 사람들이 어떻게 풀었는지 비교해 보자. => 대부분 비슷한 답들이 많은데 아래 itertools로 해결한 코딩을 분석해보자.

N = int(input())

from itertools import product

# 모든 조합을 생성
all_cases = [''.join(n) for n in product('0123456789s', repeat=5)]
# s가 포함된 엘리먼트에 한하여 s를 666으로 대체 후 정수로 변환
all_cases = [int(n.replace('s', '666')) for n in all_cases if 's' in n]
# 중복된 엘리먼트 제거
all_cases = list(set(all_cases))
# 오름차순으로 정렬 (총 55722개의 경우의 수)
all_cases.sort()
# 1-베이스
print(all_cases[N-1])

 

이거 라이브러리 함수 사용으로 깔끔한 모양새다.

product함수로 11개의 숫자와 문자 's'로 5개의 전체 조합을 만들고 s가 포함된 것만 다시 숫자 666으로 바꾼다.

이후에 set()으로 중복 숫자를 제외하고 sort()로 오름차순을 하면 끝.

 

그런데 여기서 아직도 이해 안되는게 있는데 repeat = 5를 주었는데 이게 이해가 가지 않네.

repeat = 7을 하면 메모리 초과가 뜨고, 6, 5는 정답처리가 되고 4이하는 런타임 에러가 나옴.

 

N의 최대값인 10,000을 입력시 266799가 나오지만 이건 주어진 예시가 아니기 때문에 6자리가 나올거라고 추정을 할 수 있나?

 

이건 모르겠다.

728x90
반응형