본문 바로가기

카테고리 없음

[BEAKJOON] 백준 1112번 : 진법 변환 - 파이썬

반응형

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

 

 

출처 : 코딩팩토리 - https://coding-factory.tistory.com/652

 

문제는 "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)))

 

반응형