일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 백준
- health
- 2020
- coding
- 코딩 테스트
- Movie
- 카카오
- usaco
- 완전탐색
- Greedy
- Recursive
- benefits
- array
- 알고리즘
- BFS
- 추천
- 영화
- kakao
- parametric search
- 나는솔로
- 리뷰
- Algorithm
- silver
- review
- BOJ
- 수능
- 영어
- 해설
- 넷플릭스
- Netflix
Archives
- Today
- Total
Young
2020 카카오 신입사원 코딩테스트 - 블록 이동하기 본문
728x90
반응형
https://programmers.co.kr/learn/courses/30/lessons/60063
오늘은 2020 카카오 코딩테스트 풀이 다섯번째 시간 입니다.
이번 문제는 아주 전형적인 BFS + 구현 문제 입니다.
BFS의 기초는 https://yomyom0824.tistory.com/3?category=1081200 여기에서 익히고 오시면 됩니다.
여기서 배울 부분은 단순 동서남북 이동에 대한 것보다는 '회전에 대한 것' 입니다.
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
|
#include <string>
#include <vector>
#include <iostream>
#include <queue>
using namespace std;
struct pos{
int y[2], x[2];
int dir[2];
};
int n;
int dy[] = {0,1,0,-1}; // -> 0 / 아래 1 / <- 2 / 위 3
int dx[] = {1,0,-1,0};
bool chk[101][101][4];
bool range(int y1, int x1, int y2, int x2, int dir1, int dir2, vector<vector<int>> &mp){
return !(y1 < 0 || y1 >= n || x1 < 0 || x1 >= n || y2 < 0 || y2 >= n || x2 < 0 || x2 >= n || mp[y1][x1] || mp[y2][x2]);
}
int solution(vector<vector<int>> mp) {
n = mp.size();
queue<pos> q;
// -> 0 / 아래 1 / <- 2 / 위 3
chk[0][0][0] = chk[0][1][2] = true;
q.push({0,0,0,1,0,2});
int timer = 0;
while(!q.empty()){
int l = q.size();
while(l--){
pos f = q.front();
q.pop();
if((f.y[0] == n - 1 && f.x[0] == n - 1) || (f.y[1] == n - 1 && f.x[1] == n - 1)) return timer;
for(int dir = 0; dir < 4; dir++){
int ny1 = f.y[0] + dy[dir], nx1 = f.x[0] + dx[dir];
int ny2 = f.y[1] + dy[dir], nx2 = f.x[1] + dx[dir];
int dir1 = f.dir[0], dir2 = f.dir[1];
if(!range(ny1, nx1, ny2, nx2, dir1, dir2, mp) || chk[ny1][nx1][dir1] || chk[ny2][nx2][dir2]) continue;
chk[ny1][nx1][dir1] = chk[ny2][nx2][dir2] = true;
q.push({ny1, ny2, nx1, nx2, dir1, dir2});
}
for(int i = -1; i <= 1; i++){
if(i == 0) continue;
for(int j = 0; j < 2; j++){
int y = f.y[j], x = f.x[j];
int dir = (f.dir[j] + i + 4) % 4;
int prev_dir = (dir - i + 4) % 4;
int oppo_dir = (dir + 2) % 4;
int ny2 = y + dy[dir], nx2 = x + dx[dir];
int ny3 = y + dy[dir] + dy[prev_dir], nx3 = x + dx[dir] + dx[prev_dir];
if(!range(ny2, nx2, ny3, nx3, dir, oppo_dir, mp) || chk[y][x][dir] || chk[ny2][nx2][oppo_dir]) continue;
chk[y][x][dir] = chk[ny2][nx2][oppo_dir] = true;
q.push({y, ny2, x, nx2, dir, oppo_dir});
}
}
}
timer += 1;
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
728x90
반응형
'코딩 테스트 대비 추천 문제' 카테고리의 다른 글
프로그래머스 - 124 나라의 숫자 (4) | 2019.12.27 |
---|---|
2020 카카오 신입사원 코딩테스트 - 가사 검색 (0) | 2019.12.19 |
2020 카카오 신입사원 코딩테스트 - 자물쇠와 열쇠 (0) | 2019.12.18 |
2020 카카오 신입사원 코딩테스트 - 괄호 변환 (0) | 2019.12.17 |
2020 카카오 신입사원 코딩테스트 - 문자열 압축 (0) | 2019.12.16 |