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

urzi·2022년 3월 21일
0

PS

목록 보기
3/36

문제

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

풀이

명함의 가로 세로 최대 크기를 구해주면 된다.
하지만 가로 세로를 바꿨을 때 명함이 들어간다면 더 작은 크기로도 명함을 만들 수 있는 경우가 있다.
때문에 아래 케이스를 확인해 봐야 한다.

  1. 첫번째 인덱스는 그냥 가로, 세로 값을 넣어준다.
  2. 두번째부터 기존 가로값과 현재 가로값의 차이, 기존 세로값과 기존 세로값의 차이의 절대값을 구하고 그 합을 구한다.
  3. 다음에는 기존 가로값과 현재 세로값의 차이, 기존 세로값과 기존 가로값의 차이의 절대값을 구하고 그 합을 구한다.
  4. 만약 2번이 3번보다 작으면 기존 가로값과 현재 가로값의 최대값, 기존 세로값과 현재 세로값의 최대값을 구해준다.
  5. 만약 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;
    }
profile
Back-end Developer

0개의 댓글