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
- DilatedNet
- 알고리즘
- TEAM-EDA
- MySQL
- Segmentation
- 프로그래머스
- Python
- 파이썬
- hackerrank
- Image Segmentation
- 나는리뷰어다
- eda
- DFS
- 추천시스템
- 스택
- 3줄 논문
- 코딩테스트
- 엘리스
- 협업필터링
- 큐
- TEAM EDA
- 튜토리얼
- pytorch
- Machine Learning Advanced
- 한빛미디어
- 나는 리뷰어다
- Recsys-KR
- 입문
- Semantic Segmentation
- Object Detection
Archives
- Today
- Total
TEAM EDA
[프로그래머스] 124 나라의 숫자 / 파이썬 본문
124 나라의 숫자
문제 설명
124 나라가 있습니다. 124 나라에서는 10진법이 아닌 다음과 같은 자신들만의 규칙으로 수를 표현합니다.
- 124 나라에는 자연수만 존재합니다.
- 124 나라에는 모든 수를 표현할 때 1, 2, 4만 사용합니다.
예를 들어서 124 나라에서 사용하는 숫자는 다음과 같이 변환됩니다.
10진법 | 124 나라 | 10진법 | 124 나라 |
---|---|---|---|
1 | 1 | 6 | 14 |
2 | 2 | 7 | 21 |
3 | 4 | 8 | 2 |
4 | 11 | 9 | 24 |
5 | 12 | 10 | 41 |
자연수 n이 매개변수로 주어질 때, n을 124 나라에서 사용하는 숫자로 바꾼 값을 return 하도록 solution 함수를 완성해 주세요.
제한사항
- n은 500,000,000이하의 자연수 입니다.
입출력 예
n | result |
---|---|
1 | 2 |
2 | 2 |
3 | 4 |
4 | 11 |
풀이
- 다음에 들어올 값은, 자릿수가 하나 작은 값의 맨 앞에 1, 2, 4중 하나가 붙음
- 예: 두자릿 수
- 11, 12, 14는 [1, 2, 4]에 1이 붙은 경우
- 21, 22, 24는 [1, 2, 4]에 2가 붙은 경우
- 41, 42, 44는 [1, 2,, 4]에 4가 붙은 경우
- 즉, 2자리수의 값은 1자리수의 값 앞에 [1, 2, 4]가 순차적으로 붙은 것임
- 단점 : 모든 경우를 찾으나 속도가 느림
def solution(n):
Table = ['1', '2', '4']
while len(Table) < n:
start = ((3 **len(Table[-1]) -1) // 2) - 1
end = ((3 ** (len(Table[-1])+1) -1) // 2) - 1
for i in ['1', '2', '4']:
for j in range(start, end):
Table.append(''.join([i, Table[j]\))
if len(Table) == n:
break
return Table[n-1]
- 두자리 수는 [1, 2, 4]를 중복해서 뽑아서 나열한 경우임.
- 즉, 각 자리수에 올 수 있는 값은 1, 2, 4중에 하나임 (3x3)
- 예: 두자릿 수
- [1, 2, 4] x [1, 2, 4] = [11,12,14,21,22,24,41,42,44]
- product를 이용해서 두자리 수의 모든 케이스를 찾고 정렬한 다음에, n의 위치를 반환
- n의 위치는 참고로 이전의 한자리 수의 위치까지 고려해야 함.
- 즉, n = 10이라는 것은 1의 자리수 3개를 빼고 남은 나머지인 7이 됨 (41)
- 속도는 빨라졌으나 그대로 속도에서 걸림
from itertools import product
def solution(n):
# 자릿수 반환
lengthn = 1
start = 0
for i in range(1, n):
start = ((3 ** i -1) // 2)
end = ((3 ** (i+1) -1) // 2)
if (n >= start) & (n < end):
lengthn = i
break
if n <= 3:
start = 1
sol = sorted(list(map(''.join, product(['1', '2', '4'], repeat=lengthn))))
return sol[n-start]
다른 사람의 풀이
- 들어오는 n에 대해서 바로 변환을 진행
- 3진수의 개념을 이용해서 변환
def solution(n):
num = ['1','2','4']
answer = ""
while n > 0:
n -= 1
answer = num[n % 3] + answer
n //= 3
return answer
def solution(n):
if n<=3:
return '124'[n-1]
else:
q, r = divmod(n-1, 3)
return solution(q) + '124'[r]
출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
'EDA Study > 알고리즘' 카테고리의 다른 글
[프로그래머스] 탑 / 파이썬 (0) | 2020.04.02 |
---|---|
[프로그래머스] 기능개발 / 파이썬 (0) | 2020.04.02 |
[엘리스] 엉망진창 다과회 (0) | 2020.03.30 |
[엘리스] 이상한 소문 (0) | 2020.03.29 |
[엘리스] 유치원 소풍 (0) | 2020.03.29 |