얼레벌레

[C++] 프로그래머스 - 카펫 (Lv.2) 본문

Coding/코딩테스트 준비

[C++] 프로그래머스 - 카펫 (Lv.2)

__Lucie__ 2022. 9. 12. 22:47

문제 설명

 

생각해보기

yellow의 테두리 1줄이 갈색이라고 했으므로, 

yellow의 너비와 높이를 w, h라고 한다면

전체 직사각형의 너비와 높이는 w+2, h+2가 된다.

yellow의 넓이는 w*h, brown의 넓이는 (w+2)*(h+2)-w*h 이다.

이 점을 이용해서 생각하면 쉬워진다.

 

  1. yellow를 가지고 모든 약수를 찾는다. (for문 이용, 탐색은 sqrt(yellow)까지만 탐색하면 됨)
    약수를 w, h라고 하자.
  2. 각각 찾은 약수를 w*h, (w+2)*(h+2)를 계산해서 차이값을 구한다.
  3. 그 구한 차이값이 brwon의 면적과 같으면 OK

 

코드

#include <string>
#include <vector>
#include <math.h>

using namespace std;

int calc(int w, int h){
    int newW = w+2;
    int newH = h+2;
    return (newW*newH) - (w*h);
}

vector<int> solution(int brown, int yellow) {
    vector<int> answer;
    for(int i=1; i<=sqrt(yellow); i++) {
        if(yellow % i == 0){
            int ret = calc(i, yellow/i);
            if(ret == brown){
                answer.push_back((yellow/i)+2);
                answer.push_back(i+2);
                break;
            }
        }
    }
    return answer;
}

 

결과