라떼는말이야
[solved.ac 골드2] 1112_진법 변환 (파이썬, 수학, 구현, 정수론) 본문
밑의 사진을 클릭하면 문제 링크로 이동합니다
문제
우리는 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
초등학생 때인가 중학생 때 배운 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을 출력하면 된다.
나머지가 있는 경우엔 앞서 구한 부호에 따라 출력해주면 된다.
'알고리즘 > 코딩 테스트' 카테고리의 다른 글
[solved.ac 골드4] 1520_내리막 길 (파이썬, DFS, DP) (0) | 2022.07.03 |
---|---|
[solved.ac 실버2] 15886_내 선물을 받아줘 2 (파이썬, 구현) (0) | 2022.07.01 |
[solved.ac 실버1] 1052_물병 (파이썬, 구현, 그리디, 비트마스킹) (0) | 2022.06.30 |
[solved.ac 골드4] 1089_스타트링크 타워 (파이썬, 구현) (0) | 2022.06.29 |
[solved.ac 실버2] 2615_오목 (파이썬, 구현, 브루트포스) (0) | 2022.06.25 |
[solved.ac 골드2] 20210_파일 탐색기 (파이썬, 문자열, 구현) (0) | 2022.06.22 |
[solved.ac 골드2] 2250_트리의 높이와 너비 (파이썬, DFS) (0) | 2022.06.19 |
[solved.ac 실버3] 9440_숫자 더하기 (파이썬, 그리디, 정렬) (0) | 2022.06.17 |