728x90
문제)
어떠한 자연수 N은, 몇 개의 연속된 자연수의 합으로 나타낼 수 있다. 당신은 어떤 자연수 N(1 ≤ N ≤ 10,000,000)에 대해서, 이 N을 몇 개의 연속된 자연수의 합으로 나타내는 가지수를 알고 싶어한다. 이때, 사용하는 자연수는 N이하여야 한다.
예를 들어, 15를 나타내는 방법은 15, 7+8, 4+5+6, 1+2+3+4+5의 4가지가 있다. 반면에 10을 나타내는 방법은 10, 1+2+3+4의 2가지가 있다.
N을 입력받아 가지수를 출력하는 프로그램을 작성하시오.
입력)
첫 줄에 정수 N이 주어진다.
출력)
입력된 자연수 N을 몇 개의 연속된 자연수의 합으로 나타내는 가지수를 출력하시오
def func(a, l):
n = l - a + 1
return int(n * (2 * a + (n - 1)) / 2)
N = int(input())
length = 2
done = False
ans = 1
for _ in ' ' * (N//2):
if done: break
n = N // length
for i in range(n, 0, -1):
if func(i, i + length - 1) <= N:
if func(i, i + length - 1) == N:
ans += 1
length += 1
break
if i == 1: done = True
print(ans)
풀이:
N이 주어졌을 때, N을 표현하기 위한 연속된 자연수의 길이를 length라고 한다. 그럼 연속된 자연수의 제한선은 어디일까?
바로 N을 length로 나눈 몫까지이다.
length가 2라면 N을 2로 나누었을 때 까지만 구하면 될것이다. 왜냐하면 (N // 2) + (N // 2 + 1) > N 이기 때문이다.
마찬가지로 3일 때에도 N을 3으로 나눈 몫까지만 구해보면 된다.
이를 생각하며 코드를 작성해보면 N // length 부터 1까지 차례대로 살펴보며 해당 자연수들의 합이 N과 같다면 출력값에 1을 더해주고 N보다 작다면 길이를 늘려준 뒤 다시 실행해주면 된다.
'~2025' 카테고리의 다른 글
반복문 실행 속도 비교(range, 문자열 복사, while) (0) | 2022.12.12 |
---|---|
스프링 웹 개발 기초 (0) | 2022.12.12 |
백준) 1789 - 수들의 합[파이썬 3] (0) | 2022.12.10 |
백준) 5554 - 심부름 가는 길 [파이썬3] (0) | 2022.12.08 |
백준) 1032 - 명령 프롬프트 [파이썬3] (0) | 2022.11.29 |