알고리즘/완전탐색
프로그래머스 - 최소직사각형(Java)
연향동큰손
2025. 1. 13. 16:53
https://school.programmers.co.kr/learn/courses/30/lessons/86491
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
처음에는 제귀알고리즘을 사용해서 가로 새로가 바뀐 모든 경우의 수에서 넓이의 최소값을 구하려고 했는데 너무 복잡해졌다.
이 문제를 풀면서 너무 알고리즘의 틀에만 박혀서 문제를 풀면 더욱 어려워질 수 도 있다는 것을 알게 되었다.
지금까지 문제를 보면 어떤 알고리즘을 적용 할지부터 생각하는 나 자신을 반성하게 되었다.
정해진 알고리즘을 적용하는것이 아닌 사고방식만 틀어서 적용하면 더욱 쉽게 풀 수 있는 문제가 있는데 이게 바로 그 문제이다.
문제 해결
문제는 모든 명함을 넣을 수 있는 지갑의 최소 넓이를 구하면 된다.
가로의 최대값 * 세로의 최대값으로 하면 모든 명함을 지갑에 넣을 수는 있지만 넓이가 최소값이 아니다.
따라서 이런 방법을 적용 해야한다.
더 넓은 쪽으로 눕히기.....
더 넓은 쪽으로 눕히면
만약 가로가 세로보다 크면 ==> 그대로 두기
만약 세로가 가로보다 크면 ==> 눕혀서 가로 세로변경
import java.util.*;
class Solution {
public int solution(int[][] sizes) {
int answer = 0;
int max_h = 0;
int max_v = 0;
for(int i=0; i<sizes.length; i++){
int h = Math.min(sizes[i][0],sizes[i][1]);
int v = Math.max(sizes[i][0],sizes[i][1]);
max_h = Math.max(h,max_h);
max_v = Math.max(v,max_v);
}
answer= max_h*max_v;
return answer;
}
}
2025년 03월 18일 풀이
import java.util.*;
class Solution {
public int solution(int[][] sizes) {
int[] width = new int[sizes.length];
int[] height = new int[sizes.length];
for(int i=0; i<sizes.length; i++){
int x = sizes[i][0];
int y = sizes[i][1];
if(x>y){
width[i]=x;
height[i]=y;
}
else{
width[i]=y;
height[i]=x;
}
}
Arrays.sort(width);
Arrays.sort(height);
return width[width.length-1] * height[height.length-1];
}
}