Coding Test/[Java] 완전 탐색

[프로그래머스 / Java] Lv.1 최소직사각형 - 연습 문제 (2) with ChatGPT

annovation 2025. 12. 20. 22:04

📘 연습 문제 : 태블릿 거치대 최소 크기

 

문제 설명

여러 종류의 태블릿을 하나의 거치대에 보관하려고 합니다.
각 태블릿은 가로 길이와 세로 길이가 주어지며,
태블릿은 가로·세로를 회전해서 놓을 수 있습니다.

모든 태블릿을 올려둘 수 있는 거치대의 최소 넓이를 구하세요.


입력

  • tablets : 2차원 정수 배열
    • tablets[i][0] : i 번째 태블릿의 가로 길이
    • tablets[i][1] : i 번째 태블릿의 세로 길이

출력

  • 모든 태블릿을 올릴 수 있는 거치대의 최소 넓이

제한 사항

  • 1 ≤ tablets.length ≤ 10,000
  • 1 ≤ tablets[i][0], tablets[i][1] ≤ 2,000

예시

tablets = [[10, 6], [7, 12], [8, 5]]

설명

  • 회전 가능하므로 각 태블릿을 (큰 값, 작은 값) 형태로 통일
    • (10,6), (12,7), (8,5)
  • 최대 가로 = 12
  • 최대 세로 = 7
  • 결과 = 12 × 7 = 84

Algorithm

  1. 태블릿의 가로와 세로 길이는 회전 가능하므로 긴 길이는 가로, 짧은 길이는 세로로 고정한다.
  2. 각 태블릿의 길이를 순회하며 긴 쪽과 짧은 쪽을 변수에 저장한다.

Code

class Solution {
    public int solution(int[][] tablets) {
        
        // 거치대 가로 최댓값
        int maxWidth = 0;
        
        // 거치대 세로 최댓값
        int maxLength = 0;
        
        // 각 태블릿 순회하며 가로, 세로 최댓값 확인
        for (int = 0; i < tablets.length; i++) {
        
            // 태블릿 두 변의 길이 중 긴 쪽
            int longer = Math.max(tablets[i][0], tablets[i][1]);
            
            // 태블릿 두 변의 길이 중 짧은 쪽
            int shorter = Math.min(tablets[i][0], tablets[i][1]);
            
            // 가로 길이 최댓값 갱신
            maxWidth = Math.max(maxWidth, longer);
            
            // 세로 길이 최댓값 갱신
            maxHeight = Math.max(maxHeight, shorter);
        }
        
        return maxWidth * maxHeight;
    }
}

시간 복잡도

  • for 문을 활용하여 태블릿의 개수만큼 1번 순회하므로 상수 시간 O(1) 연산
  • 따라서 전체 시간 복잡도는 O(N)

문제 링크

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

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr