백준 코딩테스트 연습/실버
[백준] 1789번 수들의 합 (Kotlin,코틀린)
KwakEuiJin
2023. 2. 14. 21:20
문제
서로 다른 N개의 자연수의 합이 S라고 한다. S를 알 때, 자연수 N의 최댓값은 얼마일까?
입력
첫째 줄에 자연수 S(1 ≤ S ≤ 4,294,967,295)가 주어진다.
출력
첫째 줄에 자연수 N의 최댓값을 출력한다.
예제 입력 1
200
예제 출력 1
19
문제 접근
- 알고리즘을 지속적으로 공부하면서 쉽게 생각하는 방법에 대해서 추론하는 방법을 조금 깨닫고 있는중?!
- 간단히 1부터 예제 입력(200)보다 커질때까지 더한 후 그 전 숫자와 전전 숫자를 뺀 후 남는 숫자를 더해주면 가장 많은 횟수로 해당 입력을 구성할 수 있다.
- 예시로 200 은 1~~18 까지 더하면 171이다 여기서 29만 더해주면 19번을 사용하여 200을 구성하는 것이다.
알고리즘
- 먼저 숫자의 범위가 40억이 넘기 때문에 Int 대신 Long으로 계산식을 구성하였다.
- 1의 경우에는 1이 출력되는 예외 케이스이기에 따로 처리하였다
- 입력 값과 더해진 숫자의 값이 같아지는 경우 count를 뺄 필요가 없어지기에 count를 한번 더하여 이를 상쇄했다.
- 그 외의 경우 break한 후 이전 숫자, 이전전 숫자를 빼고(count-2), 해당 공백을 하나의 숫자로 채우기에(count+1) 마지막에 count-1을 하게 된 것이다.
- 예시 1..18 = 171 -> 1..20 = 210 (count-2) -> 1..18+29(count+1) = 200
정답 코드
fun main() {
val input = readln().toLong()
var sum = 0L
var i = 1L
var count = 0
while (true) {
if (input == 1L) {
count = 2
break
}
if (input > sum) {
sum += i
i++
count++
} else if (input == sum) {
count++
break
} else {
break
}
}
println(count - 1)
}
난이도: 중하
헷갈렸던 부분은 딱히 없었다.