[42842] 카펫 ⭐⭐
태그: cpp, Programmers
카테고리: Programmers
https://school.programmers.co.kr/learn/courses/30/lessons/42842
난이도 ⭐⭐
문제
나의 풀이
처음엔 for문 2개를 돌려서 풀었는데 시간 초과가 떠버렸다. 그래서 for문을 1개로 줄여보았다.
문제풀이 감을 못잡았다가 입출력 예를 보고 return 값이 brown + yellow 값의 약수라는 걸 알았다.
가로, 세로 값은 무조건 3 이상이어야 한다. brown 안에 yellow가 최소 1칸은 있으니까,
yellow를 감싸는 brown은 양 옆 +1 해서 최소 총 3칸이 나온다. 그래서 for문의 i값도 3부터 시작한다.
가로, 세로 값은brown + yellow
값의 약수니까 나누어 떨어져야 한다. 그래서if (sum % i == 0)
로 나누어 떨어지는지 판별했다.
나누어 떨어진다면brown + yellow
를i
로 나눈 값을 가로width
로 정하고, (그럼 세로는 자연스레i
값이 될 것이다.brown + yellow
값은 넓이니까)
width - 2
값이yellow
와 나눠서 떨어진다면i
는 세로가 될 수 있다.
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
#include <string>
#include <vector>
using namespace std;
vector<int> solution(int brown, int yellow)
{
vector<int> answer;
int sum = brown + yellow;
for (int i = 3; i < sum; i++)
{
if (sum % i == 0) // i가 나누어 떨어지는 수라면...
{
int width = sum / i;
if (yellow % (width - 2) == 0)
{
answer.push_back(width);
answer.push_back(i);
break;
}
}
}
return answer;
}
댓글남기기