[프로그래머스] N진수 게임 문제풀이 python

mauz·2022년 6월 29일
0

🐒 문제

https://programmers.co.kr/learn/courses/30/lessons/17687

✍ 나의 풀이

def basechange(i,n):
    nbase = ''
    while i:
        if i%n > 9:
            nbase += chr(55+(i%n))
        else:
            nbase += str(i%n)
        i //=n
    return nbase[::-1]

def solution(n, t, m, p):
    answer = ''
    game = '0'
    number = 1
    
    while len(answer) != t:
        answer = ''
        game += basechange(number,n)
        number += 1

        for i in game[p-1::m]:
            answer += i
        answer = answer[:t]
        
        
    return answer

어려운데 재밌던 문제


🧠 문제 이해

구현하고자 했던 코드는

0부터 x까지 각 숫자를 n진법으로 나타내어
각 자릿수를 붙여서 문자열을 만들고
문자열을 m간격으로 잘라서
잘라낸 문자열의 p-1번째 인덱스를 t개 뽑아내어 리턴.

(필자는 x를 구하는 법을 모르겠음)


처음 코드 (오답)

def solution(n, t, m, p):
    game = '0' 		# 0 부터 x까지 각 숫자를 n진법으로 나타내어 붙여 저장할 문자열 
    for i in range(1,100000):	
    	# 0부터 시작하면 오류가 발생해서 1부터 시작
        	# 위에서 서술했듯 x를 몰라서 십만정도 넣으니깐 몇몇 테스트케이스는 풀렸다.
    	
        nbase = ''
        while i:
            if i%n > 9:
                nbase += chr(55+(i%n))
                	# 11진법 이상에서 10 이상의 수를 나타낼때 알파벳을 이용한다.
                	# 아스키코드에서 65부터 'A'인점을 이용했다. 
            else:
                nbase += str(i%n)
            i //=n
        game += nbase[::-1]
    
    arr = []
    while game:
        arr.append(game[:m])
        game = game[m:]
    
    answer = ''
    for i in arr:
        answer += i[p-1]
    return answer[:t]

x를 구할 수 없으니
while문으로 0부터 x까지 1씩 증가시키면 될 것 같다고 생각해서 다시 코드를 짰다.


두번째 코드 (시간초과)

def basechange(i,n):	# 진법 변환하는 부분을 따로 함수로 꺼냈다.
    nbase = ''
    while i:
        if i%n > 9:
            nbase += chr(55+(i%n))
        else:
            nbase += str(i%n)
        i //=n
    return nbase[::-1]

def solution(n, t, m, p):
    answer = ''
    game = '0'
    number = 1
    
    while len(answer) != t:
        answer = ''
        game += basechange(number,n)
        number += 1
        arr = []
        tmp = game[:]
        
        while tmp:
            arr.append(tmp[:m])
            tmp = tmp[m:]

        for k in arr:
        	# m개 간격으로 잘라낸 문자열에서 p-1번째 인덱스가 존재하지 않는 경우가 있어서 인덱스 에러가 발생했다.
            	# 인덱스 에러를 피하기위해서 try-except문을 이용했다.
            try:
                answer += k[p-1]
            except:
                pass
                
        answer = answer[:t]
        
        
    return answer

정답에 가까워졌지만

위 결과처럼 14,15,16 테케에서 시간초과가 발생한다.

문자열을 m개 간격으로 잘라내어 arr배열에 저장하고 arr배열를 돌면서 p-1번째 인덱스를 꺼내서 저장하는 부분에서

시간초과가 발생했을 것 같아서 수정했다.


세번째 코드 (성공)

def basechange(i,n):
    nbase = ''
    while i:
        if i%n > 9:
            nbase += chr(55+(i%n))
        else:
            nbase += str(i%n)
        i //=n
    return nbase[::-1]

def solution(n, t, m, p):
    answer = ''
    game = '0'
    number = 1
    
    while len(answer) != t:
        answer = ''
        game += basechange(number,n)
        number += 1

        for i in game[p-1::m]:
            answer += i
        answer = answer[:t]
        
        
    return answer
profile
쥐구멍에 볕드는 날

0개의 댓글