본문 바로가기
스터디(beakjoon)

Kotlin] 백준 15128번 문제 풀이

by 김마리님 2024. 5. 17.

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

 

더보기

이 문제는 (다른 언어는 모르겠는데) 자바 코틀린은 부동소수점 문제로 인해 걸린다. 그래서 실수 연산에서 걸리게 된다.

 

(부동 소수점 문제에 대한 글)

https://www.acmicpc.net/blog/view/37

 

그래서 double을 쓰게 되면 실수연산에 걸려 문제가 터진(?)다.

그럼 코틀린에서 부동소수점 연산의 오류를 피하게 되는 방법이 뭐인가?

1. 연산의 순서를 바꾸어 실수 연산의 가능성 줄이기

2. double 대신 long 쓰기

 

long과 double의 차이를 보자.

 

Long 타입

- 정수형 : Long은 64비트 정수형 데이터 타입. 부호가 있는 경우 +- 2^63의 범위를 가짐.

- 정밀도 : Long은 정수이기 때문에 64비트 내에서 정확하게 표현됨. 즉, 오차가 발생하지 않음.

- 사용 사례 : 정수 연산, 인덱스 계산, 고정된 정밀도를 요구하는 금융 계산 등에서 사용됨.

 

Double 타입

- 부동소수점형: Double은 64비트 부동소수점 데이터 타입 IEEE 754 표준에 따라 실수를 표현.

- 정밀도: Double은 소수점 이하를 포함한 실수를 표현할 수 있지만, 정밀도는 유한함. 일부 값은 근사치로 표현되므로 연산 시 오차 발생 가능성 있음.

- 사용 사례: 실수 계산, 과학적 계산, 비율 계산 등에서 사용. 특히, 매우 숫자나 매우 작은 숫자를 다룰  사용.

 

왜 Long이 부동소수점 문제에서 자유로운가?

부동소수점 문제는 실수를 표현할 나타나는 근사치 문제이기 때문이다. 예를 들어, 0.1 2진수로 정확하게 표현할 없기 때문에 컴퓨터는 이를 근사치로 저장하고, 이러한 근사치 때문에 연산 오차가 발생할 있다. 반면, Long 타입은 정수만을 정확하게 표현하므로 이러한 근사치 문제에서 자유롭다.

 

따라서 Long을 통해 문제를 해결하면 편하다.

따라서,

import java.math.BigDecimal

fun main(args: Array<String>) {
    question15128()
}

fun question15128() {
    val input = readln().split(" ").map { it.toLong() }
    val p1 = input[0]
    val q1 = input[1]
    val p2 = input[2]
    val q2 = input[3]

    val numerator = p1 * p2
    val denominator = 2 * q1 * q2

    if (numerator % denominator == 0L) {
        println(1)
    } else {
        println(0)
    }
}

 

 

ㅋㅋ 부동소수점 문제인지 몰라서 터진 흔적,,,

 

반응형

'스터디(beakjoon)' 카테고리의 다른 글

Kotlin] 백준 1158번 풀이  (0) 2024.09.01
Kotlin] 백준 2606 풀이  (0) 2024.05.23
Kotlin] 백준 11282번 풀이  (0) 2024.05.14
Kotlin] 백준 14928번 문제 풀이  (0) 2024.04.29
Kotlin] 백준 1271번 풀이  (0) 2024.04.25