알고리즘

[백준 1436] 파이썬 오답노트

Codult 2024. 1. 19. 10:53
728x90

나는 N이 <= 10,000으로 주어지기 때문에, 백만 이하의 숫자에서 찾을 수 있겠다고 생각해서

for문을 돌려 7자리의 숫자에서 '666'이 포함된 모든 숫자를 구하고, 중복을 제거하여 미리 배열을 생성했다.

그럼 N을 입력받아, N-1 인덱스의 숫자를 출력하면 된다.

 

내가 생각해도 이건, 너무 불필요한 계산을 하게 만드는 코드라서, 바로 다른 풀이들을 찾아봤는데, 역시나 훨씬 효율적인 코드가 있었다.

(i) N>0 이 조건인 while문을 작성한다.

(i) num = 665인 숫자를 while문을 통해 +1을 해주고,

(ii) 그 결과에 '666'이라는 문자열이 포함될 때마다 N -= 1을 한다.

(iii) num을 출력한다.

 

>> 내 풀이

N = int(input())

numbers = []
for i in range(10):
    for j in range(10):
        for k in range(10):
            for l in range(10):
                numbers.append(i*1000000 + j*100000 + k*10000 + l*1000 + 666)
                numbers.append(i*1000000 + j*100000 + k*10000 + 666*10 + l)
                numbers.append(i*1000000 + j*100000 + 666*100 + k*10 + l)
                numbers.append(i*1000000 + 666*1000 + j*100 + k*10 + l)
                numbers.append(666*10000 + i*1000 + j*100 + k*10 + l)

results = list(set(numbers))
results.sort()

print(results[N-1])

 

>> 개선 코드

N = int(input())
num = 665

while N>0:
   num += 1
   if '666' in str(i):
       N -= 1
print(num)
728x90