안녕하세요, 반갑습니다!
간단한 사칙연산 문제입니다.
문제
두 정수 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()}")
}
이렇게 코드를 수정해주니 이제서야 정확한 출력이 나오게 됐습니다.
가끔 값의 자료형을 변경해주고 계산을 하는 경우와 계산을 한 다음에 자료형을 바꿔야 하는 경우가 심심치않게 있습니다.
그런 문제들에 대비해 비록 사칙연산이라는 가벼운 문제지만 기본을 확실히 해둔다면, 헤매는 일은 없을 것입니다.
저는 이번 기회에 백준 문제 좀 풀어봐야겠어요.
감사합니다!
반응형