[프로그래머스 Lv2] 카펫

수민이슈·2023년 8월 25일
0

[C++] 코딩테스트

목록 보기
51/116
post-thumbnail

🖊️ 문제

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


🖊️ 풀이

일단,
가로를 x, 세로를 y라고 하면
x * y = brown + yellow (넓이)
이고,
(x-2) * (y-2) = yellow (노란색 넓이)
이렇게 된다.

두 개의 미지수 x, y에 대한 식이 2개 있으니까 이차방정식을 만들 수 있겠다.

다음은 위 두 식을 이용해서 x에 대한 이차방정식을 유도하는 과정 ..

(x-2)(y-2) = yellow
xy - 2x - 2y + 4 = yellow
(yellow + brown) - 2x - 2y + 4 = yellow
brown - 2x - 2y + 4 = 0
0.5brown - x - y = 2
y = - x + 0.5brown + 2
x(-x + 0.5brown + 2) = yellow + brown
-x^2 + (0.5brown + 2)x - (yellow+brown) = 0
x^2 - (0.5brown + 2)x + (yellow + brown) = 0

x^2 - (0.5brown + 2)x + (yellow + brown) = 0
이렇게 x에 대한 이차식을 만들었으니
x값은 근의 공식

을 통해 구할 수 있다.

그래서 x값은 항상 양수이고, y보다 크므로 +라고 가정하면 x를 구하는 식은 다음과 같다.

x = 0.5 * ((0.5*brown + 2) + sqrt(pow((0.5*brown + 2), 2) - 4 * (yellow + brown)))
끝~
easy.

오랜만에 중2수학이라 재밌었다

#include <string>
#include <vector>
#include <cmath>

using namespace std;

vector<int> solution(int brown, int yellow) {
    vector<int> answer;
    
    int x = 0.5 * ((0.5*brown + 2) + sqrt(pow((0.5*brown + 2), 2) - 4 * (yellow + brown)));
    int y = -x + 0.5 * brown + 2;
    
    answer.push_back(x);
    answer.push_back(y);
    
    
    return answer;
}

그래도,,
완전탐색이라 그렇게 풀어보고 싶었고,,
원하는게 위 처럼 푸는게 아닌 것 같아서 좀 풀어서 해봤다.

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

using namespace std;

vector<int> solution(int brown, int yellow) {
    vector<int> answer;
    
    int area = brown + yellow;
    
    int width = area - 3;
    int height = 3;
    
    while(width >= height) {
        if (area % height == 0) {
            width = area / height;
            if ((width - 2) * (height - 2) == yellow) {
                answer.push_back(width);
                answer.push_back(height);
                break;
            }
        }
        width--;
        height++;
    }
    
    
    return answer;
}

0개의 댓글