반응형
문제 내용

문제는 N,L이 주어지고 합이 N이면서 길이가 적어도 L이상인 연속되는 수열 중 가장 짧은 수열을 구하는 문제입니다.

처음에 dfs를 써볼까..? 어케 풀지 ? 숫자가 꽤나 큰데 ? 여러가지 고민을 하다가 등차 수열이 떠오르더라고요.

등차 수열의 합 공식을 활용하면 쉽게 풀 수 있습니다.

 

문제 풀이

등차 수열의 합 공식:   합=L(2a+(L-1)d)/2  여기서 L은 수열의 길이 , a는 첫번째 항 ,d는 등차값 (연속이니 1이겠죠?)

이걸 보고 저는 고민 끝에 수열의 길이를 작은 순부터 최대 100까지로 했을 때의 첫째 항 a를 구하는 식으로 구현하려고

했습니다.

 

코드를 올리겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import sys
input=sys.stdin.readline
 
N,L=map(int,input().split())
 
for i in range(L,101):
    Sum=0
    start=int((2*N-i**2+i)/(2*i))
    if start<0:
        continue
    for j in range(start,start+i):
        Sum+=j
    if Sum==N:
        for j in range(start,start+i):
            print(j,end=' ')
        exit()
 
print(-1)
 
cs

등차 수열의 합 공식을 a에 대해서 정리를 하면 위처럼 start항(a)을 구하는 식을 나타낼 수 있습니다.

여기서 소수점도 같이 구해지거나 음의 정수에 대해서도 구해지므로 int로 묶고 음의 정수일 경우 continue를 진행 해주었습니다.

이제 시작 값에서 L만큼의 길이를 갔을 때 값이 N가 일치하다면 제대로 된 시작 양의 정수 값이 구해진 것이고 아닐 경우는 소수 점을 포함한 것이 int형으로 변환된 것이라서 합이 N가 일치가 안되겠죠?

일치를 할 경우에 그 시작 값에 대해서 순서대로 출력을 해주고 종료를 해줍니다.

100길이의 수열까지 다 돌았는데 일치 값이 나오지 않으면 없는 것이므로 마지막에 print(-1)을 해주었어요!!

 

이렇게 풀었는데 코드가 좀만 더 깔끔하게 하고 싶지만 아직 부족한 저이기에 그냥 납두기로 했습니다....

도움이 되셨다면 공감 부탁드릴게요!

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기