문제출처 : 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]*m #각 자릿수를 분리해서 계산하기 위해 자릿수 크기의 리스트 생성 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**i 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==3: return 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 |
효율성 테스트까지 통과하고 다른 사람의 풀이를 보니 같은 방식인데 더 짧게 구현한 사람이 역시나 있었다. 흑흑 더 열심히해보자.
'IT > Python' 카테고리의 다른 글
프로그래머스 알고리즘 Lv4 숫자 블록 (0) | 2018.09.07 |
---|---|
프로그래머스 알고리즘 Lv4 3 x n 타일링 (0) | 2018.08.30 |
Python map() 함수에 대해 공부해보자. (0) | 2018.07.26 |
댓글