문제 출처 - Baekjoon Online Judge
문제는 여기
[문제]
정육면체 모양의 상자가 일렬로 늘어서 있다. 상자마다 크기가 주어져 있는데, 앞에 있는 상자의 크기가 뒤에 있는 상자의 크기보다 작으면, 앞에 있는 상자를 뒤에 있는 상자 안에 넣을 수가 있다. 예를 들어 앞에서부터 순서대로 크기가 (1, 5, 2, 3, 7)인 5개의 상자가 있다면, 크기 1인 상자를 크기 5인 상자에 넣고, 다시 이 상자를 크기 7인 상자 안에 넣을 수 있다. 하지만 이렇게 상자를 넣을 수 있는 방법은 여러 가지가 있을 수 있다. 앞의 예에서 차례대로 크기가 1, 2, 3, 7인 상자를 선택하면 총 4개의 상자가 한 개의 상자에 들어가게 된다.
상자의 크기가 주어질 때, 한 번에 넣을 수 있는 최대의 상자 개수를 출력하는 프로그램을 작성하시오.
[입력]
파일의 첫 번째 줄은 상자의 개수 n (1 ≤ n ≤ 1000)을 나타낸다. 두 번째 줄에는 각 상자의 크기가 순서대로 주어진다. 상자의 크기는 1,000을 넘지 않는 자연수이다.
[출력]
첫째 줄에 한 줄에 넣을 수 있는 최대의 상자 개수를 출력한다.
[풀이]
1. 입력을 받아 map 배열을 채워준다.
2. 결과를 출력하기 위한 result 변수를 선언해준다.
3. 시작은 무조건 1이므로 dp배열을 1로 채워준다.
4. 현재 값 이전까지 값들을 비교해서 더 작은 값을 찾아준다.
5. 더 작은 값이 나오면 해당 번째의 dp 배열의 값 + 1과 현재 dp 배열의 값을 비교하여 더 큰 것으로 갱신해준다.
6. result에 최댓값을 갱신해준다.
7. 모든 배열을 탐색하고 나면 결과를 출력해준다.
[접근]
1. 가장 긴 증가하는 수열을 찾는 방식으로 문제를 해결하면 되겠다고 생각하였다..
[코드]
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int map[] = new int[n + 1];
int dp[] = new int[n + 1];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 1; i <= n; i++) {
map[i] = Integer.parseInt(st.nextToken());
}
int result = 0;
for (int i = 1; i <= n; i++) {
// 시작은 1
dp[i] = 1;
for (int j = 1; j < i; j++) {
// 시작값과 이전값들을 비교
// 이전 값이 크다면
if (map[j] < map[i]) {
// dp[j]는 이전까지 증가하는 부분 수열의 길이
// 현재 길이와 이전까지 연결된 최대길이 + 1과 비교해서 최대값을 갱신
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
// 최대 길이 구하기
result = Math.max(result, dp[i]);
}
System.out.println(result);
}
}
'문제 풀이 > Baekjoon' 카테고리의 다른 글
[백준] G5 13549번 숨바꼭질 3 (JAVA) (0) | 2022.06.09 |
---|---|
[백준] G4 14002번 가장 긴 증가하는 부분 수열 4 (0) | 2022.06.08 |
[백준] S2 11722번 가장 긴 감소하는 부분 수열 (JAVA) (0) | 2022.06.07 |
[백준] S2 11048번 이동하기 (JAVA) (0) | 2022.06.06 |
[백준] S2 1535번 안녕 (JAVA) (0) | 2022.06.04 |