✔ 최소직사각형
문제 분석하기
눕혀 수납할 수 있으므로 명함에 대한 가로 길이를 가로 길이와 세로 길이 중 더 긴 것으로 swap할 수 있는 것이므로
각 명함 번호마다 최대 값은 가로 길이로, 최소 값은 세로 길이로 설정한 후
가로 길이와 세로 길이의 전체 최대 값을 찾아 지갑의 크기를 구함
손으로 풀어보기
- 모든 명함을 탐색하면서 현재 명함의 가로 길이와 세로 길이를 설정
- 최대 값은 가로 길이
- 최소 값은 세로 길이
- 최대 가로(세로) 길이와 현재 가로(세로) 길이를 비교하여 더 큰 것으로 갱신
- 최대 가로 길이 * 최대 세로 길이 반환
슈도코드 작성하기
sizes(모든 명함의 가로 길이와 세로 길이)
width(최대 가로 길이)
height(최대 세로 길이)
for(sizes만큼) {
가로 길이와 세로 길이 중 더 긴 것을 가로 길이로 변경
가로 길이와 세로 길이 중 더 짧은 것을 세로 길이로 변경
최대 가로 길이와 현재 가로 길이를 비교하여 더 큰 것으로 갱신
최대 세로 길이와 현재 세로 길이를 비교하여 더 큰 것으로 갱신
}
widht * height 리턴
코드 구현하기
/**
* 86491) 최소직사각형
*/
public class K001_86491 {
// sizes(모든 명함의 가로 길이와 세로 길이)
public int solution(int[][] sizes) {
// width(최대 가로 길이)
int width = 0;
// height(최대 세로 길이)
int height = 0;
for (int i = 0; i < sizes.length; i++) {
// 가로 길이와 세로 길이 중 더 긴 것을 가로 길이로 변경
int w = Math.max(sizes[i][0], sizes[i][1]);
// 가로 길이와 세로 길이 중 더 짧은 것을 세로 길이로 변경
int h = Math.min(sizes[i][0], sizes[i][1]);
// 최대 가로 길이와 현재 가로 길이를 비교하여 더 큰 것으로 갱신
width = Math.max(width, w);
// 최대 세로 길이와 현재 세로 길이를 비교하여 더 큰 것으로 갱신
height = Math.max(height, h);
}
// widht * height 리턴
return width * height;
}
// 테스트 케이스
public static void main(String[] args) {
K001_86491 solution = new K001_86491();
int[][] sizes = { { 60, 50 }, { 30, 70 }, { 60, 30 }, { 80, 40 } };
int result = solution.solution(sizes);
System.out.println(result);
}
}
'Coding Test > Java 알고리즘 실전' 카테고리의 다른 글
[42895] N으로 표현 (0) | 2023.10.31 |
---|---|
[42862] 체육복 (0) | 2023.10.30 |
[42748] K번째수 (0) | 2023.10.29 |
[42626] 더 맵게 (0) | 2023.10.28 |
[12906] 같은 숫자는 싫어 (0) | 2023.10.28 |