개발하는 kim-hasa

[c++][프로그래머스] 카펫 본문

Algorithm/Programmers(c++)

[c++][프로그래머스] 카펫

kim-hasa 2021. 8. 16. 01:10

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

 

코딩테스트 연습 - 카펫

Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다. Leo는 집으로 돌아와서 아까 본 카펫의 노란색과

programmers.co.kr

카펫의 가로와 세로의 길이를 구하는 문제입니다.

 

먼저 주어진 갈색과 노란색 타일을 더합니다. 그러면 총 타일의 개수가 나옵니다.

 

그 후 세로 길이를 증가시켜 가면서 노란색 타일의 가로와 세로를 구합니다.

 

이때, 바깥은 노란색 타일의 가로세로에 2를 더한 값이므로, 그 두 값을 더한 값이 전체 타일과 같은지 비교합니다.

 

만약 맞다면 그대로 리턴하고, 아니라면 세로의 길이를 1증가시킨후 다시 계산합니다.

#include <string>
#include <vector>

using namespace std;

vector<int> solution(int brown, int yellow) {
    vector<int> answer;
    int all = brown + yellow;   // 총 타일의 갯수
    
    int height = 1;     // 가로
    int width;          // 세로
    int bigWidth;       // 큰 사각형 가로
    int bigHeight;      // 큰 사각형 세로
    
    while(true)
    {
        if(yellow % height == 0)        // 나눠진다면
        {
            width = yellow / height;    // 가로 구하기
            bigWidth = width + 2;       // 큰 사각형은 가로세로가 각 2씩 더 큼
            bigHeight = height + 2;
            
            if(bigWidth * bigHeight == all)     // 곱한 값이 전체 타일의 개수와 같다면 리턴
            {
                answer.push_back(bigWidth);
                answer.push_back(bigHeight);
                break;
            }
            else
            {
                height++;       // 세로 증가
            }
        }
        else
        {
            height++;           // 세로 증가
        }
    }
    
    return answer;
}