본문 바로가기

코딩테스트/프로그래머스

코딩테스트 연습 2018 KAKAO BLIND RECRUITMENT [3차] n진수 게임

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

Solution

def toN(number, N):
    s= ""
    while True:
        if number < 1 :
            break
        
        if number % N == 10:
            s += 'A'
        elif number % N == 11:
            s += 'B'
        elif number % N == 12:
            s += 'C'
        elif number % N == 13:
            s += 'D'
        elif number % N == 14:
            s += 'E'
        elif number % N == 15:
            s += 'F'
        else:
            s += str(number % N)
        
        number = number // N
    
    return s[::-1]
    

def solution(n, t, m, p):
    """
    0 1 1 0 1 1 1 0 0 
    """
    st = "0"
    i=0
    while True:
        if len(st) >= 100000:
            break
        st += toN(i, n)
        i+=1
        
    answer = ""
    i=0
    while True:
        if t <= len(answer):
            return answer
        if i % m == p-1:
            answer+=st[i]
        i+=1

진법 게임에서 참가자들이 숫자를 말하는 순서를 계산해야 한다. 게임에 사용되는 진법, 구해야 할 숫자 개수, 참가자 수, 튜브의 순서가 주어지며, 숫자를 출력해야 한다. 문제는 튜브가 말해야 하는 숫자를 찾는 것이다.
한 문제에서 N진법 변환을 두 번 하는듯한 문제였다. 엄청 어려운 느낌은 아니었지만 진법 구하는 문제에 대해 익숙하지 않았더라면 꽤 오래걸렸을것 같다.

 

Attempt (len(st) >= 16000)

def toN(number, N):
    s= ""
    while True:
        if number < 1 :
            break
        
        if number % N == 10:
            s += 'A'
        elif number % N == 11:
            s += 'B'
        elif number % N == 12:
            s += 'C'
        elif number % N == 13:
            s += 'D'
        elif number % N == 14:
            s += 'E'
        elif number % N == 15:
            s += 'F'
        else:
            s += str(number % N)
        
        number = number // N
    
    return s[::-1]
    

def solution(n, t, m, p):
    """
    0 1 1 0 1 1 1 0 0 
    """
    st = "0"
    i=0
    while True:
        if len(st) >= 16000:
            break
        st += toN(i, n)
        i+=1
        
    # print(st)
    answer = ""
    i=0
    while True:
        if t <= len(answer):
            return answer
        if i % m == p-1:
            answer+=st[i]
        # print("i", i, "m", m, "p", p)
        i+=1

처음 t의 최대 길이와 p의 최대 길이를 대략 16000정도로 잡으면 맞겠다 싶었는데, 생각보다 런타임 에러가 많이났다. 넉넉잡아 10만 이상 for문을 돌리는 것으로 쉽게 해결했다.