본문 바로가기
Problem Solving/Baekjoon

[백준] 1965 상자넣기 - Dynamic Programming / Java

by graycode 2022. 12. 5.

 문제 링크

 

1965번: 상자넣기

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

www.acmicpc.net

 

 풀이 과정

문제에서 각 상자의 크기가 이전 상자의 크기보다 커야하고,

그러한 상자들의 개수를 가장 많이 선택할 수 있는 경우의 수를 구해야한다.

따라서 이는 최장 증가 부분 수열(LIS)를 구하는 문제이다.

 

 

[백준] 11053 가장 긴 증가하는 부분 수열 - Dynamic Programming / Java

• 문제 링크 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴

graycode.tistory.com

기존에 작성한 위의 게시글에서 해당 알고리즘에 대한 풀이 과정을 확인할 수 있으며,

해당 풀이 코드에서 입력을 위한 반복문을 하단의 이중 반복문과 통합하여 간결히 처리하였다.

 

 풀이 코드

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

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;

        int n = Integer.parseInt(br.readLine());

        int[] arr = new int[n];
        int[] dp = new int[n];

        st = new StringTokenizer(br.readLine());
        int max = 0;
        for (int i = 0; i < n; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
            dp[i] = 1;
            for (int j = 0; j < i; j++) {
                if (arr[j] < arr[i] && dp[i] <= dp[j])
                    dp[i] = dp[j] + 1;
            }

            max = Math.max(max, dp[i]);
        }

        bw.write(String.valueOf(max));
        bw.flush();
    }

}

댓글