> 수학 알고리즘
규칙을 찾아 푸는 문제
위 블로그에 규칙 정리가 잘 되어 있어서 펌해왔음.
n= 18, L=2일 경우
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
출력값은 5,6,7
연속된 숫자의 합이 n과 같아져야 하고
그 연속된 숫자의 길이가 가장 짧아야한다.
위 과정을
수식으로 정리하면
아래와 같다.
n=(x+1)+(x+2)+...(x+L)
n=l*x+(1+2+...L)
n=x*l+t # t = L(L-1)//2
x=(n-t)//L
이때,
x는 정수여야한다.
따라서 (n-t)가 L로 딱 나누어 떨어져야 하고,
x의 값, 즉 (n-t)//L의 값이 0 이상이어야 한다.
x가 정수라는 걸 입증하는 수식이라는 걸 해석하는데 오래 걸림
n, l = map(int, input().split())
length = 0
x=-1
for i in range(l, 101):
t = (i * i - i) // 2
if (n-t)%i==0 and (n-t)//i>=0:
x=(n-t)//i
length=i
break
if x==-1:
print(-1)
exit()
else:
answer=[]
for i in range(length):
answer.append(int(x+i))
print(*answer)
'여니의 취준 준비 > 코딩테스트 (Python)' 카테고리의 다른 글
[1495] 기타리스트 in python (0) | 2022.02.12 |
---|---|
[9205] 맥주 마시면서 걸어가기 in python (0) | 2022.02.12 |
[2312] 수 복원하기 in python (0) | 2022.02.12 |
[2473] 세 용액 in python (0) | 2022.01.31 |
[16678] 모독 In python (0) | 2022.01.30 |