상상하라 그리고 현실로 만들어라.

상상하는 모든 것이 미래다.

알고리즘 문제풀이

[백준] 사칙연산 문제 A / B 풀기, 그리고 실수

월터제이(Walter J) 2021. 1. 13. 11:31

안녕하세요, 반갑습니다!

간단한 사칙연산 문제입니다.


문제

두 정수 A와 B를 입력받은 다음, A/B를 출력하는 프로그램을 작성하시오.

 

입력

첫째 줄에 A와 B가 주어진다. (0 < A, B < 10)

 

출력

첫째 줄에 A/B를 출력한다. 실제 정답과 출력값의 절대오차 또는 상대오차가 10-9이하이면 정답이다.

 

예제 1

입력 : 1 3				//출력 : 0.33333333333333333333333333333333

 

 

예제2

입력 : 4 5				//출력 : 0.8

 


정말 쉬운 문제죠?

그런데, 첫 시도에 틀렸습니다!

아니 왜??? 하고 잠시 고민했었지만, 곧 이유를 알 수 있었습니다.

먼저 틀린 제 풀이를 보시죠.

fun main() {
    //한 줄로 들어오는 값을 공백으로 구분, 배열로 저장된다
    val input = readLine()!!.split(" ").map { it.toInt() }
    
    //input 배열에 저장된 값을 꺼내 나누고 double 형으로 바꾼다.
    print("${(input[0]/input[1]).toDouble()}")
}

 

신경써야할 부분이었지만, 쉬운문제라 생각하고 대충 푼 것이 화근이었습니다.

 

네, 맞습니다.

정수와 정수를 나누면 당연히 출력은 정수로 출력됩니다.

1 / 3 을 하면 소수점은 모두 버려지고 정수 0이 되는 것이죠.

 

이미 소수점을 버린 Int형 숫자 0을 double형으로 바꾼다고 해서 0.3 이 되지 않습니다.

 

그래서 받아온 값을 소수점으로 변환해야 하는 과정이 우선이 되어야 했습니다.

1은 1.0 으로, 3은 3.0 으로 말이죠.

 

fun main() {
    var input = readLine()!!.split(" ").map { it.toInt() }
    
    //각 값을 double형으로 변경
    print("${input[0].toDouble()/input[1].toDouble()}")
}

 

이렇게 코드를 수정해주니 이제서야 정확한 출력이 나오게 됐습니다.

 

가끔 값의 자료형을 변경해주고 계산을 하는 경우와 계산을 한 다음에 자료형을 바꿔야 하는 경우가 심심치않게 있습니다.

그런 문제들에 대비해 비록 사칙연산이라는 가벼운 문제지만 기본을 확실히 해둔다면, 헤매는 일은 없을 것입니다.

 

저는 이번 기회에 백준 문제 좀 풀어봐야겠어요.

감사합니다!

반응형