SWEA 1486 장훈이의 높은 선반 D4 (자바 Java)

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

Leave a Comment