본문 바로가기
알고리즘

[프로그래머스/JAVA] 최소직사각형(8주차)

by 상후 2021. 10. 3.
728x90
반응형

 

 

https://github.com/ROUTINE-STUDY/Algorithm

알고리즘 스터디를 진행하고 있습니다. 😊
초보들로 구성되어있으며, 열심히 풀어보고 풀이 방식을 공유하고 피드백을 해주는 스터디입니다.
참여 문의는 댓글 혹은 GitHub 주소를 참고해주세요.

문제 출처 : https://programmers.co.kr/learn/courses/30/lessons/86491

 

코딩테스트 연습 - 8주차

[[10, 7], [12, 3], [8, 15], [14, 7], [5, 15]] 120 [[14, 4], [19, 6], [6, 16], [18, 7], [7, 11]] 133

programmers.co.kr

문제 설명

출처 : 프로그래머스 위클리챌린지 8주차 최소직사각형

 

모든 명함을 담을 수 있는 가장 작은 명함지갑의 크기를 반환하세요.
풀이 방법
1. 각 명함의 가로, 세로 중 큰 값을 한쪽(가로)으로 정렬(SWAP)합니다.
2. 명함들 중 가로의 최댓값과 세로의 최댓값을 구하여 곱해주면 명함지갑의 크기입니다.
내 코드(JAVA)

 

public class Solution {

    public int solution(int[][] sizes) {
        int maxWidth = 0;
        int maxHeight = 0;

        for(int[] card : sizes) {
            // 가로/세로 길이 중 세로가 더 크면 명함을 회전시킴(기준 바꿔도 상관없음)
            if(card[0] < card[1]) {
                int temp = card[0];
                card[0] = card[1];
                card[1] = temp;
            }

            // 가로, 세로 최대값 구하기
            if(maxWidth < card[0]) maxWidth = card[0];
            if(maxHeight < card[1]) maxHeight = card[1];
        }

        // 최대 가로 * 세로 = 명함지갑 크기
        return maxWidth * maxHeight;
    }

}

 

다른 사람 코드 분석 및 리팩토링

다른 분의 풀이를 보니 굳이 정렬(SWAP)을 할 필요가 없음을 확인했습니다.

명함의 가로/세로 중 큰 값은 큰 값끼리, 작은 값은 작은 값끼리 비교하여 명함지갑의 크기를 구할 수 있습니다.

 

위 풀이법을 토대로 다시 풀이한 코드입니다. 

 

public int solution_2(int[][] sizes) {
    int maxWidth = 0;
    int maxHeight = 0;

    for(int[] card : sizes) {
        int max = Math.max(card[0], card[1]);
        int min = Math.min(card[0], card[1]);

        if(maxWidth < max) maxWidth = max;
        if(maxHeight < min) maxHeight = min;
    }

    return maxWidth * maxHeight;
}

 

굳이 정렬(SWAP)하지 않아도 되고 깔끔하네요.

 

 

 

728x90
반응형

댓글