다음은 [엘리스] 주간 알고리즘 - 알고리즘 다과회 - [7/31] 모자 사기 좋은 날을 요약한 것이다.
문제
'거울 수’는 올바르게 읽거나 거꾸로 읽어도 같은 수이다.
예를 들어 202
는 0
, 1
, …, 191
, 202
로 30
번째 거울 수이다.
어떤 모자의 고유 번호 N
을 입력했을 때, N
번째 거울 수를 출력하는 코드를 작성하라.
입력
첫번째 줄에 모자의 고유 번호 N(1≤N≤10,000,000)
이 주어진다.
출력
N
번째 거울 수를 출력하라.
시행착오
처음에는 0
부터 시작하여 N
번째 팰린드롬 수를 출력하도록 했다.
1 | def isPalindrome(n): |
시간 복잡도가 O(N×l)
인데 마지막 테스트 케이스에서 시간 초과가 뜬다.
따라서 N
번째 팰린드롬 수를 바로 반환하는 함수를 만들기로 결심했다.
알고리즘
- 팰린드롬 수의 몸통은 그 수의 길이가 홀수일 때 정가운데 숫자 한 개를 말한다.
- 팰린드롬 수의 날개는 그 수의 왼쪽 절반을 말한다. 예를 들어
1221
,12321
의 날개는12
이다. 1
~10
번째 팰린드롬 수인0
~9
를 제외했을 때, 다음과 같은 규칙으로N
번째 팰린드롬 수를 구할 수 있다.N
은11
부터 시작한다.- 길이가 짝수인 팰린드롬 수부터 먼저 세므로
isOdd
플래그의 기본값은False
이다. isOdd
가False
일 때. 수의 길이가 짝수일 때.99...999
까지 오면isOdd
플래그를 반대로 바꾼다.- 날개가
1
씩 증가한다.
isOdd
가True
일 때. 수의 길이가 홀수일 때.- 몸통과 날개가 모두
9
라면isOdd
플래그를 반대로 바꾼다. - 몸통 먼저
1
씩 증가하고,9
까지 오면0
이 되고 날개가1
씩 증가한다.
- 몸통과 날개가 모두
코드
1 | def allNine(n): |