| 문제 | 레벨 | 정답률 |
|---|---|---|
| 최소직사각형 | Lv.1 | 73% |

class Solution {
public int solution(int[][] sizes) {
int minArea = 0;
int p = 0;
for(int i = 0; i<sizes.length; i++){
if(sizes[i][0] <sizes[i][1]){
p = sizes[i][0];
sizes[i][0] = sizes[i][1];
sizes[i][1] = p;
}
}
int maxWidth = sizes[0][0];
int maxHeight = sizes[0][1];
for(int i = 1; i<sizes.length; i++){
if(sizes[i][0] > maxWidth){maxWidth = sizes[i][0];}
if(sizes[i][1] > maxHeight){maxHeight = sizes[i][1];}
}
minArea = maxWidth * maxHeight;
return minArea;
}
}
우선 최소의 넓이를 구하려면 가로와 세로 길이를 비교해서 큰 값을 가로 길이로, 작은 값을 세로 길이로 바꿔야겠다는 생각을 했다.
-> 카드를 최대한 수납가능하도록 회전하는 과정
그리고 나서 모든 가로 길이와 세로 길이를 비교해서 가장 큰 가로, 세로 길이를 서로 곱하면 최소 직사각형의 넓이가 나온다.
class Solution {
public int solution(int[][] sizes) {
int maxWidth = 0;
int maxHeight = 0;
for (int i = 0; i < sizes.length; i++) {
// Ensure sizes[i][0] is the width and sizes[i][1] is the height
int width = Math.max(sizes[i][0], sizes[i][1]);
int height = Math.min(sizes[i][0], sizes[i][1]);
// Update maximum width and height
if (width > maxWidth) maxWidth = width;
if (height > maxHeight) maxHeight = height;
}
return maxWidth * maxHeight;
}
}
그러나 내가 제시한 코드가 최적의 코드는 아니다.
나는 내가 성공한 문제라도 AI를 활용하여 내 코드를 최적의 코드로 변경시켜보는 편이다.
나는 앞선 코드에서 두 개의 for문을 통해서 가로, 세로 길이를 변경하고 비교했다. 그런데 이는 하나의 반복문으로도 가능한 것.
즉, 비효율적인 코드였다.
그리고 더 큰 값을 비교하여 가로와 세로를 바꾸는 코드 역시 더 간단하게 줄일 수 있었다.
Math.max() & Math.min()을 활용해서 단 두 줄로 구현 가능한 것이었다.
여전히 알고 있는 것들을 실제로 활용하는 것이 잘 안되고 있다는 걸 깨달았다.
사실 나는 프로그래머스에서 코딩테스트 문제를 풀면, 1레벨은 무조건 쉽고 2레벨은 대부분 어렵다.
그래서 그동안은 2레벨만 도전을 해왔는데, 요즘에는 2레벨로 가려면 부족한 기초 실력을 채워야한다는 느낌이 들었고 1레벨도 꾸준히 풀어나가고 있다.
언젠가 2레벨도 1레벨처럼 술술 풀리는 날이 오길 바라며..!