이미지를 누르면 문제링크를 보실 수 있습니다.
굉장히 단순한 문제인데, 정답률이 그에 비해선 막 높진 않아서 풀어본 문제다.
처음엔 나 역시 틀렸다.
다시한번, 써가면서 풀어봤는데, 특징이 있었다.
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)
'컴퓨터 공부 > 📚 Baekjoon(백준)' 카테고리의 다른 글
[백준/알고리즘/python/java] 11000번 - 강의실 배정 (0) | 2022.02.06 |
---|---|
[백준/알고리즘/python/java] 1417번 - 국회의원 선거 (0) | 2021.07.02 |
[백준/알고리즘/python/java] 18870번 - 좌표 압축 (0) | 2021.07.01 |
[백준/알고리즘/python/java] 1764번 - 듣보잡 (0) | 2021.06.25 |
[백준/알고리즘/python/java] 2164번 - 카드2 (0) | 2021.06.25 |