🔗 문제 링크
프로그래밍 강의 | 프로그래머스 스쿨
국비지원 K-디지털 기초역량훈련 코스, K-디지털 트레이닝 코스, 선배 개발자와 함께하는 라이브 교육, 데이터 사이언스, PCCP/PCCE 자격증, 세미나, 각종 프로그래밍 기초부터 실전까지 원하는 강
school.programmers.co.kr
📌 문제 개요
현재 저수지에 저장된 물의 양 storage 와 지난달 물 사용량 usage 가 주어진다.
또한 앞으로의 월별 물 사용량 변화율이 change 배열로 제공된다.
매달 사용량을 계산하면서 누적 사용량을 구하고, 누적 사용량이 저수지 저장량을 초과하는 최초 시점을 반환해야 한다.
가뭄이 끝날 때까지 물이 부족하지 않으면 -1 을 반환한다.
📌 접근 방법
문제를 처음 보면 단순 구현 문제처럼 보인다.
반복문을 돌면서 매달 사용량을 계산하고 누적 사용량만 구하면 되기 때문이다.
하지만 이 문제의 핵심은 정수 나눗셈으로 인한 오차를 주의해야 한다는 점이다.
처음에는 아래와 같이 계산할 수 있다.
usage = usage + (usage / 100) * change[i];
하지만 정수 나눗셈이 먼저 수행되면서 소수점이 제거되어 오답이 발생할 수 있다.
따라서 변화율을 적용할 때는 곱셈을 먼저 수행하는 방식으로 사용량을 계산해야 한다.
이후 누적 사용량을 저장하면서 저장량을 초과하는 시점을 찾으면 된다.
📌 핵심 아이디어
1. 변화율을 적용하여 사용량 계산
매달 사용량은 전월 사용량 기준으로 계산된다.
usage = usage * (100 + change[i]) / 100;
예를 들어
usage = 500
change[i] = 10
이라면 사용량이 10% 증가한다.
500 * 110 / 100 = 550
2. 증가와 감소를 하나의 식으로 처리
위 공식은 증가와 감소를 모두 처리할 수 있다.
따라서 별도의 조건문 없이 하나의 식으로 모든 경우를 처리할 수 있다.
change[i] = 10
→ 110%
change[i] = -10
→ 90%
change[i] = 25
→ 125%
change[i] = -33
→ 67%
3. 정수 나눗셈 주의
처음에는 아래와 같이 계산할 수 있다.
usage = usage + (usage / 100) * change[i];
하지만 소수점 0.5 가 제거된다.
550 / 100 = 5
예를 들어, 실제 계산은 아래처럼 되어야 하지만
usage = 550
change[i] = -10
550 * 90 / 100 = 495
위 방식은 오답이 된다.
따라서 곱셈을 먼저 수행하는 방식으로 계산해야 한다.
550 + (5 * -10) = 500
4. 누적 사용량 계산
매달 계산된 사용량을 누적한다.
total_usage += usage;
누적 사용량이 저장량보다 커지는 순간 물이 부족해진다.
현재 월 인덱스를 반환하면 된다.
if(total_usage > storage){
return i;
}
📌 전체 코드
class Solution {
public int solution(int storage, int usage, int[] change) {
int total_usage = 0;
for(int i = 0; i < change.length; i++){
usage = usage * (100 + change[i]) / 100;
total_usage += usage;
if(total_usage > storage){
return i;
}
}
return -1;
}
}
📄 정리
- 매달 사용량을 갱신하면서 누적 사용량을 계산하는 구현 문제
- 변화율 계산은
usage * (100 + change[i]) / 100공식을 사용한다. - 증가와 감소를 하나의 식으로 처리할 수 있다.
- 정수 나눗셈에서는 곱셈을 먼저 수행해야 오차를 방지할 수 있다.
- 누적 사용량이 저장량을 초과하는 최초 시점을 반환하면 된다.
'코테(Solved.ac + Programmers)' 카테고리의 다른 글
| 프로그래머스 지폐 접기 JAVA 풀이 (구현, 반복문) (0) | 2026.06.13 |
|---|---|
| 프로그래머스 자릿수 더하기 JAVA 풀이 (수학, 구현) (0) | 2026.06.12 |
| 프로그래머스 옹알이 JAVA 풀이(문자열, 구현) (0) | 2026.06.10 |
| 프로그래머스 시험장 나누기 JAVA 풀이 (이분 탐색, DFS, 트리) (0) | 2026.06.10 |
| 프로그래머스 문자열 나누기 JAVA 풀이 (문자열, 구현) (0) | 2026.06.09 |