일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- gradle
- 프로그래머스
- 2019 카카오 공채
- CS 스터디
- Baekjoon
- 2018 KAKAO BLIND RECRUITMENT 1차
- 비트마스크
- 2019 카카오 개발자 겨울 인턴십 코딩테스트
- 2020 카카오 공채
- 카카오
- dfs
- 젠킨스
- 알고리즘
- Java
- bfs
- 2020 KAKAO BLIND RECRUITMENT
- 부스트코스
- 2018 카카오
- 백준
- 카카오 공채
- set
- 삼성 SW 역량테스트
- c++
- 삼성 SW 기출문제
- map
- 자바
- 2018 카카오 공채
- 2019 KAKAO BLIND RECRUITMENT
- 2018 KAKAO BLIND RECRUITMENT
- gcp
Archives
- Today
- Total
아무코딩
[2020 KAKAO BLIND RECRUITMENT] 블록 이동하기 본문
풀이
- bfs를 사용한다. 이유는 특정 depth의 모든 경우를 탐색하기 위함.
- 방문 위치 표시 방법 : 가로모드 1개, 세로 모드 1개 고려한 2차원 visted 배열로 구성
- 한 번에 할 수 있는 것들 : 상하좌우 이동, 회전
회전 경우의 수는 위와 같이 그려서 케이스를 분리해 보았다.
검사 시 중복을 최소화하는 방향으로 묶어주었다.
파란색 동그라미는 저장되는 좌표 빨간 글씨는 거치는 점이다.
1,2,3,4의 경우 가로에서 세로 5,6,7,8의 경우는 세로에서 가로로 이동하는 경우이다.
소스코드
더보기
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
|
#include <string>
#include <vector>
#include <queue>
#include <iostream>
#define HORIZONTAL 0
#define VERTICAL 1
using namespace std;
typedef struct Robot {
int row;
int col;
int dir;
int time;
Robot(int r, int c, int d, int t) { row = r; col = c; dir = d; time = t; }
}Robot;
int dir_row[4] = {1,0,-1,0};
int dir_col[4] = {0,-1,0,1};
int turn_row[2][4] = { {0,0,-1,-1},{1,1,0,0} };
int turn_col[2][4] = { {0,1,0,1},{0,-1,0,-1} };
int visited[2][101][101];
queue<Robot> q;
bool checkEnd(Robot cur,int n) {
return true;
}
else {
return true;
}
return false;
}
//범위 넘을때, 벽일때 false 반환
bool canMoveNext(int r, int c, int d,vector<vector<int>> board) {
int b_size = board.size();
if (r < 0 || r >= b_size|| c < 0 || c >= b_size)
return false;
if (board[r][c] == 1)
return false;
if (d == HORIZONTAL) {
if (c + 1 >= b_size || board[r][c+1] ==1)
return false;
}
else {
if (r + 1 >= b_size || board[r + 1][c] == 1)
return false;
}
return true;
}
//회전시 범위가 넘을때, 회전 중간에 벽만나는지 체크
bool canTurnRobot(Robot cur, int next_row, int next_col, vector<vector<int>> board) {
int b_size = board.size();
return false;
return false;
}
else { // 위로 돌리는 회전
return false;
return false;
}
}
else {// 세->가
return false;
return false;
}
else {
return false;
return false;
}
}
return true;
}
int BFS(vector<vector<int>> board) {
q.push(Robot(0, 0, HORIZONTAL, 0));
while (!q.empty()) {
Robot cur = q.front();
q.pop();
//cout << cur.row << ","<< cur.col <<" : "<< cur.dir << endl;
if (checkEnd(cur, board.size())) {
return cur.time;
}
//회전말고 네방향 이동
for (int i = 0; i < 4; i++) {
continue;
}
}
//회전
for (int i = 0; i < 4; i++) { //4가지 방법의 회전
if (!canTurnRobot(cur, next_row, next_col, board))
continue;
if (!visited[next_dir][next_row][next_col]) {
visited[next_dir][next_row][next_col] = 1;
}
}
}
}
int solution(vector<vector<int>> board) {
return BFS(board);
}
int main() {
vector<vector<int>> board = { {0, 0, 0, 1, 1},{0, 0, 0, 1, 0},{0, 1, 0, 1, 1},{1, 1, 0, 0, 1},{0, 0, 0, 0, 0} };
cout << solution(board) << endl;
}
|
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/60063
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[2019 카카오 개발자 겨울 인턴십 코딩테스트] 문제2. 튜플 (0) | 2020.04.03 |
---|---|
[2019 카카오 개발자 겨울 인턴십 코딩테스트] 문제1. 크레인 인형뽑기 게임 (0) | 2020.04.03 |
[2019 KAKAO BLIND RECRUITMENT] 블록 게임 (0) | 2020.04.01 |
[2020 KAKAO BLIND RECRUITMENT] 괄호 변환 (0) | 2020.03.24 |
[2020 KAKAO BLIND RECRUITMENT] 문자열 압축 (0) | 2020.03.16 |
Comments