티스토리 뷰
영화 제목에 '6'이 적어도 3개 이상 연속된 경우를 숫자의 크기대로 찾아 N번째인 경우를 반환해야한다.
가장 간단한 해결방법은 666에서 시작해서 1씩 증가시킨다. 만약 6이 연속해서 3회 이상 등장한 수인 경우 카운트를 1씩 늘리고, 카운트가 N이 된경우 그 수를 반환한다.
하지만 수를 문자로 변환시키고 파이썬 내장 함수인 count()를 사용하게 된다면 상당히 비효율적이다. 따라서 더 효율적인 코드를 위해서 숫자를 문자열로 변환하지 않고 6이 3회 이상 연속되는 경우를 찾아야한다.
숫자 i를 가지고 666이 들어가는 수를 만든다고 생각해보자.
i = 0 : 0 * 1000 + 666 = 666
i = 1 : 1 * 1000 + 666 = 1666
...
i = 6 : 6 * 1000 + 666 = 6666
...
i = 16 : 16 * 1000 + 666 = 16666
...
i가 6일 때 6666 값은 6660 보다 크기 때문에 위와 같은 규칙으로 숫자를 만드는 것은 잘못된 방법이다. 따라서 새로운 방법을 찾아야한다.
i = 0 : 0 * 1000 + 666 = 666
i = 1 : 1 * 1000 + 666 = 1666
...
i = 6 : 6 * 1000 + 660 + 0 = 6660
i = 6 : 6 * 1000 + 660 + 1 = 6661
i = 6 : 6 * 1000 + 660 + 2 = 6662
...
i = 16 : 16 * 1000 + 660 + 0= 16660
i = 16 : 16 * 1000 + 660 + 1= 16661
i = 16 : 16 * 1000 + 660 + 2= 16662
...
i = 66 : 66 + 1000 + 600 + 0 = 66600
i = 66 : 66 + 1000 + 600 + 1 = 66601
...
i = 66 : 66 + 1000 + 600 + 99 = 66699
위와 같이 i를 6이 들어가지 않은 경우 1000, 100, 10 으로 나눈 나머지가 각각 666, 66, 6인 경우로 나눈다. 그리고 i에 1000을 곱하고 각각 666, 660, 600, 0을 더해 6이 3회 등장하는 경우를 먼저 만든다. 그리고 0인 부분에 들어갈 수를 반복문을 통해 구하면 오름차순으로 숫자를 만들 수 있다.
풀이를 설명하기 어려워 장황하니 코드를 보고 이해하기 바란다.
Python
'PS > 백준' 카테고리의 다른 글
[백준] 2263 트리 순회 (0) | 2021.06.01 |
---|---|
[백준] 18111 마인크래프트 (0) | 2021.04.15 |
[백준] 1450 냅색문제 (0) | 2021.04.12 |
[백준] 14225 부분수열의 합2 (0) | 2021.04.12 |
[백준] 2632 피자 판매 (0) | 2021.04.11 |