[BOJ]백준#1024 Silver 2 수열의 합🔢🔢 (Python, 파이썬)

임준성·2022년 6월 17일
0

백준 Algorithm

목록 보기
28/59
post-thumbnail

백준 1024번
https://www.acmicpc.net/problem/1024


문제



후기

⏰ 풀이시간 1시간 ++⏰

고등학교 때 등차수열을 풀던 느낌으로 문제에 접근했다.

수열의 총 합을 구하는 공식이 기억나지 않아 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()
profile
아무띵크 있이

0개의 댓글