백준 1024번
https://www.acmicpc.net/problem/1024
문제
후기
고등학교 때 등차수열을 풀던 느낌으로 문제에 접근했다.
수열의 총 합을 구하는 공식이 기억나지 않아 L을 1부터 대입해보는 방식으로 점화식을 구했다.
수열의 개수가 L개이고, 초항이 x일때 수열의 합N은
N = ( (L*x) + ((L-1)/2) + ((L-1)**2)/2 )
라는 것을 구했고, 그로인해 x를 이항시켜 초항 x의 값도 역시 구할 수 있었다.
초항 x를 구했을 때 , x의 값이 음수가 아닌 연속된 정수라면 문제에서 원하는 답이였다.
그리하여 x%2== 0 or x%2== 1일때 ans_li에 x를 append 시키게 했고,
ans_li의 길이가 0이 아니면 정답이 만들어졌다는 얘기이므로 정답을 출력했다.
(풀이시간이 꽤 길어진 이유는 int와 float를 적절하게 사용하지 못해 반올림된 값으로 고생했다..
다음부턴 이런 실수는 아주아주 지양해야 할 것이다.)
나의 풀이
import sys
input =sys.stdin.readline
N , L = map(int,input().split())
ans_li=[]
#2개일 때는 3x+(1+2) 4개일때는 4x+(1+2+3) 5개일때는 5x+(1+2+3+4) n개일때는 (L*x) + ( (0.5(L-1)) + (((L-1)**2)/2))
# 점화식을 대입해서 자연수 x가 나오지 않으면 L을 1씩 증가시키는 방식으로
while True:
x= float((N - ( float((L-1)/2) + float(((L-1)**2)/2) ))/L) #첫항 계산
if x%2 == 0 or x%2 == 1 : #첫항이 정수라면 ( 정답이 맞다면 )
for i in range(L):
ans_li.append(int(x+i))
if len(ans_li)!=0: # ans_li에 x값이 들어갔다는 얘기는 정답을 출력하면 된다는 얘기
if -1 in ans_li: #음수가 들어가있으면 -1 출력. x의 범위는 0부터이므로
print(-1)
exit()
else:
print(*ans_li)
exit()
L+=1
if L ==101: #L이 문제에서 정해준 100까지의 범위를 넘게되면 -1출력
print(-1)
exit()