브루트포스 알고리즘 문제이다.
사실 처음에는 문제를 단순하게 봐서 그냥 N666 의 형태로 출력되는 거 아닌가? 실버치고 너무 쉬운데? 하고
다음과 같이 코드를 짰다가, 예시 중 187로 테스트해보니 아니었음을 깨달았다..
N = int(input())
print((N-1)*1000 + 666)
무튼 이 원리를 잘 이해하기 위해 다음과 같이 숫자를 일일이 적어 나열해보았다!
0666 1666 2666 3666 4666 5666
6660 6661 6662 6663 6664 6665 6666 6667 6668 6669
7666 8666 9666
10666 11666 12666 13666 14666 15666
16660 16661 16662 16663 16664 16665 16666
17666 18666 19666 20666 21666 22666 23666 ...
앞 부분만 보면 내가 착각했던 것처럼 2를 입력하면 1666, 4를 입력하면 3666, ... 이 아닌가 싶을 수 있지만,
변화구의 규칙성을 나름대로 찾아보자면 변하는 부분이 6이 되는 순간 숫자가 기존처럼 첫째 자리수가 증가하지 않고
666부분이 앞으로 한 칸 땡겨지고, 일의 자리가 1부터 차례대로 다시 증가하여 6에 도달해서야
비로소 다시 기존의 루틴대로 7... 8... 9.. 증가하는 것을 파악할 수 있었다!
<풀이 코드>
N = int(input())
cnt = 0
number = 666
while (1):
if '666' in str(number):
cnt += 1
if cnt == N:
print(number)
break
number += 1
따라서 위와 같이 코드를 작성할 수 있었다.
변화되는 자리의 수를 기록할 cnt 변수와 증가하는 숫자 자체를 나타내는 number 변수를 생성하였고,
cnt는 0으로 초기화한 반면, 어차피 종말의 수는 최소가 666이니까 시간 절약을 위해 number 값은 666으로 초기화 해놓고 시작했다.
무한루프 안에서 문자화된 number에 종말의 수인 '666' 이 존재하면 cnt를 +1 하고,
이 cnt가 초기에 입력했던 N과 같다면 현재의 number를 출력하고 종료한다.
만약 666이 존재하지 않거나 cnt가 N과 같지 않은 경우엔 number에 +1을 하여 결국 초기값인 666부터 차례대로 모든 수를 검사하며 과정을 진행하는 브루트포스 알고리즘을 구현할 수 있었다.
'Python' 카테고리의 다른 글
[Python] sys 모듈 개념과 표준 입출력 (sys.stdin / sys.stdout) (0) | 2024.07.22 |
---|---|
[백준/Python] 10828 : 스택 (0) | 2024.07.22 |
[백준/Python] 14501 : 퇴사 (0) | 2024.07.17 |
[백준/Python] 1094번 : 막대기 (0) | 2024.07.14 |
[백준/Python] 15702번 : 중간고사 채점 (0) | 2024.07.12 |