본문 바로가기
Python/알고리즘

[COS PRO 1급 #5-6] p진법 to q진법

by 포푸리 (POPOOLY) 2023. 3. 5.
반응형

문제설명

p 진법으로 표현한 수란, 각 자리를 0부터 p-1의 숫자로만 나타낸 수를 의미합니다. p 진법으로 표현한 자연수 두개를 더한 결과를 q 진법으로 표현하려 합니다.

예를 들어, 3진법 수 112001과 12010을 더한 결과를 8진법으로 나타내면 1005입니다.

solution 함수의 매개변수로 p 진법 자연수를 담은 문자열 s1, s2와 두 수를 나타내는 진법의 기수 p, 두 수의 덧셈 결과를 표현할 진법의 기수 q가 매개변수로 주어집니다. p진법으로 표현된 두 수를 더한 결과를 q 진법으로 나타낸 값을 return 하도록 solution 함수를 완성해주세요.

매개변수 설명

p 진법으로 자연수를 담은 문자열 s1, s2와 두 수를 표현한 진법의 기수 p, 두 수의 덧셈 결과를 표현할 진법의 기수 q가 solution 함수의 매개변수로 주어집니다.
* p와 q는 2 이상 10 이하인 자연수입니다.
* s1과 s2의 길이는 1 이상 9 이하입니다.
* s1과 s2의 원소는 '0', '1', '2', …, ‘p-1’로만 구성됩니다.
* s1이나 s2가 ‘0’인 경우는 주어지지 않습니다.

return 값 설명

두 수를 더한 결과를 q 진법으로 나타낸 값을 문자열로 return 하도록 solution 함수를 완성해주세요.

예시

| s1 | s2 | p | q | return |
|-----|-----|---|---|---------|
| "112001" | "12010" | 3 | 8 | "1005" |

예시 설명

문제에 나온 예와 같습니다.

문제 코드

def solution(s1, s2, p, q):
    #여기에 코드를 작성해주세요.
    answer = ''
    return answer

풀이 1

# p진법 s를 10진법 숫자로 바꾸기
def ten(s, p):
	length = len(s)-1
	num = 0
	multiple = 1
	for i in range(length, -1, -1):
		num += int(s[i])*multiple
		multiple *= p
	return num

def solution(s1, s2, p, q):
	answer = ''
    
	# s1과 s2의 합을 10진법으로 구하기
	s1 = ten(s1, p)
	s2 = ten(s2, p)
	s = s1 + s2

	# s과 q진법으로 몇자리인지 구하기
	length = 1
	multiple = q
	while s // multiple > 0:
		length += 1
		multiple *= q
	
	# s를 q진법으로 구하기
	while length > 0:
		multiple /= q
		num = s // multiple
		answer += str(int(num))
		s -= num*multiple
		length -= 1

	return answer

풀이 2

numbers_int = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
numbers_char = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

def char_to_int(ch):
    for i in range(10):
        if ch == numbers_char[i]:
            return numbers_int[i]

def int_to_char(val):
    for i in range(10):
        if val == numbers_int[i]:
            return numbers_char[i]

# num을 q진법으로 바꾸기
def convert_scale(num, q):
    if num == 0:
        return ""
    return convert_scale(num // q, q) + int_to_char(num % q)

# p진법 s를 10진법으로 바꾸기
def parse_decimal(s, p):
    num = 0
    mul = 1
    for s_i in reversed(s):
        num += char_to_int(s_i) * mul
        mul *= p
    return num

def solution(s1, s2, p, q):
    num1 = parse_decimal(s1, p)
    num2 = parse_decimal(s2, p)
    answer = convert_scale(num1 + num2, q)
    return answer

댓글