Publish:

태그: ,

카테고리:

https://school.programmers.co.kr/learn/courses/30/lessons/42842
난이도 ⭐⭐

문제

Carpet


나의 풀이

처음엔 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 + yellowi로 나눈 값을 가로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;
}

이슈 및 공부한 것을 기록해두는 개인 블로그 입니다. 댓글, 피드백 환영합니다 🙂

Update:

댓글남기기