본문 바로가기
IT/Python

프로그래머스 알고리즘 연습 Lv2 124 나라의 숫자

by Jason J 2018. 7. 19.

문제출처 : https://programmers.co.kr/

프로그래머스 사이트에서 만난 첫 레벨2 문제인데 레벨1에 비해 갑자기 난이도가 상승했다.

4를 3으로 취급하고 3진법으로 해결할 수 있을거라 생각했지만 자릿수가 올라갈 때 0의 부재로 해결이 불가능하다는 것을 깨닫고 방식을 바꿈.

종이에 몇 번 끄적이다가 3의 n승을 이용해 124나라 숫자로 몇 자리 수인지 알아낸 다음 그 자릿수에서 몇 번째 숫자인지 찾아내서 계산하는 방식으로 접어듬.


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
def solution(n):
    m,count = numofdigit(n) 
    num=[1]*#각 자릿수를 분리해서 계산하기 위해 자릿수 크기의 리스트 생성
    count-=1
    while count>2
        count-=3
        num[0]+=3
        for i in range(len(num)): #3이 넘는 숫자가 있으면 1로 바꾸고 그 다음 자릿수에 1더함.
            if num[i]>3:
                num[i]=1
                num[i+1]+=1
 
    num[0]+=count
    result=""
 
    for i in num[::-1]: #리스트 맨 앞이 1의 자리이므로 순서 역전.
        if i==3:i=4 #편의상 사용한 3을 4로 변경
        result.str(i)
 
    return result
 
def numofdigit(n): #n이 몇 자릿수인지, 그 자리 수 중에서 몇 번째 수인지 반환.
    m=0
    digit=0
    count=0
    while n>digit:
        m+=1
        count=n-digit
        digit=sum([3**for i in range(1,m+1)])
        
    return m,count
cs

하지만 문제의 답은 모두 맞췄지만 코드가 장황해서 효율성테스트를 통과하지 못했다. 

두번째로 해결한 방식은 n을 3으로 계속 나누는데 나머지가 0인 경우에는 몫을 -1해주고 나눗셈을 지속하면 나머지들을 모아서 숫자를 완성하는 방식이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def solution(n):
    if n<3:return n
    elif n==3return 4
    result=''
    index=['4','1','2']
    rem=0
    quo=0
 
    while n>3:
        rem=n%3
        quo=n//3
        print(rem,quo)
        result+=index[rem]
        if rem==0: quo-=1
        n=quo
 
    result+=str(n)
    result=result.replace('3','4')
    return result[::-1]
cs

효율성 테스트까지 통과하고 다른 사람의 풀이를 보니 같은 방식인데 더 짧게 구현한 사람이 역시나 있었다. 흑흑 더 열심히해보자.

댓글