정올/KOI기출 문제

정올 박 터트리기

juwanseo 2025. 5. 6. 21:34

문제
예제

n, k = map(int, input().split())
m = (k * (k + 1)) // 2

if n < m:
    print(-1)
else:
    e = n - m
    if e % k == 0:
        print((k - 1))
    else:
        print(k)

n과 k를 입력 받는다

m은 k와 k+1을 곱한 값을 2로 나눈 값으로 저장한다

그 후 n과 m의 크기르 비교해서 m이 n보다 더 크다면 -1을 출력, 만약 m이 n보다 크거나 그 외라면 e라는 변수에 n-m을 저장해서 n-m을 K로 나눈 값이 0이라면 k-1을 출력한다

그렇지 않다면 k-1이 아닌 결과값 k를 출력한다

n, k = map(int, input().split())

check = k*(k+1) //2

if n < check:
    print(-1)
elif (n - check) % k == 0:
    print(k-1)
else:
    print(k)

n: 목표 합

k: 서로 다른 자연수의 개수

 

check: 서로 다른 자연수 중 가장 작은 k개의 합
예: k = 3 → 1 + 2 + 3 = 6
이 값은 n을 k개의 서로 다른 자연수로 표현할 수 있는 최소 합

 

만약 n이 check보다 작다면 -> 불가능

서로 다른 k개의 자연수 합은 최소 k*(k+1)//2이기 때문

 

n - check는 추가로 분배할 수 있는 여유 금액

이것을 k로 나누어 떨어지면 → k개의 수에 같이 균등하게 더할 수 있다 → 차이가 크지 않음

예: [1,2,3] 에서 각각 +2 하면 [3,4,5] → 여전히 서로 다르고 차이 일정함

이 경우 k - 1 출력

나누어 떨어지지 않으면 → 균등하게 나누기 불가능 → 일부 수가 더 커짐 → 차이가 커짐

 

이 경우 k 출력

 

 

'정올 > KOI기출 문제' 카테고리의 다른 글

정올 지우개  (0) 2025.05.06
정올 피자 오븐  (0) 2025.05.06
정올 회문  (0) 2025.05.06
피하자  (0) 2025.04.24
양팔저울  (0) 2025.04.24