[백준] 받아올림 (4388)(kotlin)
문제 설명
입력 및 출력
» 입력
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 10자리 이내의 양의 정수 또는 0이 주어진다. 입력의 마지막 줄에는 0 0이 있다.
» 출력
각 테스트 케이스에 대해서, 입력으로 주어진 두 수를 더할때 나오는 받아올림의 개수를 출력한다.
예제 입출력(테스트케이스)
입력 | 출력 |
---|---|
123 456 555 555 123 594 0 0 |
0 3 1 |
문제 풀이1
import java.io.BufferedReader
import java.io.InputStreamReader
fun main(args: Array<String>) = with(BufferedReader(InputStreamReader(System.`in`))) {
while (true) {
var (a, b) = readLine().split(" ").map { it.reversed() }
//두 String a("1")와 b("123456"를 revered로 받음
//ex) "1" "123456" -> "1" "654321"
if (a == "0" && b == "0") break
//입력으로 "0" "0"이 들어오면 종료
when {
a > b -> {
b += "0".repeat(a.length - b.length)
}
b > a -> {
a += "0".repeat(b.length - a.length)
}
}
//a(String)과 b(String)중 긴 length를 가진 것에 맞추어 짧은 String에 오른쪽으로 0을 채움(추가)
//ex) "1" "654321" -> "100000" "654321"
var carryCount = 0
//carry가 몇 번 일어나는지 카운트할 변수 초기화
var carry = false
//carry가 발생했을 경우 사용할 flag
for (i in a.indices) {
//정상적인 덧셈 계산에서는 가장 작은 수인 제일 오른쪽부터 덧셈을 하지만
//위 a, b입력에서 reversed로 받았으므로 가장 왼쪽부터 계산시작
if (carry) {
//이전 연산에서 carry가 발생하였을 경우
if (1 + a[i].toInt() + b[i].toInt() - 96 > 9) {
//두 수(0~9의 범위를 가지는)의 덧셈에서 발생할 수 있는 최대 carry는 1이므로
//1(carry) + 두 수(a[i] + b[i]_를 더해 9를 초과하는지 확인하고
//초과한 경우 carry를 유지(carry 상태 변화없음)
carryCount++
//carryCount에 1을 올림
} else {
//1(carry) + 두 수(a[i] + b[i]_를 더해 9 미만일 경우
//carry를 false로 바꿈
carry = false
}
} else {
//이전 연산에서 carry가 발생하지 않은 경우
if (a[i].toInt() + b[i].toInt() - 96 > 9) {
//두 수(a[i] + b[i])를 더한 값이 9를 초과한 경우
carry = true
//carry를 true로 바꿈
carryCount++
//carry가 생겼으므로 carryCount에 1을 올림
}
}
}
println(carryCount)
//carryCount를 출력
}
}