기술 블로그

외벽 점검 본문

알고리즘 문제/Programmers

외벽 점검

parkit 2020. 4. 3. 14:15
728x90
반응형

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


카카오 kakao 백트래킹 BruteForce 브루트포스 기출 복습 구현 필수 추천 코테 코딩 프로그래머스


2020 KAKAO BLIND RECRUITMENT



처음에 bitmask + dp로 풀려다가 인덱스를 몇 차원으로 해야할지 무엇으로 구성해야할지 헷갈려서 그냥 Backtracing으로 접근하였다.



핵심은 모든 경우의 수(조합)에 대하여 vector v를 구성한다.


그리구, 구성한 vector v에 대하여 또 다시 weak에서 출발점을 달리하여 새로운 weak(temp)를 구성한다.(temp = 새로운 weak)



예시) 

weak = {3, 5, 7, 9}, n = 12라고 하고, 출발점을 7로 한다면, temp = {7, 9, 3+12, 5+12}로 구성한다. 

(첨부한 코드의 14 ~ 23번 째 줄)



그리고, 순서가 들어있는 vector v에서 원소를 하나씩 꺼내고dist[v[v에 꺼낸 것]]를 pos에 저장한다. (26번 째 줄)


이때, pos가 얼마나 temp를 커버할 수 있는 검사한다.(첨부한 코드의 29 ~ 32번 째 줄)


마지막으로 a가 temp.size()와 같다는 것은 모든 weak를 커버했다는 의미이므로, ret에 최솟값과 비교하여 저장한다.






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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include<bits/stdc++.h>
 
using namespace std;
 
int N, len, ans = 1e9;
bool use[10];
 
int simulation(vector<int> &v, vector<int> &weak, vector<int> &dist)
{
    int ret = 1e9;
 
    // 출발점
    for (int i = 0; i < weak.size(); i++) {        
        vector<int> temp;
 
        // weak를 출발점을 기준으로 새롭게 구성
        for (int j = i; j < weak.size(); j++) {
            temp.push_back(weak[j]);
        }
 
        for (int j = 0; j < i; j++) {
            temp.push_back(weak[j] + len);
        }
 
        int a = 0;
        for (int b = 0; a < temp.size() && b < v.size(); b++) {
            int pos = temp[a];
            pos += dist[v[b]];
            while (a < temp.size() && pos >= temp[a])
            {
                ++a;
            }
        }
 
        if (a == temp.size()) {
            ret = min(ret, (int)v.size());
        }
    }
 
    return ret;
}
 
void bt(vector<int> &v, vector<int> &weak, vector<int> &dist)
{
    if (!v.empty()) {
        ans = min(ans, simulation(v, weak, dist));
    }
 
    for (int i = 0; i < N; i++) {
        if (!use[i]) {
            v.push_back(i);
            use[i] = true;
 
            bt(v, weak, dist);
 
            use[i] = false;
            v.pop_back();
        }
    }
}
 
int solution(int n, vector<int> weak, vector<int> dist) {
    N = dist.size();
    len = n;
    sort(dist.begin(), dist.end());
 
    vector<int> v;
    bt(v, weak, dist);
 
    return ans == 1e9 ? -1 : ans;
}
 
int main()
{
    //freopen("C:\\Users\\park7\\Desktop\\buba.in.6", "r", stdin);
    cin.tie(0);
 
    //vector<int> w = { 1, 5, 6, 10 }, d = { 1, 2, 3, 4 };
    //vector<int> w = { 1, 3, 4, 9, 10 }, d = { 3, 5, 7 };
    vector<int> w = { 19 }, d = { 3 };
 
    printf("%d\n", solution(12, w, d));
 
    return 0;
}
cs










728x90
반응형

'알고리즘 문제 > Programmers' 카테고리의 다른 글

예산  (0) 2020.06.24
N으로 표현  (0) 2020.06.24
블록 이동하기  (0) 2020.04.01
지형 이동  (0) 2020.03.01
단속카메라  (0) 2020.03.01