프로그래머스/완전탐색

[프로그래머스] Level 1. 최소직사각형

믕비 2024. 3. 30. 16:33

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

[문제 접근]

회전이 가능하기 때문에 가로와 세로는 의미가 없음.

1. 전체 길이 중 가장 긴 길이의 값 저장.  -> 80, 가로라고 가정

2. 반대(세로)의 길이만 고려해주면 됨.

3. 세로의 길이가 모든 명함 가로, 세로 값 중 적어도 하나의 수보다 크면 됨.

 

[풀이과정]

1. 입력되는 배열을 탐색

2. 명함의 가로, 세로 중 더 작은 값을 비교하며 그 중 가장 긴 값을 저장한다.

3. 모든 길이 중 가장 긴 길이의 값을 저장한다.

-> N(n)

 

[코드]
방식 1

class Solution {
    public int solution(int[][] sizes) {
        int answer = 0;
        //가장 긴 길이
        int max = Integer.MIN_VALUE;
        //작은 수 중 가장 긴 길이
        int maxOfmin = Integer.MIN_VALUE;
        
        for(int i = 0; i < sizes.length; i++){
            int first;//더 큰 수
            int second;//더 작은 수
            
            if(sizes[i][0] >= sizes[i][1]){
                first = sizes[i][0];
                second = sizes[i][1];
            }else{
                first = sizes[i][1];
                second = sizes[i][0];
            }
            
            max = first > max ? first : max;
            maxOfmin = second > maxOfmin ? second : maxOfmin;
        }
        
        return max*maxOfmin;
    }
}

방식 2 (더 좋은 코드)

class Solution {
    public int solution(int[][] sizes) {
        int answer = 0;
        //가장 긴 길이
        int max = Integer.MIN_VALUE;
        //작은 수 중 가장 긴 길이
        int maxOfmin = Integer.MIN_VALUE;
        
        for(int i = 0; i < sizes.length; i++){
            int first = sizes[i][0] >= sizes[i][1] ? sizes[i][0] : sizes[i][1];
            int second = sizes[i][0] < sizes[i][1] ? sizes[i][0] : sizes[i][1];
            
            max = first > max ? first : max;
            maxOfmin = second > maxOfmin ? second : maxOfmin;
        }
        
        return max*maxOfmin;
    }
}

[고민한 부분]
방식 1은 if문으로 비교를 한 번만 하고

방식 2는 람다식으로 비교를 두 번 해야 해서 미묘하긴 해도 방식 2가 더 느릴 거라고 생각했는데 수행시간은 큰 차이가 없었다.
이유는

1. 컴파일러가 최적화를 수행하여 동일한 최적화된 바이트코드로 변환일 수 있음.

2. 현대의 하드웨어에서는 조건 분기 수행 시간이 매우 짧기 때문에 실제 수행시간에 큰 영향을 미치지 않음.

 

따라서 코드의 가독성과 유지보수성을 고려하여 보다 간결하고 이해하기 쉬운 방식으로 코드를 작성하는 것이 좋다.