탑을 쌓는 조건이 있는데
밑면의 넓이가 좁은게 넓은 것의 아래 있을 수 없으며
무게가 가벼운 것이 무거운 것 아래 있을 수 없다.
일단 이 문제는 쌓는다는 개념의 문제이기 때문에 저 두개의 조건을 만족하는 가장 긴 수열을 구하는 문제라고 해석된다.
따라서 밑면의 넓이를 기준으로 오름차순으로 벽돌들을 정렬하고
무게라는 조건 하나만을 비교하여 높이가 최대가 될 수 있도록 한다.
만약에
5
25 3 4
4 4 6
9 2 3
16 2 5
1 5 2
위와 같은 입력이 주어진다면
25 3 4
16 2 5
9 2 3
4 4 6
1 5 2
위와 같이 밑면의 넓이를 기준으로 배열을 정렬해야 한다.
또한 벽돌은 밑면의 넓이, 높이, 무게 3가지 속성을 가지고 있기 때문에 이를 내부 클래스로 만들어 객체로 선언될 수 있도록 한다.
import java.util.*;
import java.io.*;
public class Main{
static class Dol{
int area;
int h;
int w;
public Dol(int area, int h, int w){
this.area = area;
this.h = h;
this.w = w;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
Dol[] arr = new Dol[N];
int[] answer = new int[N];
StringTokenizer st = null;
for(int i=0;i<N;i++){
st = new StringTokenizer(br.readLine()," ");
int area = Integer.parseInt(st.nextToken());
int h = Integer.parseInt(st.nextToken());
int w = Integer.parseInt(st.nextToken());
arr[i] = new Dol(area,h,w);
}
Comparator<Dol> comp = new Comparator<Dol>() {
@Override
public int compare(Dol o1, Dol o2) {
return o2.area - o1.area;
}
};
Arrays.sort(arr,comp);
answer[0] = arr[0].h;
for(int i=1;i<N;i++){
int max = Integer.MIN_VALUE;
int equal =0;
boolean tag = false;
for(int j=0;j<i;j++){
//몸무게 비교
if(arr[j].w >= arr[i].w && max<answer[j]){
max = answer[j];
tag=true;
if(arr[j].w == arr[i].w) equal = max;
}
}
if(tag==false) answer[i] = arr[i].h;
else if(equal==max) answer[i] = equal;
else answer[i] = max + arr[i].h;
}
Arrays.sort(answer);
bw.write(Integer.toString(answer[N-1]));
bw.flush();
bw.close();
br.close();
}
}
비슷하게 접근해야 하는 문제를 발견했다.
백준의 2665번이다.
풀이는 아래와 같다.