N

(프로그래머스 c++)카펫 본문

프로그래머스 알고리즘/2단계

(프로그래머스 c++)카펫

naeunchan 2020. 5. 18. 10:54
728x90
반응형

완전 탐색으로 문제를 풀었다..!

우선 카펫의 총 격자수를 sum과 current에 저장하고,

while문으로 current > 1 일 때까지 반복하였다.

 

while문 내부)

우선 sum의 약수를 구해야 하기 때문에

sum % current == 0인 수만 찾도록 한다.

row는 나누려고 하는 수, col은 sum / current를 했을 때의 몫이다.

그러면 row * col == sum 이므로 약수가 된다.

 

약수를 구했다면 이제 brown과 yellow의 개수가 맞는지 확인해야 한다.

우선 col > 1이여야 한다. 왜냐하면 yellow의 개수를 구할 때 col - 2 를 해야하는데

음수가 나오면 안되기 때문이다.

그리고 문제에 나와있듯이 가로의 길이는 세로 길이와 같거나 길다고 하였기 때문에

row >= col 이여야 한다.

마지막으로 row * 2 < brown 인지 확인해야 한다.

만약 위 조건이 모두 true라면 yellow의 개수가 맞는지 확인하면 된다.

checkY = row * (col - 2) - (2 * (col - 2))를 계산하여 yellow와 같은지 확인한 후

같으면 answer에 넣어주고 리턴해주면 된다..!

간단하게 그림으로 나타내면 위와 같다..!

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

using namespace std;

vector<int> solution(int brown, int yellow) {
    vector<int> answer;
    int current = brown + yellow;
    int sum = current;
    
    while(current > 1)
    {
        if(sum % current == 0)
        {
            int row = current;
            int col = sum / current;
            
            if(col > 1 && row >= col && row * 2 < brown)
            {
                int checkY = row * (col - 2) - (2 * (col - 2));
                
                if(checkY == yellow)
                {
                    answer.push_back(row);
                    answer.push_back(col);
                    return answer;
                }
            }
        }
        current--;
    }
    return answer;
}
728x90
반응형