PS(Problem Solving)/BOJ

[백준/BOJ] 16428번: A/B - 3

JunsuKim 2021. 11. 9.
728x90

https://www.acmicpc.net/problem/16428

 

16428번: A/B - 3

첫째 줄에 A와 B가 주어진다. (-1010000 ≤ A, B ≤ 1010000, B ≠ 0)

www.acmicpc.net

문제

두 정수 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이라 하자.

  1. a, b가 양수일 때
    -> 몫: 2, 나머지: 1로 답과 일치
  2. a는 양수, b는 음수일 때
    -> 몫: -2, 나머지: 1로 답과 일치
  3. a는 음수, b는 양수일 때
    -> 몫: -2, 나머지: -1이 출력되었으나, 답은 몫: -3, 나머지: 2이다.
  4. 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

댓글