오답노트

프로그래머스 1단계 - 최소직사각형 - 오답노트 본문

C,C++/코딩테스트

프로그래머스 1단계 - 최소직사각형 - 오답노트

권멋져 2022. 5. 28. 19:50
https://programmers.co.kr/learn/courses/30/lessons/86491?language=cpp 
 

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

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

- 문제 파악

배열의 크기가 2이고 요소가 모두 정수인 배열A로 이루어진 배열B을 입력 받는다. 배열 A들로 각각 직사각형을 만들수 있는데, 배열B에 포함된 모든 배열 A를 포함하는 최소 직사각형의 넓이를 구하여라. (배열 A는 90도 회전이 가능하다)

 

- 나의 접근

1. 가로 세로 크기와 돌렸을 때 가로 세로 크기를 확인하여 가장 최소로 만들수 있는 가로 세로를 찾는 방법

    경우의 수가 너무 많고 복잡해서 예외 처리를 계속해야하는 문제가 있었다. 결국 예상치 못한 예외를 처리 할 수 없었다.

2. 현재 가로 세로 크기와 다음 가로 세로 크기 중 가장 큰 수와 두번째로 작은 수를 곱하는 방법

    정답에는 근접했으나 가로 세로로 나누지 않아서 틀렸었다.

 

- 정답

나의 접근 2번에서 가로 세로로 나누기만 하면 된다. 그 후에 그중에서 가장 큰 애들만 계속 골라가면 된다.

복잡한 문제를 간단하게 만드는 능력을 길러야겠다.

 

#include <string>
#include <vector>

using namespace std;

int solution(vector<vector<int>> sizes) {
    int answer = 0;
    
    int nMin = min(sizes[0][0], sizes[0][1]);
    int nMax = max(sizes[0][0], sizes[0][1]);
    
    for(auto s : sizes)
    {
        int tmpMin = min(s[0], s[1]);
        int tmpMax = max(s[0], s[1]);
        
        nMin = max(tmpMin ,nMin );
        nMax = max(tmpMax ,nMax );
        
    }
    
    answer = nMin * nMax;
    
    return answer;
}