알고리즘/백준

BOJ) 상자넣기

Zin0_0 2020. 6. 23. 13:44
반응형

상자넣기

 

1965번: 상자넣기

정육면체 모양의 상자가 일렬로 늘어서 있다. 상자마다 크기가 주어져 있는데, 앞에 있는 상자의 크기가 뒤에 있는 상자의 크기보다 작으면, 앞에 있는 상자를 뒤에 있는 상자 안에 넣을 수가 ��

www.acmicpc.net

풀이

 

일렬로 정렬된 상자들에서 앞의 상자 크기가 뒤에보다 작으면, 뒤에 상자에 넣어 정리하는 문제였다.

dp로 푸는게 적합하겠다는 생각을 하고 코드를 작성했다.

박스를 순차적으로 탐색하면서, 이전의 박스들 중 가장 많이 저장된 박스에 담는 dp를 만들었다.

이때, 앞의 상자 크기가 뒤에 상자 크기보다 작아야한다는 조건을 걸어서 저장하면서, 쉽게 답을 구할 수 있었다.

 

코드

 

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

public class BoxPackaging_1965 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());
        int[] numArr = new int[n];

        StringTokenizer st = new StringTokenizer(br.readLine());
        for(int i=0; i<n; i++) {
            numArr[i] = Integer.parseInt(st.nextToken());
        }

        System.out.println(solution(numArr,n));

        br.close();
    }

    private static int solution(int[] numArr, int n) {
        int answer =0;
        int[] dp = new int[n];

        for(int i=0; i<n; i++) {
            for(int j =0; j<i; j++) {
                if(numArr[i] > numArr[j]) {
                    dp[i] = Math.max(dp[i], dp[j]);
                }
            }
            answer = Math.max(answer, ++dp[i]);
        }

        return answer;
    }
}
반응형