본문 바로가기

개발자 강화/코딩 테스트

[프로그래머스] 최소직사각형 - 완전탐색 (c++)

언어제한 코테 대비를 위해 C++과 친해지는 시간을 가져보자

 

lv.1 가장 간단한 문제!

 

파이썬으로 코테 준비를 해왔는데,

후배가 c++이 파이썬 list랑 비슷한 기능을 지원해서 괜찮다길래 써보려고 함

 

https://school.programmers.co.kr/learn/courses/30/lessons/86491?language=cpp

 

프로그래머스

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

programmers.co.kr

 

가로 세로 길이가 각각 다른 명함이 있고

이 명함들을 다 담을 수 있는 최소 가로세로를 가진 명함 케이스의 너비를 구해야 한다

 

여기에서 각 배열 요소의 sizes[i][0]과 sizes[i][1]의 각 max값을 구하면 편할 수 있지만

sizes[i]의 각 [0],[1] 번째 요소가 sort되어 있지 않기 때문에

sort부터 해줘야 한다

 

그래서 처음에는 파이썬에서 풀 듯이 for문을 돌면서

각 요소에 sort()를 해주려고 했는데,

c++은 그렇게 간단하지 않았다

 

그래서 for문을 돌면서 각 [0],[1]번째 요소를 비교해서

큰값을 가로, 작은 값을 세로로 지정하고,

 

기존 전역변수의 max가로, max 세로값과 비교해서 더 큰 값을 업데이트 하도록 했다

 

최종 결과는 전역변수의 max가로세로 값을 곱해 너비를 구하자

 

#include <string>
#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

int solution(vector<vector<int>> sizes) {
    int answer = 0;
    int max_width=0;
    int max_height=0;
    sort(sizes.begin(), sizes.end());
    for (int i=0; i<sizes.size(); i++){
        //각 단계에서 두 요소 중 큰 값이 가로, 작은 값이 세로가 되도록
        int width = max(sizes[i][0], sizes[i][1]);
        int height = min(sizes[i][0], sizes[i][1]);
        
        //가로세로 세팅을 마친 후, 기존의 max 가로세로값과 비교해서
        //더 큰 값을 저장
        max_width = max(max_width, width);
        max_height = max(max_height, height);
    }
    answer = max_width*max_height;
    return answer;
}

 

알고리즘 보다는 문법에 익숙해지는 연습을 하자!