라떼는말이야

[solved.ac 골드2] 1112_진법 변환 (파이썬, 수학, 구현, 정수론) 본문

알고리즘/코딩 테스트

[solved.ac 골드2] 1112_진법 변환 (파이썬, 수학, 구현, 정수론)

MangBaam 2022. 6. 26. 05:15
반응형

밑의 사진을 클릭하면 문제 링크로 이동합니다

제한 사항

문제

우리는 10진수를 사용한다. 10진수는 0부터 9까지 숫자를 사용한다. 12345가 10진수라면, 이 값은 $$1*10^{4}+2*10^{3}+3*10^{2}+4*10^{1}+5*10^{0}$$이다.

자 이제 -10진법을 보자. 이 수도 0부터 9까지 숫자를 사용하고, -10진수 12345는, $$1*(-10)^{4}+2*(-10)^{3}+3*(-10)^{2}+4(-10)^{1}+5(-10)^{0}$$이다. 따라서, 10진법으로는 10000-2000+300-40+5 = 8265가 된다.

어떤 수를 음의 진법으로 나타내는 방법도 항상 일정하다. 음의 진법이 신기한 이유는 음수를 나타내는데 –가 필요 없기 때문이다. 예를 들어, -10진법에서, 10진수 -1은 19로 나타내면 되고, 10진수 -2는 18로 나타내면 된다.

10진수 x를 b진법으로 바꾸는 프로그램을 작성하시오. 음의 진법일 때는 음수를 나타낼 때 -부호가 있으면 안 된다.

입력

첫째 줄에 두 정수 x와 b가 주어진다.

출력

첫째 줄에 문제의 정답을 출력한다.

제한

  • -1,000,000,000 ≤ x ≤ 1,000,000,000
  • 2 ≤ |b| ≤ 10

예제


나의 풀이

부호 미리 구하기

주어진 진법으로 변환 후 각 자리 수는 음수가 올 수 없다. 문제에서 알려준대로 음수 진법으로 변환하는 경우에는 마이너스 기호(-) 없이도 음수를 표현할 수 있다고 했다. 하지만 양수 진법으로 음수를 나눈 결과에는 마이너스 기호(-)가 표시되어야 수를 표현할 수 있다. (예를 들어 10진법으로 음수를 나타내기 위해서는 마이너스 기호가 필요하다)

그래서 마지막 출력 시에 마이너스 기호를 붙일지 말지 결정하기 위해 (바꿀 진법이 음수)이거나 (바꿀 진법이 양수이면서 바꿀 수가 양수)인 경우에는 positive = True를 하고, 그 외에는 positive = False로 하여 미리 부호를 구해놓았다.

num, n = map(int, input().split())
positive = n < 0 or (n >= 0 and num >= 0)
if not positive: num *= -1

positive가 False인 경우 양수로 계산하여 마지막에 마이너스 기호만 붙이면 되니까 num을 양수로 만들고 다음 작업을 수행했다.

진법 변환

remain = []
while num:
    q, r = divmod(num, n)
    if r < 0:
        q += 1
        r -= n
    remain.append(r)
    num = q

출처: http://www.tcpschool.com/codingmath/notation

초등학생 때인가 중학생 때 배운 10진수를 n진법으로 만드는 방법을 그대로 사용했다.

만약 n이 음수라서 나머지가 음수로 나온다면 몫을 하나 올리고, 나머지를 n만큼 빼서 양수로 만들어주면 된다. 이때 나오는 나머지들을 리스트에 저장한다.

정답 출력하기

result = ''.join(map(str, remain[::-1]))
if remain:
    print(result) if positive else print(f'-{result}')
else:
    print(0)

remain에 저장된 나머지들을 역순으로 뒤집은 후 하나의 문자열로 만들어서 result에 저장했다.

만약 0을 다른 진법으로 변경하려고 했을 때 변환 과정에서 생기는 나머지가 없다. 이 경우에는 0을 출력하면 된다.

나머지가 있는 경우엔 앞서 구한 부호에 따라 출력해주면 된다.

 

채점 결과

 

반응형
Comments