문제 설명
연속된 자연수의 합을 구하는 문제는 흔히 자주 등장하는 코딩 테스트의 주제 중 하나입니다.
입력된 정수 N
에 대해 1
, 2
, …, M
까지의 연속된 자연수의 합이 N
이 되는
M
을 찾는 문제입니다. 여기서 M
은 자연수로 1 이상이어야 하며,
이때 연속된 자연수의 합은 다음과 같은 수식으로 구할 수 있습니다:
S = 1 + 2 + 3 + ... + M = M * (M + 1) / 2
입력
– 정수 N
(1 ≤ N
≤ 1,000,000) – 구하고자 하는 자연수의 합
출력
– 연속된 자연수 1
부터 M
까지의 합이 N
이 될 때, M
을 출력합니다.
– 만약 M
이 존재하지 않으면 -1
을 출력합니다.
문제 접근 방법
이 문제를 해결하기 위해서는 먼저 S = N
의 조건을 수식으로 바꾸어 보는 것이 좋습니다.
S = 1 + 2 + ... + M
를 N
으로 설정했을 때, 이를 정리하면 다음과 같습니다:
N = M * (M + 1) / 2
위의 식을 변형하여 2N = M * (M + 1)
으로 나타낼 수 있습니다.
이 식을 이용해 M
을 구하고, 그 값이 자연수인지 확인하는 방식으로 접근할 수 있습니다.
해결 과정
1. N
에 대해 가능한 M
을 찾기 위해 M
을 1부터 시작하여 증가시키면서
S
를 계산합니다.
2. S
가 N
과 같아질 경우 M
을 출력하고 종료합니다.
3. S
가 N
을 초과하면 더 이상 탐색할 필요가 없는 경우, -1
을 출력하고 종료합니다.
코드 구현
아래는 위의 로직을 코틀린으로 구현한 코드입니다.
fun findContinuousNaturalSum(N: Int): Int {
var sum = 0
for (M in 1..N) {
sum += M
if (sum == N) {
return M
} else if (sum > N) {
return -1
}
}
return -1
}
fun main() {
val N = 15
val result = findContinuousNaturalSum(N)
println("연속된 자연수의 합이 $N이 되는 M은: $result")
}
코드 설명
– findContinuousNaturalSum
함수는 입력 N
에 대해 연속된 자연수를 더해
N
에 도달할 수 있는 M
을 찾습니다.
– sum
변수는 1부터 M
까지의 합을 저장하고 있습니다.
– for
반복문을 통해 M
을 1부터 N
까지 증가시키면서
sum
을 계산합니다.
– sum
이 N
과 같아지면 M
을 반환하고,
sum
이 N
을 초과하면 -1
을 반환하여 종료합니다.
예제
입력: 15
출력: 5
설명: 1+2+3+4+5 = 15이므로 M은 5입니다.
입력: 14
출력: -1
설명: 1부터 M까지의 합이 14가 되는 경우는 없습니다.
결론
연속된 자연수의 합을 구하는 문제는 프로그래밍의 기본적인 반복문과 조건문을 잘 활용하는 데 중요한 문제입니다.
이 문제를 통해 코틀린에서의 기본 문법과 로직 구성 능력을 기를 수 있으며,
알고리즘 문제 풀이에 대한 접근 방식을 배우는 데 큰 도움이 됩니다.
향후 다양한 문제를 풀기 위해 이러한 기본 문제를 충분히 연습해보시기를 바랍니다.