https://www.acmicpc.net/problem/1112
1112번: 진법 변환
우리는 10진수를 사용한다. 10진수는 0부터 9까지 숫자를 사용한다. 12345가 10진수라면, 이 값은 1×104 + 2×103 + 3×102 + 4×101 + 5×100이다. 자 이제 -10진법을 보자. 이 수도 0부터 9까지 숫자를 사용하고,
www.acmicpc.net
문제
입력
첫째 줄에 두 정수 x와 b가 주어진다.
출력
첫째 줄에 문제의 정답을 출력한다.
접근
음수 예제 입력 2를 보면,
8265, -10는 12345의 값이다.
1*(-10)^4 + 2*(-10)^3 + 3*(-10)^2 + 4(-10)^1 + 5(-10)^0
= 10000 - 2000 + 300 - 40 + 5
= 8265
문제는 "divmod" 메소드를 선택하여 활용하였다.
divmod 함수는, 만약에 두번째 파라미터인 r의 값이 음수일 경우, 음수로 해석한다.
즉, divmod(-12345, -10)을 입력했다면, 결과인 몫(q)는 1235, 나머지(r)는 -5로 나온다.
처음에 음수 진수에 대한 접근의 이해가 힘들었다.
검산을 같이 해보면 이해가 더 수월한데,
ex) 10진수 -12345를 -10진수로 바꾸는 과정
(-12345) / (-10) = 1235 나머지 5 (검산: 1235 * (-10) + 5 = -12345)
1235 / (-10) = -123 나머지 5 (검산: (-123) * (-10) + 5 = 1235)
(-123) / (-10) = 13 나머지 7 (검산: 13 * (-10) + 7 = -123)
13 / (-10) = -1 나머지 3 (검산: (-1) * (-10) + 3 = 13)
(-1) / (-10) = 1 나머지 9 (검산: 1 * (-10) + 9 = -1)
1 / (-10) = 0 나머지 1 (검산: 0 * (-10) + 1 = 1)
결과 : 193755
그렇다면, divmod 함수를 사용하여 적용해보자.
divmod(-12345, -10)의 결과값은 1234, -5이다.
그러면 -, - 부호일 경우에는 몫(q)에 +1 을 해주고, 나머지인 -5는 -부호를 +로 바꿔서 5로 해준다.
divmod(-1235, -10)의 결과값은 -124, -5이다.
동일하게 몫(q)에 +1을 해주고, 나머지가 -이면, +로 바꿔준다. 즉, 받은 진수값을 빼주면 된다. (-5-(-10) = 5)
divmod(-123, -10)의 결과값은 12, -3이다.
몫(q) 12+1 = 3, -3-(-10) = 7
divmod(13, -10)의 결과값은 -2, -7이다.
몫(q) -2 + 1 = -1, -7-(-10) = 3
divmod(-1, 3)의 결과값은 0, -1이다.
0+1, -1-(-10) = 9
divmod(1, 9)의 결과값은 -1, -9이다.
-1+1 = 0, -1-(-10) = 1
즉, (0, 1)이 되어서, while문의 loop가 멈춘다.
그러면 result 의 값을 매번 나머지(r)의 값을 넣었기 때문에,
[5, 5, 7, 3, 9, 1] 값이 된다.
reverse 처리 해주고, 값을 다 붙여서 출력해준다.
그러나, 아래와 같이 처리를 해주면 결과값이 음수가 나올 때, 값이 제대로 나오지 않는다.
import sys
x, b = map(int, sys.stdin.readline().split())
n = 0
result = []
while(x):
q, r = divmod(x, b)
if(r < 0):
r -= b
q += 1
result.append(r)
x = q
result.reverse()
print(result)
추가로 처리해주어야 하는 것은,
x가 음수인데, b가 양수인 경우에는 마지막 값에 음수를 붙여줘야 한다.
코드
import sys
x, b = map(int, sys.stdin.readline().split())
n = 0
result = []
flag = 0
if(x < 0 and b > 0):
x *= -1
flag = 1
while(x):
q, r = divmod(x, b)
if(r < 0):
r -= b
q += 1
result.append(r)
x = q
if not result:
result.append(0)
result.reverse()
if(flag):
result[0] *= -1
print(''.join(map(str, result)))