컴퓨터 공부/📚 Baekjoon(백준)

[백준/알고리즘/python/java] 16428번 - A/B - 3

letzgorats 2021. 7. 2. 02:31

이미지를 누르면 문제링크를 보실 수 있습니다.
이미지를 누르면 문제링크를 보실 수 있습니다.
이미지를 누르면 문제링크를 보실 수 있습니다.

이미지를 누르면 문제링크를 보실 수 있습니다.

이미지를 누르면 문제링크를 보실 수 있습니다.
이미지를 누르면 문제링크를 보실 수 있습니다.

굉장히 단순한 문제인데, 정답률이 그에 비해선 막 높진 않아서 풀어본 문제다.

처음엔 나 역시 틀렸다. 

다시한번, 써가면서 풀어봤는데, 특징이 있었다. 

A가 나누어지는 수이고 B가 나누는 수라고 할 때,

1) 단순히 A, B둘다 양수라고 생각하면, 몫은 A//B 가 되고, 나머지는 A%B 가 될 것이다.

2) A가 음수이고 B가 양수라면, 역시 몫은 A//B 가 되고, 나머지는 A%B 가 될 것이다.

3) A가 0이면, B가 뭐든간에, 몫과 나머지는 둘 다 0 이 나올것이다.

여기까진 그냥 우리가 생각하는 수학이다.

 

4) A가 음수이고 B가 음수라면,

5) A가 양수이고 B가 음수라면,

즉, 나누는 수 B가 음수라면, 값이 달라졌다. 나머지는 양수여야 하는데, 그대로 A%B를 나머지로 해버리면, 음수가 나와버리기 때문이다.

 

규칙이 있었다. B가 음수라면, A가 양수든 음수든 몫은 (A//B + 1) 이 된다. 나머지를 양수로 만들려면 몫을 더 증가시켜야만 하기 때문이다.

그럼, 나머지는 어떻게 될까? 몫이 1 증가되었으니까, 그만큼을 다시 나누는 수 B 와 곱한다음 나눠지는수 A에서 빼면 됐다.

풀었던 코드는 아래와 같다.

import sys
input = sys.stdin.readline
a, b = map(int, input().split())
c, d = a//b, a % b
if a != 0 and b < 0:  # a가 0이 아니고 b가 음수이면,
    print(c+1)
    print(a-(c+1)*b)
else:  # 나머지는 그냥 일반 수학문제 푸는 것처럼 생각하면 된다.
    print(c)
    print(d)

구글링을 하다가, divmod라는 내장함수가 파이썬에 있다는 것을 알게 되었다. 그냥 있다고만 알아둬라.

 

divmod는 두 숫자를 인자로 전달 받아 첫번째 인자를 두번째 인자로 나눈 몫과 나머지를 tuple 형식으로 반환한다. 

divmod를 활용한 코드는 아래와 같다.

a, b = map(int, input().split())
c, d = divmod(a, b)
if a != 0 and b < 0:
    c, d = c+1, d-b
print(c)
print(d)

 

나는 몫이 1 증가되었으니까, 그만큼을 다시 나누는 수 B 와 곱한다음 나눠지는수 A에서 뺌으로써 나머지를 구했는데, 생각해보면, 원래 나머지(A%B)=d 에서 나누는 수(B)를 그냥 빼도(-) 같은 효과가 반영됐다. (d - b) 

반응형