[ 프로그래머스 ] 카펫
문제
https://school.programmers.co.kr/learn/courses/30/lessons/42842
풀이
노란색 격자가 가운데에 존재하고, 갈색 격자가 그 주위를 감싸고 있을 때, 해당 격자의 합은 카펫의 크기이다. 먼저 노란색 격자가 이룰 수 있는 사각형의 최소 인자를 구하고, 이를 통해 사각형을 이루었을 때, 주위에 배치되는 갈색 격자가 조건에 충족할 수 있는지 확인하고 이를 return한다. 다만, 조건으로 ‘카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.’라는 조건이 붙으므로, 내림차순 정렬을 진행 후 return한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <string>
#include <vector>
#include <functional>
#include<cmath>
using namespace std;
vector<int> solution(int brown, int yellow)
{
vector<int> answer;
vector<int> minFactor;
// brown + yellow 가 사각형의 갯수
// 가로와 세로를 곱하면 사각형의 갯수
int sum = brown + yellow;
for (int i = 1; i <= sqrt(yellow); i++)
{
if (yellow % i == 0)
{
minFactor.push_back(i);
if (i != yellow / i)
{
minFactor.push_back(yellow / i);
}
}
}
for (int i = 0; i < minFactor.size(); i += 2)
{
if (minFactor[i] * minFactor[i] == yellow)
{
if ((minFactor[i] + 2) * (minFactor[i] + 2) == sum)
{
answer.push_back(minFactor[i] + 2);
answer.push_back(minFactor[i] + 2);
i++;
}
}
// yellow의 (약수+2) * (약수+2) == result;
if ((minFactor[i] + 2) * (minFactor[i + 1] + 2) == sum)
{
answer.push_back(minFactor[i] + 2);
answer.push_back(minFactor[i+1] + 2);
sort(answer.begin(), answer.end(), greater<int>());
}
}
return answer;
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.