문제 출처 : https://programmers.co.kr/learn/courses/30/lessons/17687
2020년 12월 23일 풀었던 기록이 있었다.. 다시 열어보니 가관이더라
def solution(n, t, m, p):
answer = ''
tmp=''
num=0
while(len(tmp)<t*m):
tmp+=getover10NotaNum(num,n)
num+=1
for i in range(t):
answer+=tmp[m*i+p-1]
return answer
def getover10NotaNum(num,nota):
ans=""
over="ABCDEF"
if num<nota:
tt=int(num%nota)
if tt>=10:
ans+=over[tt-10]
else:
ans+=str(tt)
else:
while num>=nota:
tt=int(num%nota)
if tt>=10:
ans+=over[tt-10]
else:
ans+=str(tt)
num=num/nota
ans+=str(int(num))
tmp=""
for i in range(len(ans)):
tmp+=ans[len(ans)-i-1]
return tmp
보면, 일단 충분한 만큼 tmp라는 곳에 N진수로 수를 더해가며 구한 문자열을 더해준다.
그리고, 최종적으로 answer에 순서에 맞게 점프점프하며 answer에 문자열을 더해넣어준다.
그러나 위 문제풀이의경우 정답률이 57%에 불과했다.
getover10NotaNum()함수가 틀리지는 않았다. 제역할을 충분히 잘 하고있다.
그러므로 잘못된 부분은 마지막에 최종적으로 정답을 만드는 부분이라고 생각된다.
일단 뭐 오늘 새로 풀면서 다시 풀어서 전부 맞추게되었으니.. 아래 코드와 같이 풀었다 .
import sys
sys.setrecursionlimit(1000000)
def solution(n,t,m,p):
def getdiv(n, div):
words = "0123456789ABCDEF"
ans=""
tmp=[]
while n>=div:
tmp.append(words[divmod(n,div)[1]])
n=divmod(n,div)[0]
tmp.append(words[divmod(n,div)[1]])
return ''.join(tmp[::-1])
start=0
tmp = ''
while len(tmp)< (t)*(m+1) :
tmp += getdiv(start,n)
start+=1
answer = ""
idx = p-1
while len(answer) < t :
answer+=tmp[idx]
idx += m
return answer
훨씬 한눈에 보여서 좋다..
아마도 언젠가 다시볼때 또 이게뭐람.. 이럴수도있겠지.
풀이는 기존과 비슷하다.(사람머리는 안바뀐다는건가 싶다..) 다만 다른점은 tmp에서 최종 answer를 구하는 과정인데
여기서 idx를 만든 후, 만족할때까지 idx에 m(참가인원수)를 더해줬다. 배수로 더해져가며 원하는 정답을 만들어주는데 한눈에 보이기에 간결하고 맘에든다.