-

[프로그래머스] 레벨 2 - 카펫 본문

1-4. 프로그래머스

[프로그래머스] 레벨 2 - 카펫

asdklfjlasdlfkj 2020. 2. 7. 20:51

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

 

코딩테스트 연습 - 카펫 | 프로그래머스

Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 빨간색으로 칠해져 있고 모서리는 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다. Leo는 집으로 돌아와서 아까 본 카펫의 빨간색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다. Leo가 본 카펫에서 갈색 격자의 수 brown, 빨간색 격자의 수 red가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수

programmers.co.kr

프로그래머스 완전탐색 문제다.

DFS나 BFS, 비트마스킹, next_permutation 사용한 건 아니고

규칙을 찾는 문제였다.

 

나같은 경우 가장 바깥 갈색 영역의 가로의 길이를 W, 세로의 길이를 H로 지정하고,

내부에 있는 빨간색 부분의 가로의 길이를 w, 세로의 길이를 h로 지정했다.

 

그리고 전체 카펫의 넓이의 반부터 W를 내려가면서 H와의 조합을 찾은 뒤,

마찬가지 방법으로 빨간색 넓이의 반 부터 w를 내려가면서 h와 조합을 찾고

W와 w, H와 h크기를 비교한 뒤, 위아래, 양옆의 간격이 짝수인지 확인해서 빨간색 부분이 가운데에 있는 것을 확인했다.

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
#include <string>
#include <vector>
 
using namespace std;
int W, H, w, h;
vector<int> solution(int brown, int red) {
    bool out = false;
    vector<int> answer;
    int total = brown + red;
    for(W = total/2; W>=1; W--){
        if(total % W == 0){
            H = total / W;
            for(w = red; w >= 1; w--){
                if(red % w == 0){
                    h = red / w;
                    if(W > w && H > h){
                        if(((W-w) % 2== 0 && ((H-h) % 2== 0){
                            answer.push_back(W);
                            answer.push_back(H);
                            out = true;
                            break;
                        }
                    }
                }
            }
            if(out) break;
        }
    }
    return answer;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

Comments