반응형
문제설명
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
댓글