[코딩테스트] 프로그래머스 : 124 나라의 숫자

김은지·2022년 8월 16일
0

코딩테스트

목록 보기
14/17

오랜만에 프로그래머스에서 문제를 풀었다.

124 나라의 숫자

친구들과 경쟁하며 풀었는데 초조하다는 이유로 문제를 잘 못 읽고 처음에는 계산문제라고 생각했다.
왜 answer이 string으로 나와있을까? 라고 생각하고 이 문제가 왜 2단계일까 생각하며...

def solution(n):
    
    answer = 1
    diff = [1, 2, 7]

    s = (n-1)//3
    r = (n-1)%3

    answer += s*10
    
    for i in range(r):
        answer += diff[i]

    return str(answer)

아래의 답으로 코드를 실행하면 9까지는 전부 통과하지만 n값으로 10이 들어오면 '3'이 등장하기 시작하기 때문에 안된다. 124나라에는 3이 없고... 이건 애초에 차이를 이용해서 푸는 문제가 아니었다...

뒤늦게 문제를 다시 읽고 쓴 풀이

def solution(n):
	answer = ''
    nums = [1,2,4]

    s = n//3
    r = n%3
    
    if s == 0 or n == 3:
        return str(nums[r-1])
    
    return str(nums[s-1]) + str(nums[r-1])

테스트 코드는 통과하지만 런타임 에러가 났다. 12일 때 index out of range가 나옴. 당연하다.
이런 바보같은...
일단 이 코드의 가장 중요한 문제는
s값이 nums의 인덱스를 초과한다는 것과
answer에 자리수를 늘리지 않고 바로 리턴을 한다는 것

이 때까지도 문제를 제대로 이해하지 못 했다.
흑흑...

10분만 더 볼까 하고 있었는데, 해답을 찾아본 친구에게서
'3진수'를 활용하라는 팁을 얻었다.
충격...! 3진수라니 생각도 못 했다.

친구가 찾은 해답은 이렇다.
코드 작성자의 말로는 간결성은 떨어지지만, 효율은 좋은 코드였다.

def solution(n):
    res = ''

    while n > 0:
        temp = 4 if n % 3 == 0 else n % 3
        res = str(temp) + res
        n = (n//3) - 1 if temp == 4 else n//3

    return res

3진수라고 생각하면 되는 거였다. 와오~!
3진법이 10진수 1,2,3에 대응하는 1, 2, 10

위 코드의 내용은 아래와 같다.

def solution(n):
    res = ''

    while n > 0:
    # 입력 된 수가 0이 될 때 까지
        temp = 4 if n % 3 == 0 else n % 3
        # 만약 입력 받은 수가 3으로 나누어 떨어지는 수라면
        # temp가 4 아니면 나머지(1,2) 오호 1, 2, 4의 세계
        res = str(temp) + res
        # 10진수를 3진수로 변환할 때 처럼 오른쪽에서 왼쪽으로 수를 붙여준다.
        n = (n//3) - 1 if temp == 4 else n//3
        # 만약 temp가 이미 4라면 3으로 떨어지는 수 이다.
        # 예를 들어 3을 3진법으로 표현하면 10이라는 두 자리의 수가 된다.
       	# 하지만 1,2,4나라에서 3은 4이다. 그래서 1을 없애주는 처리를 해야하는 것이다.
        # 그래서 (n//3)에 -1을 해준다. 
    return res
    # 답을 리턴한다.

이해 한 김에 다시 풀어봐야겠다.

오늘의 교훈
급할수록 돌아가라
공부 열심히...

0개의 댓글