SWEA 1486 장훈이의 높은 선반
문제 정보
- 문제 출처 : SW Expert Academy
- 문제 번호 : 1486
- 문제 제목 : 장훈이의 높은 선반
- 문제 난이도 : D4
- 풀이 언어 : Java
문제
서점에는 높이가 B인 선반이 하나 있는데, 이 서점에 있는 N명의 점원들이 장훈이가 선반 위에 올려놓은 물건을 사용해야 하는 일이 생겼다.
각 점원의 키는 Hi로, 점원들은 탑을 쌓아서 선반 위의 물건을 사용하기로 하였다. 탑의 높이는 점원이 1명일 경우 그 점원의 키와 같고, 2명 이상일 경우 탑을 만든 모든 점원의 키의 합과 같다.
탑의 높이가 B 이상인 경우 선반 위의 물건을 사용할 수 있는데 탑의 높이가 높을수록 더 위험하므로 높이가 B 이상인 탑 중에서 높이가 가장 낮은 탑을 구하는 문제.
접근
for 루프를 통한 탐색으로 문제를 풀었다.
풀이
- for 루프를 사용하여 각 테스트 케이스에 대해 반복합니다. 각 테스트 케이스에서 점원의 수 N과 선반의 높이 B를 읽어들입니다.
- height 배열을 생성하여 각 점원의 키를 저장합니다.
- ans 변수를 Integer.MAX_VALUE로 초기화하여, 선반 높이 이상인 부분 집합 중 최소 합을 추적합니다. 외부 for 루프를 사용하여 모든 가능한 부분 집합을 탐색하고, 내부 for 루프로 각 부분 집합의 합을 계산합니다.
- 부분 집합의 합이 선반 높이 이상이면 ans 값을 최소 합으로 갱신합니다.
- 각 테스트 케이스의 결과를 ans – B 형태로 출력합니다. 이는 선반에 물건을 올리기 위해 필요한 최소 추가 높이를 나타냅니다.
후기
의외로 헷갈렸던 문제입니다. 비슷한 유형의 문제를 더 풀어볼 계획입니다.
코드
Java
import java.util.Scanner;
import java.io.FileInputStream;
class Solution
{
public static void main(String args[]) throws Exception
{
Scanner sc = new Scanner(System.in);
int T;
T=sc.nextInt();
for(int test_case = 1; test_case <= T; test_case++)
{
int N = sc.nextInt();
int B = sc.nextInt();
int[] height = new int[N];
for (int i = 0; i < N; i++) {
height[i] = sc.nextInt();
}
int ans = Integer.MAX_VALUE;
for (int i = 0; i < (1 << N); i++) {
int sum = 0;
for (int j = 0; j < N; j++) {
if ((i & (1 << j)) != 0) {
sum += height[j];
}
}
if (sum >= B) {
ans = Math.min(ans, sum);
}
}
System.out.println("#" + test_case + " " + (ans - B));
}
}
}
Java