728x90
https://www.acmicpc.net/problem/16428
문제
두 정수 A와 B를 입력받은 다음, A/B의 몫과 나머지를 출력하는 프로그램을 작성하시오.
어떤 정수 q와 r에 대해 A = qB + r (0 ≤ r < |B|)로 나타낼 수 있을 때, q를 몫, r을 나머지라고 한다.
해설
처음에 시도했을 때는 그저 BigInteger를 사용하여 두 값의 몫과 나머지를 구하면 될 줄 알았다.
하지만 이렇게 시도했을 때 모든 서브태스크를 만족시키지 못해 만점을 받을 수 없었다.
이유를 찾아보니 음수가 있으면 나눗셈을 하는데 몫과 나머지가 다르게 나오기 때문이었다.
-7과 3을 입력했을 때 답으로 몫: -3, 나머지: 2가 나와야 하지만 컴파일 결과는 몫: -2, 나머지: -1이 나온다.
이를 해결하기 위해 a와 b의 양수, 음수인지에 따른 정답 여부를 확인했다.
a는 7 or -7이라 하고 b는 3 or -3이라 하자.
- a, b가 양수일 때
-> 몫: 2, 나머지: 1로 답과 일치 - a는 양수, b는 음수일 때
-> 몫: -2, 나머지: 1로 답과 일치 - a는 음수, b는 양수일 때
-> 몫: -2, 나머지: -1이 출력되었으나, 답은 몫: -3, 나머지: 2이다. - a, b가 음수일 때
-> 몫: 2, 나머지: -1이 출력되었으나, 답은 몫: 3, 나머지: 2이다.
어떻게 해결해야 할지 고민을 하던 중 최선의 방법이라고는 못하겠지만 답과 일치하지 않는 경우에 대해 몫을 먼저 구해주고 그에 따른 나머지를 계산하게 하였다.
따라서 1, 2번의 케이스에는 몫과 나머지를 그대로 계산하지만, 3번의 케이스에는 몫 - 1을 한 후 나머지를 계산하고, 4번의 케이스는 몫 + 1을 한 후 나머지를 계산하였다.
* 이와 다른 방법이 있다면 알려주시면 감사하겠습니다.
소스 코드
import java.math.BigInteger
fun main(){
val input = readLine()!!.split(" ")
val a = BigInteger(input[0])
val b = BigInteger(input[1])
val div = a.divide(b)
val rem = a.remainder(b)
if(a < BigInteger.ZERO && a != BigInteger.ZERO && b > BigInteger.ZERO){
val divide = div.subtract(BigInteger.ONE)
val remain = a.subtract(b.multiply(divide))
println("${divide}\n${remain}")
}
else if(a < BigInteger.ZERO && a != BigInteger.ZERO && b < BigInteger.ZERO){
val divide = div.add(BigInteger.ONE)
val remain = a.subtract(b.multiply(divide))
println("${divide}\n${remain}")
}
else println("${div}\n${rem}")
}
728x90
'PS(Problem Solving) > BOJ' 카테고리의 다른 글
[백준/BOJ] 2439번: 별 찍기 - 2 (0) | 2021.11.10 |
---|---|
[백준/BOJ] 2061번: 좋은 암호 (0) | 2021.11.09 |
[백준/BOJ] 2438번: 별 찍기 - 1 (0) | 2021.11.08 |
[백준/BOJ] 1009번: 분산처리 (0) | 2021.11.08 |
[백준/BOJ] 1712번: 손익분기점 (0) | 2021.11.05 |
댓글