알고리즘

[백준] 상자넣기 - Java

BGK97 2025. 1. 18. 17:29

문제

정육면체 모양의 상자가 일렬로 늘어서 있다. 상자마다 크기가 주어져 있는데, 앞에 있는 상자의 크기가 뒤에 있는 상자의 크기보다 작으면, 앞에 있는 상자를 뒤에 있는 상자 안에 넣을 수가 있다. 예를 들어 앞에서부터 순서대로 크기가 (1, 5, 2, 3, 7)인 5개의 상자가 있다면, 크기 1인 상자를 크기 5인 상자에 넣고, 다시 이 상자를 크기 7인 상자 안에 넣을 수 있다. 하지만 이렇게 상자를 넣을 수 있는 방법은 여러 가지가 있을 수 있다. 앞의 예에서 차례대로 크기가 1, 2, 3, 7인 상자를 선택하면 총 4개의 상자가 한 개의 상자에 들어가게 된다.

상자의 크기가 주어질 때, 한 번에 넣을 수 있는 최대의 상자 개수를 출력하는 프로그램을 작성하시오.

입력

파일의 첫 번째 줄은 상자의 개수 n (1 ≤ n ≤ 1000)을 나타낸다. 두 번째 줄에는 각 상자의 크기가 순서대로 주어진다. 상자의 크기는 1,000을 넘지 않는 자연수이다.

출력

첫째 줄에 한 줄에 넣을 수 있는 최대의 상자 개수를 출력한다.

예제 입력 1

8
1 6 2 5 7 3 5 6

예제 출력 1

5

예제 입력 2

10
1 2 3 4 5 6 7 8 9 10

예제 출력 2

10

풀이 방법

  • dp를 활용하여 문제를 해결하였다.
  • 배열을 하나 생성하여 모든 점을 1로 초기화해놓고, 자신의 차례를 기준으로 0부터 자신까지 값을 비교해서, 이전 배열의 값 보다 적으면 그 값의 +1을 추가하는 방식으로 진행했다
  • Math.max 메서드를 활용해 이미 저장되어 있는 값이 더 큰지, 이전 값에서 + 1한게 더 큰지 비교하여 더 큰 값을 비교하였다. 

  • 예시로 이 배열에서, 5의 경우 1, 3, 4, 5로 총 4개의 상자를 넣을 수 있는데, max 메서드를 사용하지 않을 경우 가장 이전값인 2와 비교해서 나온 값을 덮어씌우기 때문에, 답이 달라진다. 

풀이 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    static int N;
    static int[] arr, dp;
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        N = Integer.parseInt(br.readLine());
        arr = new int[N];
        dp = new int[N];
        StringTokenizer st = new StringTokenizer(br.readLine());

        for(int i = 0; i < N; i++){
            arr[i] = Integer.parseInt(st.nextToken());
            dp[i] = 1;
        }

        for(int i = 1; i < N; i++){
            boxInsert(i);
        }


        int max = dp[0];
        for(int i = 0; i < N; i++){
            max = Math.max(max, dp[i]);
        }

        System.out.println(max);
    }

    public static void boxInsert(int k){
        for(int i = 0; i < k; i++){
            //다음 수가 더 크면
            if(arr[k] > arr[i]){
                dp[k] = Math.max(dp[i] + 1, dp[k]);
            }
        }
    }
}

결과

회고

  • max를 안넣어서 세번이나 틀렸다. dp의 핵심은 max인가..?