Java

[Java] 프로그래머스 - 최소 직사각형

Eunice99 2024. 10. 23. 21:17

다시 시작된 알고리즘...완탐부터 차근히 가봅니다~

https://school.programmers.co.kr/learn/courses/30/lessons/86491

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

처음 생각한 풀이

1. 미리 지갑 경우의 수를 다 만들어두고

2. 가장 작은 것부터 명함을 올려서 확인하는데

3. 중간에 하나라도 크면 return 하고 다 작으면 그 지갑의 크기를 return 하려고 했다.

import java.util.*;
import java.io.*;

class Solution {
    public int solution(int[][] sizes) {
        int answer = 0;
        int minSize = Integer.MAX_VALUE;
        
        // 미리 지갑 경우의 수를 다 만들어둔다. (list로)
        int n = sizes.length; // 명함 개수 
        List<Integer> list = new ArrayList<>();
        for(int i=0;i<sizes.length;i++) {
            
        }
        
        Collections.sort(list); // 오름차순 정렬 
        
        // 가장 작은 것 부터 올리면서 명함을 확인하는데 
        for(int i=0;i<list.size;i++) {
            // 확인할 때 뒤집힌 경우까지 같이 확인해서 
            int mul1 = sizes[i][0] * sizes[i][1]; 
            int mul2 = sizes[i][1] * sizes[i][0];
            
            // 중간에 하나라도 크면 그냥 return 종료 
            if(mul1<list.get(i)) return;
            if(mul2<list.get(i)) return;
            
            // 근데 모든 경우가 다 지갑의 경우보다 같거나 작으면 그때 그 지갑의 크기를 return 
            answer = 
        }
        
        return answer;
    }
}

 

근데 이렇게 풀면 시간복잡도가 터진다...배열의 길이가 10000이라는데 저렇게 계속 돌면 시간복잡도가 재밌다 히 이렇게 풀면 코드 길이 쓰레기 된다 히히 

 

그래서 아이디어를 생각해야 한다. !! 

가로를 두 변 중에서 긴 부분으로 세로를 두 변 중에서 작은 부분으로 

 

그럼 왜 이렇게 두면 풀리는걸까? 

가로를 두 변 중에 긴 부분으로 하면 모든 명함을 그냥 눕히는 과정이 된다. 

애초에 처음 생각할 때 부터 눕히고 시작하는거다. 가로를 눕히고 시작하면 세로 길이가 가장 큰 걸 찾아서 곱하면 그 값이 만들 수 있는 지갑 크기 중 가장 작은 지갑이 된다! 

import java.util.*;
import java.io.*;

class Solution {
    public int solution(int[][] sizes) {
        int answer = 0;
        
        // 1. 가로를 두 변 중에 긴 부분 
        // 2. 세로를 두 변 중에 작은 부분 
        // 3. 그래서 각각의 max 를 곱하면 가장 최소 
        
        int maxGaro = Integer.MIN_VALUE;
        int maxSero = Integer.MIN_VALUE;
        
        for(int i=0;i<sizes.length;i++) {
            // 가로, 세로 중에 큰 걸 가로에 두고, 작은 걸 세로에 두고 
            if(sizes[i][0]<sizes[i][1]) {
                int tmp = sizes[i][0];
                sizes[i][0] = sizes[i][1];
                sizes[i][1] = tmp;
            }
            maxGaro = Math.max(sizes[i][0], maxGaro);
            maxSero = Math.max(sizes[i][1], maxSero);
        }
        
        answer = maxGaro * maxSero;
        
        return answer;
    }
}