Algorithm/프로그래머스

[고득점kit/완전탐색]최소직사각형

녱녱 2023. 6. 20.


import java.util.*;

class Solution {
    public int solution(int[][] sizes) {
        int answer = 0;
        int a = 0;
        List<Integer> list = new ArrayList<>(); //가로    
        List<Integer> list2 = new ArrayList<>();    //세로
        for(int i = 0; i< sizes.length; i++){
            list.add(sizes[i][0]);
        }
        for(int i = 0; i< sizes.length; i++){
            list2.add(sizes[i][1]);
        }
        Collections.sort(list);
        Collections.sort(list2);
        
        if(list.get(list.size()- 1) > list2.get(list.get(list.size()- 1))) {
            a = list.get(list.size()- 1);
        } else{
            a =  list2.get(list.size()- 1);
        }
        
        return answer;
    }
}

처음엔 이런식으로 각각 가로/세로별로 리스트를 따로 만들어서 정렬 한 후 비교를 하려고 했었는데 이렇게 해버리니까 눕히는 경우를 생각하기 너무 복잡해지고 비교할 것들이 너무 많아져서 다른 방법을 생각해봤다

class Solution {
    public int solution(int[][] sizes) {
        int answer = 0;
        int max_w = 0;
        int max_h = 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]);   //세로 길이 설정, 가로를 max로 잡았으므로 min은 자동으로 세로
            max_w = Math.max(max_w, w);
            max_h = Math.max(max_h, h);
        }
        answer = max_w * max_h;
            
        return answer;
    }
}

명함을 다 눕혀서 생각하는 방식을 사용해봤다! 훨씬 깔끔하고 적은 코드로 해결이 가능했다

class Solution {
    public int solution(int[][] sizes) {
        int length = 0, height = 0;
        for (int[] card : sizes) {
            length = Math.max(length, Math.max(card[0], card[1]));
            height = Math.max(height, Math.min(card[0], card[1]));
        }
        int answer = length * height;
        return answer;
    }
}

명함을 돌리는것과 비교하는 것을 한 번에도 할 수 있다..!

댓글