프로그래머스 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진법으로 구현한 풀이입니다. 파이썬은 쓰기 쉬운 다양한 모듈들이 많기 때문에 이를 알고 활용하는 것도 실력이라고 느낀 케이스였습니다.🐱🐱🐱
감사합니다.