일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- #알고리즘 #백준 #17837 #백준17837 #algorithm #baekjoon #baekjoon17837 #C++
- #알고리즘 #백준 #2573 #백준2573 #algorithm #baekjoon #baekjoon2573 #C++
- #알고리즘 #백준 #12094 #백준12094 #algorithm #baekjoon #baekjoon12094 #C++
- #알고리즘 #백준 #2580 #백준2580 #algorithm #baekjoon #baekjoon2580 #Java
- 스레드 #동시성 #thread #process #
- 클린코드
- #알고리즘 #algorithm #프로그래머스 #2020카카오공채 #문자열압축 #programmers #C++
- #알고리즘 #백준 #17406 #백준17406 #algorithm #baekjoon #baekjoon17406 #C++
- #알고리즘 #algorithm #프로그래머스 #2020카카오공채 #블록이동하기 #programmers #C++
- 개발서
- #알고리즘 #백준 #17140 #백준17140 #algorithm #baekjoon #baekjoon17140 #C++
- 책리뷰
- #알고리즘 #백준 #1987 #백준1987 #algorithm #baekjoon #baekjoon1987 #Java
- #알고리즘 #백준 #5214 #백준5214 #algorithm #baekjoon #baekjoon5214 #C++
- #알고리즘 #백준 #17136 #백준17136 #algorithm #baekjoon #baekjoon17136 #C++
- #알고리즘 #백준 #1260 #백준1260 #algorithm #baekjoon #baekjoon1260 #Java
- CleanCode
- #알고리즘 #algorithm #프로그래머스 #2020카카오공채 #외벽점검 #programmers #C++
- #알고리즘 #백준 #4386 #백준4386 #algorithm #baekjoon #baekjoon4386 #C++
- #알고리즘 #백준 #2352 #백준2352 #algorithm #baekjoon #baekjoon2352 #C++
- #알고리즘 #백준 #3190 #백준3190 #algorithm #baekjoon #baekjoon3190 #C++
- #알고리즘 #백준 #15684 #백준15684 #algorithm #baekjoon #baekjoon15684 #C++
- #알고리즘 #백준 #17472 #백준17472 #algorithm #baekjoon #baekjoon17472 #C++
- #알고리즘 #백준 #14888 #백준14888 #algorithm #baekjoon #baekjoon14888 #C++
- 개발자취미
- #알고리즘 #백준 #1793 #백준1793 #algorithm #baekjoon #baekjoon1793 #C++
- #알고리즘 #백준 #1525 #백준1525 #algorithm #baekjoon #baekjoon1525 #C++
- #알고리즘 #algorithm #프로그래머스 #2020카카오공채 #괄호변환 #programmers #C++
- #알고리즘 #백준 #15683 #백준15683 #algorithm #baekjoon #baekjoon15683 #C++
- #알고리즘 #백준 #2616 #백준2616 #algorithm #baekjoon #baekjoon2616 #Java
Archives
- Today
- Total
개발자 일기장.
[2020 카카오 공채] 블록 이동하기 본문
블록 이동하기
Problem?
문제 링크 : [2020 카카오 공채] 블록 이동하기
Solution
bfs문제
bfs()를 통해 가능 경로를 탐색한다
핵심적인 내용은 아래의 그림을 보면서 참고
가정 isSafeTurn : 회전가능 여부확인 solution() : 문제 해결 코드
struct robot : queue에 넣을 구조체 turnDir : 회전하는 경우 이동 경로 safeTurn : 안전한 회전 여부 확인을 위한 위치 goDir : 회전하지 않는 경우 이동 경로 visited : 방문 여부 확인 <y, x, dir> N : 배열의 사이즈 |
Code(핵심 코드)
int bfs(vector<vector<int>> board, int y, int x) {
queue<robot> q; // queue
robot t(0, 0, 1, 0);
q.push(t);
visited[0][0][1] = true;
while (!q.empty()) {
int curY = q.front().y; int curX = q.front().x;
int curDir = q.front().dir; int curCnt = q.front().cnt;
q.pop();
// end state
if (curDir) { // 가로
if (curY == N - 1 && (curX + 1) == N - 1)
return curCnt;
}
else { // 세로
if ((curY + 1) == N - 1 && curX == N - 1)
return curCnt;
}
// turn case (회전)
for (int i = 0; i < 4; i++) {
if (curDir == 1) { // 가로 -> 세로
int nextY = curY + turnDir[i].first;
int nextX = curX + turnDir[i].second;
int nextDir = (curDir == 0) ? 1 : 0;
if (0 <= nextY && nextY < N - 1 && 0 <= nextX && nextX < N)
if (!board[nextY][nextX] && !board[nextY + 1][nextX] && !visited[nextY][nextX][nextDir])
if (isSafeTurn(board, nextY, nextX, curDir, i)) {
robot tmp(nextY, nextX, nextDir, curCnt + 1);
q.push(tmp);
visited[nextY][nextX][nextDir] = true;
}
}
else { // 세로 -> 가로
int nextY = curY + turnDir[i].second;
int nextX = curX + turnDir[i].first;
int nextDir = (curDir == 0) ? 1 : 0;
if (0 <= nextY && nextY < N && 0 <= nextX && nextX < N - 1)
if (!board[nextY][nextX] && !board[nextY][nextX + 1] && !visited[nextY][nextX][nextDir])
if (isSafeTurn(board, nextY, nextX, curDir, i)) {
robot tmp(nextY, nextX, nextDir, curCnt + 1);
q.push(tmp);
visited[nextY][nextX][nextDir] = true;
}
}
}
// go back case (앞뒤로 왔다갔다하는 경우)
for (int i = 0; i < 4; i++) {
if (curDir) { // 가로 -> 가로
int nextY = curY + goDir[i].first;
int nextX = curX + goDir[i].second;
if (0 <= nextY && nextY < N && 0 <= nextX && nextX < N - 1) {
if (!board[nextY][nextX] && !board[nextY][nextX + 1] && !visited[nextY][nextX][curDir]) {
robot tmp(nextY, nextX, curDir, curCnt + 1);
q.push(tmp);
visited[nextY][nextX][curDir] = true;
}
}
}
else { // 세로 -> 세로
int nextY = curY + goDir[i].first;
int nextX = curX + goDir[i].second;
if (0 <= nextY && nextY < N - 1 && 0 <= nextX && nextX < N) {
if (!board[nextY][nextX] && !board[nextY + 1][nextX] && !visited[nextY][nextX][curDir]) {
robot tmp(nextY, nextX, curDir, curCnt + 1);
q.push(tmp);
visited[nextY][nextX][curDir] = true;
}
}
}
}
}
return -1; // error code
}
bfs()문제
* 문제 있을 시 삭제하겠습니다.
'취업 > Algorithm.' 카테고리의 다른 글
백준 17472. 다리만들기2 (0) | 2020.04.10 |
---|---|
백준 17406. 배열 돌리기4 (0) | 2020.03.28 |
[2020 카카오 공채] 문자열 압축 (0) | 2020.03.22 |
백준 17136. 색종이 붙이기 (0) | 2020.03.22 |
백준 1525. 퍼즐 (0) | 2020.03.22 |