본문 바로가기
Programming Practice/Python

프로그래머스 <PCCE 기출문제 6번 / 물 부족>

by TAMIK 2025. 4. 18.
728x90

Programmers <PCCE 기출문제 6번 / 물 부족> 문제

문제 설명

ㅇㅇ시에서는 저수지가 하나 있는데, 도시 내에서 사용하는 모든 물은 이 저수지에 저장된 물을 끌어와 사용합니다. 이상 기후로 인해 극심한 가뭄이 예고된 상황에서, 지난 달의 물 사용량과 이번달부터 일정 기간 동안의 월별 물 사용량의 변화를 예측한 값을 이용해 몇 달 뒤 물이 부족해지는지 예측하려고 합니다.이번달부터의 월별 물 사용량 변화를 예측한 값은 다음과 같이 리스트에 담겨 주어집니다.

[10, -10, 10, -10, 10, -10, 10, -10, 10, -10]
리스트의 각 원소는 해당 월의 물 사용량이 전 달에 비해 몇 % 만큼 증가 또는 감소하는지를 나타냅니다.
예를 들어, 이번달의 물 사용량 (리스트의 첫 번째 원소)은 지난 달 보다 10% 증가한 값이며, 다음 달(리스트의 두 번째 원소)의 물 사용량은 이번달 사용량에서 10%만큼 감소한 값입니다.
     자세한 값은 입출력 예시를 참고해 주세요.

현재 저수지에 저장된 물의 양을 나타내는 정수 storage와 지난 달 물 사용량을 나타내는 정수 usage, 월별 물 사용량이 전 달 대비 어떻게 변하는지 저장된 정수 리스트 change가 주어질 때 몇 달 뒤 물이 부족해지는지 return 하도록 solution 함수를 작성하려 합니다. 코드가 올바르게 작동하도록 한 줄을 수정해 solution 함수를 완성해 주세요. 가뭄이 끝날때 까지 저수지의 물이 남아 있다면 -1을 return합니다.

제한사항
1,000 ≤ storage ≤ 1,000,000
500 ≤ usage ≤ 30,000
1 ≤ change의 길이 ≤ 30
    -99 ≤ change[i] ≤ 500
    change[i] 가 양수일 경우 물 사용량은 전 달 보다 change[i]% 만큼 증가합니다.
    change[i] 가 음수일 경우 물 사용량은 전 달 보다 change[i]% 만큼 감소합니다.
    change[i] 가 0일 경우 물 사용량은 전 달과 동일합니다.
    매달 물 사용량은 소수점 이하를 버린 정수로 계산합니다.


입출력 예
storage          usage                                    change                                   result
5141               500             [10, -10, 10, -10, 10, -10, 10, -10, 10, -10]         -1
1000              2000                                  [-10, 25, -33]                                  1

def solution(storage, usage, change):
    total_usage = 0
    for i in range(len(change)):
        usage = total_usage * change[i]/100
        total_usage += usage
        if total_usage > storage:
            return i
    
    return -1
        usage = total_usage * change[i]/100

이 줄을 바꿔서

↓ 이렇게

def solution(storage, usage, change):
    total_usage = 0
    for i in range(len(change)):
        usage += usage * change[i]/100
        total_usage += usage
        if total_usage > storage:
            return i
    
    return -1

total_usage : 누적 사용량을 저장할 변수

for i in range(len(chagne)) : change 리스트의 길이만큼 반복

 

입출력 예의 첫 번째 예시로 보면,

입력 예
storage = 5141
usage = 500
change = [10, -10, 10, -10, 10, -10, 10, -10, 10, -10]
usage += usage * change[i]/100

usage에 usage * change[i]/100을 저장.

ex) change[0]/100은 0.1
usage*0.1은 500*0.1 = 50

 

이것을 total_usage에 누적 저장

 

i change/100 usage * change/100 usage total_usage
0 0.1 500 * 0.1 = 50 500 + 50 = 550 0 + 550
1 -0.1 550 * (-0.1) = -55 550 - 55 = 495 550 + 495 = 1045
2 0.1 495 * 0.1 = 49.5(소수 버림) 495 + 49 = 544 1045 + 544 = 1589
3 -0.1 544 * (-0.1) = -54.4(소수 버림) 544 - 54 = 490 1589 + 490 = 2079

 

사실 위에 코드는 소수 버리는 게 없음. 더 정확하게 소수 버리는 코드로 제대로 만들려면

usage += int(usage * change[i]/100)

가 되어야 함.


이런식으로 나온다.

그래서 쭉 계산을 해 가다가

if total_usage > storage:

if문을 만나서 total_usage가 storage보다 커지면 i값을 반환하고 끝.

728x90