[프로그래머스] LEVEL2 n진수 게임 (Python)

Loopy·2021년 7월 14일
3

프로그래머스

목록 보기
16/32
post-thumbnail

[프로그래머스] LEVEL2 n진수 게임


🧐 문제 설명


😍 나의 풀이

처음에는 문제에서 입력 사항이 많아서 헷갈렸는데 어려운 문제는 아니었다.

1. 0에서부터 목표하는 숫자까지 n진법으로 변환해서 문자열 리스트에 저장해둔다

→ 목표하는 숫자의 최대 range는 게임 참가 인원(m), 미리 구해놓을 수(t) 만큼만 확보해놓으면 그 안에서 처리할 수 있다. 0~8까지 구한다고 했을 때, 2진수가 되면 0~1000 이렇게 늘어나니까 이보다 적게 필요하기도 함. 최대가 m*t.

2. 변환한 리스트에서 튜브 순서에 해당하는 인덱스 값의 원소들만 뽑아오면 정답

→ 튜브 순서는 주어졌고, 리스트니까 인덱스는 (튜브 순서 - 1). 이 후 사람 수(m)만큼 인덱스를 증가시키면 튜브 순서에 해당하는 인덱스 값이다. 미리 구해놓을 수의 갯수만큼 출력이 되면 종료하면 된다.

로직은 상당히 간단한데 파이썬에서 n진수 → 10진수 변환은 int를 사용하고 10진수 → 2,8,16진수로의 변환은 bin, oct, hex와 같은 내장함수가 있어서 10진수 → n진수로의 변환도 간단한 방법이 있을 줄 알았는데 파이썬에서도 이 방법은 직접 구현해야했다.

def convert(num, base):
    temp = "0123456789ABCDEF"
    q, r = divmod(num, base)

    if q == 0:
        return temp[r]
    else:
        # q를 base로 변환
        # 즉, n진수의 다음 자리를 구함
        return convert(q, base) + temp[r]
    
def solution(n, t, m, p):
    answer = ''
    test = ''
    
    for i in range(m*t):
        test += str(convert(i, n))
        
    while len(answer) < t:
        answer += test[p-1]
        p += m
        
    return answer

👏다른 사람의 풀이

대부분 비슷하게 재귀함수를 이용해서 10진수를 n진수로 변환하는 함수를 만들어서 풀이했다. 진법 문제는 자주 나오니까 잘 활용할 수 있도록 익혀둬야겠다.

    #재귀함수 이용 - 10진수를 n진수로
    def convert(n, base):
        arr = "0123456789ABCDEF"
        q, r = divmod(n, base)
        if q == 0:
            return arr[r]
        else:
            return convert(q, base) + arr[r]

🥇 Today I Learn

진법 변환 In Python

n진수 → 10진수

  • int(string, base)
print(int('111',2))	#7
print(int('222',3))	#26
print(int('333',4))	#63
print(int('444',5))	#124
print(int('555',6))	#215
print(int('FFF',16)) 	#4095

10진수 → 2,8,16진수

  • 2, 8, 16진수는 bin(), oct(), hex() 함수를 지원
print(bin(10))	#0b1010
print(oct(10))	#0o12
print(hex(10))	#0xa
  • 0b는 2진수, 0o는 8진수, 0x는 16진수를 의미
  • 앞의 진법 표시를 지울려면 [2:]를 하면 됨

10진수 → n진수

def convert(num, base):
    temp = "0123456789ABCDEF"
    q, r = divmod(num, base)

    if q == 0:
        return temp[r]
    else:
        # q를 base로 변환
        # 즉, n진수의 다음 자리를 구함
        return convert(q, base) + temp[r]
profile
공부 쫌 해!!!😂

0개의 댓글