문제 내용
문제는 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)을 해주었어요!!
이렇게 풀었는데 코드가 좀만 더 깔끔하게 하고 싶지만 아직 부족한 저이기에 그냥 납두기로 했습니다....
도움이 되셨다면 공감 부탁드릴게요!
'공부 > algorithm with python' 카테고리의 다른 글
백준 알고리즘 1025번 파이썬 제곱수 찾기 (0) | 2022.07.14 |
---|---|
백준 알고리즘) 7576번 토마토 파이썬 (0) | 2022.06.05 |
백준 알고리즘) 14502번 연구소 파이썬 ! (0) | 2022.05.12 |
백준 1083번 sort풀이 with python(파이썬) (0) | 2022.04.28 |
최근댓글