문제 출처 : 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(참가인원수)를 더해줬다. 배수로 더해져가며 원하는 정답을 만들어주는데 한눈에 보이기에 간결하고 맘에든다.

+ Recent posts