Do it 알고리즘 코딩 테스트 - 6번
문제.
https://www.acmicpc.net/problem/2018
2018번: 수들의 합 5
어떠한 자연수 N은, 몇 개의 연속된 자연수의 합으로 나타낼 수 있다. 당신은 어떤 자연수 N(1 ≤ N ≤ 10,000,000)에 대해서, 이 N을 몇 개의 연속된 자연수의 합으로 나타내는 가지수를 알고 싶어한
www.acmicpc.net
코드.
n = int(input())
sum = 1
start = 1
end = 1
count = 1
while end != n:
if sum < n:
end += 1
sum += end
elif sum == n:
end += 1
sum += end
count += 1
else:
sum -= start
start += 1
print(count)
입력 값 | 출력 값 |
15 | 4 |
해석 및 풀이.
★ 이 문제는 임의의 자연수 N을 받고 그 안에 있는 연속된 몇 개의 자연수를 더해서 N을 만들어낼 수 있는지 출력하는 프로그램을 만드는 문제입니다.
n = int(input())
sum = 1
start = 1
end = 1
count = 1
먼저 임의의 자연수를 입력받고 N이 되는 총합을 나타내줄 변수 sum과 N을 만들수 있는 횟수를 나타내줄 변수 count, 연속되는 구간의 시작을 나타내줄 변수 start, 구간의 마지막을 나타내줄 변수 end를 만들어 줍니다. 이때 모든 값은 1로 시작해야하는 데 그 이유는 sum은 구간이 1부터 시작하기 때문이고 count는 N이 본인 스스로 성립이 되기 때문입니다.
while end != n:
if sum < n:
end += 1
sum += end
elif sum == n:
end += 1
sum += end
count += 1
else:
sum -= start
start += 1
print(count)
이후 조건이 구간이 N에 다다를때 까지 반복해야하기 때문에 반복문 while 을 이용해줘야 하며 조건은 구간의 마지막인 end가 N이 되기 전까지 돌려주도록 합니다. 그 이유는 N본인이 성립이되는 경우는 위에 count에 이미 입력을 했기 때문입니다. 이후 구간의 합 즉 start 부터 end 까지의 합을 구해주고 조건문을 이용해서 sum이 조건 N보다 작을경우 end를 높여줘서 총합을 올려주고 조건 N보다 클 경우 start를 높여줘서 총합을 낮춰주고 조건 N에 성립할경우 count에 1을 더해주고 end를 높여주면서 end가 N이 되기 전까지 돌려줍니다.
반복회차 | start | end | sum | count |
- | 1 | 1 | 1 | 1 |
1 | 1 | 2 | 3 | 1 |
2 | 1 | 3 | 6 | 1 |
3 | 1 | 4 | 10 | 1 |
4 | 1 | 5 | 15 | 2 |
5 | 1 | 6 | 21 | 2 |
6 | 2 | 6 | 20 | 2 |
7 | 3 | 6 | 18 | 2 |
8 | 4 | 6 | 15 | 3 |
9 | 4 | 7 | 22 | 3 |
10 | 5 | 7 | 18 | 3 |
. . . |
. . . |
. . . |
. . . |
. . . |
마지막으로 count에 입력된 값을 print로 출력해줍니다.