[Java] 프로그래머스(level1) - 예산

Input-1
d = [1, 3, 2, 5, 4]
budget = 9
Output-1
3
Input-2
d = [2, 2, 3, 3]
budget = 10
Output-2
4
문제 풀이
부서별 신청금액 배열(d)의 원소별로 예산(budget)을 어떻게 나눠줄 수 있을까?
- budget에서 d의 원소별로 뺼셈하여 양수인지 음수인지를 검증하면 된다.
먼저 budget에서 d 중의 작은 수부터 뺼셈할 수 있도록 d를 오름차순으로 정렬하자.
1
Arrays.sort(d);
그리고 d의 원소별로 순회하며 budget에 뺄셈을 해준다.
순회하며 음수가 된다면 예산을 다 쓴것이라 판단하고 break문으로 탈출하도록 작성하였다.
예산이 0보다 크거나 같으면 모든 부서에 예산을 지원해줄 수 있다고 생각하면 된다.
1
2
3
4
5
6
7
8
for(int i=0; i<d.length; i++) {
budget -= d[i];
if(budget < 0) {
answer = i;
break;
}
else if(budget >= 0) answer = i+1;
}
한 번 예시를 들어보자.
1
2
3
4
5
6
7
8
9
10
11
d = [1, 3, 2, 5, 4], budget = 9 라고 하자.
i=0, budget = 9-1 = 8
i=1, budget = 8-2 = 6
i=2, budget = 6-3 = 3
i=3, budget = 3-4 = -1
d = [2, 2, 3, 3], budget = 10 라고 하자.
i=0, budget = 10-2 = 8
i=1, budget = 8-2 = 6
i=2, budget = 6-3 = 3
i=3, budget = 3-3 = 0
위와 같이 음수라면 음수까지의 i만큼의 부서개수만큼 예산을 지원할 수 있고
반복문을 모두 순회하여 0보다 크거나 같은 budget이 된다면 모든 부서를 지원할 수 있다고 보면 된다.
작성 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import java.util.*;
class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] d = {1, 3, 2, 5, 4};
// int[] d = {2, 2, 3, 3};
int budget = sc.nextInt();
solution(d, budget);
}
public static int solution(int[] d, int budget) {
int answer = 0;
Arrays.sort(d);
for(int i=0; i<d.length; i++) {
budget -= d[i];
if(budget < 0) {
answer = i;
break;
}
else if(budget >= 0) answer = i+1;
}
return answer;
}
}
회고
- 반복문 내에서 어떤 로직이 일이날지 생각하고 노트에 그린 내용르 통해 코드를 작성하니 훨씬 간결하고 빠르게 풀 수 있었다.