BOJ 15311 : 약 팔기 [python]

Algorithm_Coder·2025년 6월 30일

문제
약장수 강욱이는 오늘도 약을 판다. 짬에서 나오는 Vibe로 화려한 언변을 구사하는 강욱이는 최고의 약장수이다. 하지만 이런 그에게도 고민거리가 하나 있으니...

동규라는 단골 손님이 있는데, 그는 매일 약을 11알에서 100100만알 사이의 랜덤한 자연수 개수만큼 원했다. 주문을 받은 강욱이는 약 상자에서 한 알씩 약을 세서 꺼내주곤 했는데, 그것이 답답했던 동규는 강욱이에게 매번 화를 냈던 것이다.

이러다 동규가 자기를 때리지 않을까 무서웠던 강욱이는 동규가 원하는 만큼의 약을 빨리 건네주기 위한 방법을 고민하기 시작했다. 그는 곧 소싯적에 공부했던 Algorithm을 이용해 다음과 같은 방법을 생각해 냈다.

'약 봉지 여러 개에 각각 적절한 수의 알약을 담아서 일렬로 늘어 놓은 뒤, 동규가 약을 kk알 달라고 하면 총 kk알의 약이 들어있는 어떤 연속한 구간의 약 봉지들을 한 번에 집어 주면 되겠군!'

아쉽게도, 강욱이의 약 판매대는 봉지를 일렬로 최대 2000개까지만 올려놓을 수 있다. 강욱이는 적은 수의 봉지에 알약을 적절히 담아서 동규가 100100만 이하의 어떤 수를 부르든 그 수에 해당하는 만큼의 약을 줄 수 있었으면 한다. 하지만 물리 공부를 하느라 Algorithm 공부를 열심히 하지 못한 강욱이는 어떻게 할지 몰라 쩔쩔매고 있다. 강욱이를 도와주자!

입력
6

출력
3
1 3 2

코드

l = [1 for i in range(1000)] + [1000 for _ in range(1000)]
print(2000)
for i in l:
    print(i, end = ' ')

문제 해설
동규가 원하는 1부터 N까지 모든 수를 연속한 약 봉지의 합으로 표현하려면 1부터 K까지 차례대로 알약을 담은 봉지 배열을 만들면 됩니다. 누적합이 K(K+1)2\frac{K(K+1)}{2}이므로 K(K+1)2N\frac{K(K+1)}{2} \geq N인 최소한의 K를 찾으면 되고, N이 1,000,000일 때는 약 1415개면 충분합니다. 이렇게 준비하면 모든 수를 연속합으로 정확히 표현할 수 있어 문제 조건을 충족할 수 있습니다.

profile
BOJ USER(https://www.acmicpc.net/user/wjdghlwns1015)

0개의 댓글