기술 블로그

블록 이동하기 본문

알고리즘 문제/Programmers

블록 이동하기

parkit 2020. 4. 1. 20:59
728x90
반응형

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


2020 KAKAO BLIND RECRUITMENT 카카오


bfs 구현


처음 풀었을 당시에 못 풀었던 문제이다.


내가 작성 중이었던 코드를 보니 map까지 활용하고 있었다. 왜지?



하여튼 오늘 다시 풀어봤는데 한 번에 통과하였다.


핵심은 ㅡ과 | 모양에 따른 구현을 다르게 해주고, 

각각의 모양에서도 어떤 위치를 중심축으로 정할 것이고 또한, 

그 중심축에서도 어느 방향으로 회전할 것인지에 대한 BFS를 구현하면 된다.




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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#include<bits/stdc++.h>
 
using namespace std;
 
#define Max 101
 
int n, m[Max][Max];
int dy[4= { 010-1 };
int dx[4= { 10-10 };
bool visit[Max][Max][Max][Max];
queue < pair<pair<intint>pair<intint> > > q; // *-*
 
bool isMove(int r1, int c1, int r2, int c2)
{
    if (r1 < 0 || r1 >= n || c1 < 0 || c1 >= n) {
        return false;
    }
 
    if (r2 < 0 || r2 >= n || c2 < 0 || c2 >= n) {
        return false;
    }
 
    if (visit[r1][c1][r2][c2]) {
        return false;
    }
 
    if (m[r1][c1] == 1 || m[r2][c2] == 1) {
        return false;
    }
 
    return true;
}
 
int solution(vector<vector<int> > board)
{
    int answer = 0;
    n = board.size();
    
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            m[i][j] = board[i][j];
        }
    }
 
    visit[0][0][0][1= true;
    q.push({ {00}, {01} });
 
    while (!q.empty())
    {
        int qs = q.size();
 
        while (qs--)
        {
            int r1 = q.front().first.first;
            int c1 = q.front().first.second;
            int r2 = q.front().second.first;
            int c2 = q.front().second.second;
 
            q.pop();
 
            if ((r1 == n - 1 && c1 == n - 1|| (r2 == n - 1 && c2 == n - 1)) {
                return answer;
            }
 
            for (int i = 0; i < 4; i++) {
                int y1 = r1 + dy[i];
                int x1 = c1 + dx[i];
                int y2 = r2 + dy[i];
                int x2 = c2 + dx[i];
 
                if (isMove(y1, x1, y2, x2)) {
                    visit[y1][x1][y2][x2] = true;
                    q.push({ {y1,x1}, {y2, x2} });
                }
            }
 
            // ㅡ 모양
            if (r1 == r2) {
                // r1, c1 중심축
                if (r1 - 1 >= 0 && c1 + 1 < n && m[r1 - 1][c1] == 0 && m[r1 - 1][c1 + 1== 0 && !visit[r1 - 1][c1][r1][c1]) {
                    visit[r1 - 1][c1][r1][c1] = true;
                    q.push({ {r1 - 1, c1}, {r1, c1} });
                }
 
                if (r1 + 1 < n && c1 + 1 < n && m[r1 + 1][c1] == 0 && m[r1 + 1][c1 + 1== 0 && !visit[r1][c1][r1 + 1][c1]) {
                    visit[r1][c1][r1 + 1][c1] = true;
                    q.push({ { r1, c1 },{ r1 + 1, c1 } });
                }
 
                // r2, c2 중심축
                if (r2 - 1 >= 0 && c2 - 1 >= 0 && m[r2 - 1][c2 - 1== 0 && m[r2 - 1][c2] == 0 && !visit[r2 - 1][c2][r2][c2]) {
                    visit[r2 - 1][c2][r2][c2] = true;
                    q.push({ {r2 - 1, c2}, {r2, c2} });
                }
 
                if (r2 + 1 < n && c2 - 1 >= 0 && m[r2 + 1][c2 - 1== 0 && m[r2 + 1][c2] == 0 && !visit[r2][c2][r2 + 1][c2]) {
                    visit[r2][c2][r2 + 1][c2] = true;
                    q.push({ {r2,c2}, {r2 + 1, c2} });
                }
            }
            // | 모양
            else {
                // r1, c1 중심축
                if (r1 + 1 < n && c1 - 1 >= 0 && m[r1][c1 - 1== 0 && m[r1 + 1][c1 - 1== 0 && !visit[r1][c1 - 1][r1][c1]) {
                    visit[r1][c1 - 1][r1][c1] = true;
                    q.push({ {r1, c1 - 1}, {r1, c1} });
                }
 
                if (r1 + 1 < n && c1 + 1 < n && m[r1][c1 + 1== 0 && m[r1 + 1][c1 + 1== 0 && !visit[r1][c1][r1][c1 + 1]) {
                    visit[r1][c1][r1][c1 + 1= true;
                    q.push({ {r1, c2}, {r1, c1 + 1} });
                }
 
                // r2, c2 중심축
                if (r2 - 1 >= 0 && c2 - 1 >= 0 && m[r2 - 1][c2 - 1== 0 && m[r2][c2 - 1== 0 && !visit[r2][c2 - 1][r2][c2]) {
                    visit[r2][c2 - 1][r2][c2] = true;
                    q.push({ {r2, c2 - 1}, {r2, c2} });
                }
 
                if (r2 - 1 >= 0 && c2 + 1 < n && m[r2 - 1][c2 + 1== 0 && m[r2][c2 + 1== 0 && !visit[r2][c2][r2][c2 + 1]) {
                    visit[r2][c2][r2][c2 + 1= true;
                    q.push({ {r2, c2}, {r2, c2 + 1} });
                }
            }
        }
 
        ++answer;
    }
 
    return answer;
}
 
int main()
{
    //freopen("C:\\Users\\park7\\Desktop\\buba.in.6", "r", stdin);
    cin.tie(0);
 
    vector<vector<int> > v = {
        {00011},
        {00010},
        {01011},
        {11001},
        {00000}
    };
 
    printf("%d\n", solution(v));
 
    return 0;
}
cs














728x90
반응형

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

N으로 표현  (0) 2020.06.24
외벽 점검  (0) 2020.04.03
지형 이동  (0) 2020.03.01
단속카메라  (0) 2020.03.01
종이접기  (0) 2020.03.01