[プログラマ]最小長方形


質問する


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

に答える


名刺の縦横最大サイズを求めればOKです.
しかし、横棒に変えて名刺を入れると、もっと小さな名刺を作ることも可能です.
そのため、以下のケースを確認する必要があります.
最初のインデックスは
  • で、横と縦の値を入力するだけです.
  • の2回目から、横値と現在の横値との差、既存の縦値と既存の縦値との差が現れる絶対値を求め、その和を求める.
  • 以降、横方向値と現在の縦方向値との差、既存の縦方向値と既存の横方向値との差が現れる絶対値を求め、その和を求める.
  • 2 2番が3番未満の場合、横方向値と現在の横方向値の最大値、既存の縦方向値、および現在の縦方向値が現れる最大値を求める.
  • 3番が2番未満の場合、横方向値と現在の縦方向値の最大値、既存の縦方向値、および現在の横方向値が現れる最大値を求める.
  • コード#コード#

    	public int solution(int[][] sizes) {
            int answer = 0;
            int w = Integer.MIN_VALUE, h = Integer.MIN_VALUE;
    
            for (int i = 0; i < sizes.length; i++) {
    
                // 첫번째 인덱스는 그냥 넣어준다.
                if (i == 0) {
                    w = sizes[i][0];
                    h = sizes[i][1];
                } else {
    
                    // w와 현재 가로값의 차이의 절대값, h와 현재 세로값의 차이의 절대값의 합
                    int abs = Math.abs(w - sizes[i][0]) + Math.abs(h - sizes[i][1]);
                    // w와 현재 세로값의 차이의 절대값, h와 현재 가로값의 차이의 절대값의 합
                    int abs_reverse = Math.abs(w - sizes[i][1]) + Math.abs(h - sizes[i][0]);
    
                    // 위 두개 값 중에서 기존 절대값 합이 더 작으면 기존대로 가로, 세로의 최대값을 구해준다.
                    if (abs < abs_reverse) {
                        w = Math.max(w, sizes[i][0]);
                        h = Math.max(h, sizes[i][1]);
                    } else {
                        // 그게 아니라면 가로, 세로값을 바꿔서 가로, 세로의 최대값을 구해준다.
                        w = Math.max(w, sizes[i][1]);
                        h = Math.max(h, sizes[i][0]);
                    }
                }
            }
    
            answer = w * h;
    
            return answer;
        }