본문 바로가기
코딩테스트/프로그래머스

[프로그래머스/java] 최소 직사각형

by drCode 2022. 2. 23.
728x90
반응형

 

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

 

코딩테스트 연습 - 최소직사각형

[[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

 

이번 문제는 Min, Max만 잘 써도 쉽게 풀리는 문제이다

 

문제 설명 중에

 

"가장 긴 가로 길이와 세로 길이가 각각 80, 70이기 때문에 80(가로) x 70(세로) 크기의 지갑을 만들면 모든 명함들을 수납할 수 있습니다. 하지만 2번 명함을 가로로 눕혀 수납한다면 80(가로) x 50(세로) 크기의 지갑으로 모든 명함들을 수납할 수 있습니다. 이때의 지갑 크기는 4000(=80 x 50)입니다."

 

라고 설명되어 있다.

 

예를 들어 애초에 가로를 더 큰 수로 맞추고, 세로를 더 작은 수로 맞추면 두 수를 비교하기가 쉬워진다.

 

가로 세로의 길이를 Math.min(a, b)과  Math.max(a, b) 를 써서 했다면 더 쉽게 풀었을 것 같다.

 

나의 풀이는 아래와 같다.

 

package miniRactangular;

/**
 * 최소직사각형 문제
 * 
 * https://programmers.co.kr/learn/courses/30/lessons/86491
 * 
 * 이번문제는 Min, Max만 잘 써도 쉽게 풀 수 있음
 */

public class MiniRactangular {
	public static void main(String[] args) {
		Solution s = new Solution();
		int[][] sizes1 = {{60, 50}, {30, 70}, {60, 30}, {80, 40}};	
		System.out.println(s.solution(sizes1));
		
		int[][] sizes2 = {{10, 7}, {12, 3}, {8, 15}, {14, 7}, {5, 15}};
		System.out.println(s.solution(sizes2));
		
		int[][] sizes3 = {{14, 4}, {19, 6}, {6, 16}, {18, 7}, {7, 11}};
		System.out.println(s.solution(sizes3));
	}
}

class Solution {
    public int solution(int[][] sizes) {
        int maxW = Integer.MIN_VALUE;
        int maxH = Integer.MIN_VALUE;
        
        for (int i = 0; i < sizes.length; i++) {
			int w, h;
			
			int tmp1 = sizes[i][0];
			int tmp2 = sizes[i][1];
			
			w = tmp1 > tmp2 ? tmp1 : tmp2;
			h = tmp1 < tmp2 ? tmp1 : tmp2;
			
			maxW = Math.max(maxW, w);
			maxH = Math.max(maxH, h);
		}
        
        return maxW * maxH;
    }
}
728x90
반응형

댓글