프로그래머스_3진법뒤집기

임정민·2023년 9월 14일
0

알고리즘 문제풀이

목록 보기
96/173
post-thumbnail

프로그래머스 Lv1 문제입니다. 실전에 대비하기 위해 60분 시간제한을 두고 풀었습니다.

문제

https://school.programmers.co.kr/learn/courses/30/lessons/68935

[나의 풀이1]

⌛ 시간초과 (40/100 점)


def solution(n):
    from collections import deque
    answer = 0
    tmp = deque([])
    while n!=1:
        if n%3==0:
            tmp.appendleft(n%3)
        else:
            tmp.appendleft(n%3)
        n = n//3
    tmp.appendleft(1)

    quotient = 0
    for x in tmp:
        answer += 3**quotient*x
        quotient += 1

    return answer

주어진 입력값을 3진법으로 바꾸고 거꾸로 뒤집은 후 10진법으로 바꾸는 문제입니다. 위 풀이와 같이 구현하는데는 어렵지 않았지만 일부 케이스에서 시간초과가 발생하여 최적화하고자 하였습니다.

입력값을 3진법으로 하나씩 변환함과 동시에 연산하여 10진법으로 바꾸는 방법을 고민해보았지만 3진법으로 변환을 완료하기 전까지 3^0,3^1,3^2..몇째자리까지 더해야할지 모르기 때문에 위 구조안에서 최적화시키는 방향으로 생각하였습니다.🐶🐶🐶

[나의 풀이2]


def solution(n):
    from collections import deque
    answer = 0
    tmp = deque([])
    while n!=1: 
        tmp.appendleft(n%3)
        n = n//3
        print(n)
    tmp.appendleft(1)
    print(tmp)
    quotient = 0

    while tmp:
        v = tmp.popleft()
        if v!=0:
            answer += 3**quotient*v
        quotient += 1

    print(answer)
    return answer
    

연산하는 방식을 for문에서 queue구조를 popleft()하는 방식으로 바꾸어보았지만 또 다시 일부 케이스에서 시간초과가 발생하여 다른 풀이를 참고하였습니다.

[다른사람의 풀이1]


def solution(n):
    result=[]
    sum=0
    while n!=0:
        result.append(n%3)
        n=n//3
    for i in range(len(result)):
        sum=sum+((3**(len(result)-i-1))*result[i])
        
    return sum
    

방법론적으로 저의 풀이와 정확히 같지만 시간초과없이 해결한 풀이입니다. 그 차이를 살펴본 결과
첫번째 while문에서 n을 0까지 나누는지, 1까지 나누는지 차이였습니다. 🐨🐨🐨

제가 구현한 방식처럼 1까지 나눈 후 마지막 1을 append하는 시간때문에 일부 케이스에서 실패한 것을 보입니다. 수동적으로 직접 append하는 코드를 자제해야겠다고 느꼈습니다.

[다른사람의 풀이2]


def solution(n):
    answer = ''

    while n > 0:			
        n, re = divmod(n,3)	# n을 3으로 나눈 몫과 나머지
        answer += str(re)
    return int(answer, 3)

직접 3진법 연산->10진법 연산을 구현한 저의 풀이와 달리 int('3진법문자열',3) 함수를 통해 바로 10진법으로 구현한 풀이입니다. 파이썬은 쓰기 쉬운 다양한 모듈들이 많기 때문에 이를 알고 활용하는 것도 실력이라고 느낀 케이스였습니다.🐱🐱🐱

감사합니다.

profile
https://github.com/min731

0개의 댓글