Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
Tags
- 백준1788
- 피보나치 수의 확장
- 움직이는 미로 탈출
- 완주하지 못한 선수
- 코딩테스트
- 백준 14499
- 백준5710
- 백준16234
- 백준
- 백준3190
- 경비원
- A와 B
- 백준12904
- 파이썬
- 빙산
- 소수 만들기
- 인구 이동
- 백준2573
- Smart Commit
- 부스트캠프
- 프로그래머스
- 백준 2564
- 단어 수학
- 전기 요금
- 124 나라의 숫자
- 백준1339
- 로또의 최고 순위와 최저 순위
- 키패드 누르기
- 백준16954
- 백준1697
Archives
- Today
- Total
Today.dev
[PG_12899/Python] 124 나라의 숫자 본문
문제
코딩테스트 연습 - 124 나라의 숫자
programmers.co.kr
틀린 풀이
124 나라의 숫자가 중복 조합의 형태를 가지고 있다는 것을 발견했다. 124 나라의 숫자는 1의 자리수가 세 개, 2의 자리수가 9개, 3의 자리수가 27개, 즉 [3, 9, 27, 81, ... ] 과 같이 3의 제곱수 형태로 증가하기 때문에 내가 뽑을 숫자의 개수를 구하고(#1) 중복 순열을 구한 후 원하는 숫자를 택하는 형태(#2)로 코드를 구현했다.
from itertools import product
def solution(n):
# 1. 숫자를 몇 개 뽑아야할지(cnt) 구한다.
s, cnt = 0, 0
while s < n:
cnt += 1
s += 3**cnt
# 2. 중복 순열에서 원하는 숫자를 픽한다.
nums = ['1', '2', '4']
answer = ''.join(list(product(nums, repeat=cnt))[n - s - 1])
return answer
결과는?
n = 500, 000, 000 이하의 자연수이기 때문에 효율성 테스트를 하나도 통과하지 못한다.
옳은 풀이
3진법을 사용하되, 나눠지는 수가 3의 배수인 경우를 특별 처리하는 방법을 이용했다. 예를 들어 10진법 3, 6, 9를 124 나라 숫자로 표현하는 방법은 다음과 같다.
3의 124나라 숫자 | 6의 124나라 숫자 | 9의 124나라 숫자 |
str(3 // 3 - 1) + str(4) | str(6 // 3 - 1) + str(4) | str(9 // 3 - 1) + str(4) |
4 | 14 | 24 |
def solution(n):
answer = ''
while n > 0:
if n % 3 == 0:
answer += str(4)
n = n // 3 - 1
else:
answer += str(n % 3)
n = n // 3
return answer[::-1] # 역순 리턴
먼저 나오는 숫자가 앞에 위치하게 되므로 마지막에 역순으로 리턴해준다.
참고
1. [프로그래머스] 124 나라의 숫자 / Python - 빠리의 택시 운전사
2. 다른 사람의 풀이
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[PG_49189/Python] 가장 먼 노드 (1) | 2021.07.03 |
---|---|
[PG_42746/Python] 가장 큰 수 (0) | 2021.07.03 |
[PG_67256/Python] 키패드 누르기 (0) | 2021.06.22 |
[PG_77484/Python] 로또의 최고 순위와 최저 순위 (0) | 2021.06.22 |
[PG_42576/Python] 완주하지 못한 선수 (0) | 2021.06.22 |
Comments