Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 2961 도영이가 만든 맛있는 음식
- 1188 음식 평론가
- 14711 java
- 원격 연결 포트 포워딩
- 2661 좋은 수열
- APPEND_SLASH = FALSE
- 2643 java
- Problems occurred while performing provisioning operation
- django
- 1188 java
- 14711 타일 뒤집기
- django apache deploy error
- django windows 배포 에러
- django The requested operation has failed!
- The requested operation has failed!
- django 웹 페이지
- apache pythonpath
- java di
- django settings.py
- 18233 비트마스킹
- 공유기 원격 설정
- 2961 java
- 18233 러버덕
- django httpd error
- 2661 java
- 18233 java
- windows apache wsgi 에러
- 2643 색종이 올려 놓기
- windows 원격 연결 설정
- django 프로젝트 시작
Archives
라이브러리는 도서관 아닌가요
백준 2643 색종이 올려놓기 java (dp) 본문
https://www.acmicpc.net/problem/2643
1. 가장 기본 아이디어는 오름차순 정렬을 한 후, 가장 큰 종이가 있는 맨 뒤부터 접근을 한다.
2. 앞 종이가 뒷 종이의 범위를 벗어나더라도 90도 돌렸을 때는 만족하는 경우가 있는데 이것을 for문 내에서 잡아준다.
3. 아래 조건에서 paperSize[j][0] <= paperSize[j][0]은 왜 포함시켜주지 않는지 궁금할 수 있는데, 필요 없다.
이미 해당 변의 길이는 정렬을 했기 때문이다.
if(paperSize[j][1] <= paperSize[i][1]
|| paperSize[j][1] <= paperSize[i][0] && paperSize[j][0] <= paperSize[i][1])
4. 일반적인 인덱스 정렬 뿐만 아니라, 아래처럼 가로 세로 정렬을 해주었는데, 이것은 꼭 필요하다.
위의 1~3번만 수행했을 때, 반례가 존재하기 때문이다.
// 가로 세로 정렬
for(int i=0; i<n; ++i){
if(paperSize[i][0] < paperSize[i][1]){
int temp = paperSize[i][0];
paperSize[i][0] = paperSize[i][1];
paperSize[i][1] = temp;
}
}
반례)
2
13 14
14 12
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[][] paperSize = new int[n][2]; // 0: 가로, 1: 세로
StringTokenizer st;
for(int i=0; i<n; ++i){
st = new StringTokenizer(br.readLine());
paperSize[i][0] = Integer.parseInt(st.nextToken());
paperSize[i][1] = Integer.parseInt(st.nextToken());
}
// 가로 세로 정렬
for(int i=0; i<n; ++i){
if(paperSize[i][0] < paperSize[i][1]){
int temp = paperSize[i][0];
paperSize[i][0] = paperSize[i][1];
paperSize[i][1] = temp;
}
}
// 인덱스 정렬
Arrays.sort(paperSize, (e1, e2) -> {
if(e1[0] == e2[0]) return e1[1] - e2[1];
else return e1[0] - e2[0];
});
int ans = 1;
int[] dp = new int[n];
Arrays.fill(dp, 1); // 해당 i번째 종이는 무조건 포함된다.
for(int i=n-1; 0<i; --i){
for(int k=1; k<=i; ++k){
int j = i - k;
if(paperSize[j][1] <= paperSize[i][1]
|| paperSize[j][1] <= paperSize[i][0] && paperSize[j][0] <= paperSize[i][1]){
dp[j] = Math.max(dp[j], dp[i]+1);
ans = Math.max(dp[j], ans);
}
}
}
System.out.print(ans);
}
}
'알고리즘 문제' 카테고리의 다른 글
백준 2961 도영이가 만든 맛있는 음식 java (brute force, bit masking) (0) | 2022.09.26 |
---|---|
백준 14711 타일 뒤집기 java (dp) (2) | 2022.09.25 |
백준 1188 음식 평론가 java (greedy, gcd) (0) | 2022.09.22 |
백준 5002 도어맨 java greedy (0) | 2022.09.09 |
백준 6068 시간 관리하기 java greedy (0) | 2022.09.08 |
Comments