'구현'과 'BFS'를 이용한 문제이다.
참고, velof.io/@madpotato1713/백준-13460-구슬탈출2
풀이
간단히 말해, 구슬의 이동경로를 모두 찾는다.
max count 가 10이고, map도 최대 가로, 세로의 길이가 10이기 때문에 가능한 방법일 것 같다.
BFS를 해결하기 위해, 재귀함수를 이용하여 풀었으며, 다음과 같은 순서로 알고리즘을 구현하였다.
- 한쪽 방향으로 양 구슬의 움직임이 없을때까지 움직인다. 움직이는 방향(상, 하, 좌, 우)은 매개변수를 통해 받는다.
- 움직임이 없다면(첫 구슬의 위치와 같다면) 곧바로 return
- 빨간 구슬과 파란 구슬의 위치가 같다면, 위치를 조정해준다.
예를 들어, '상' 위치로 움직였을 경우 빨간 구슬과 파란 구슬의 위치가 같았을 때, 처음의 y좌표가 빨간 구슬이 4, 파란 구슬이 5였다면 파란 구슬의 y 좌표값에 1을 더해준다. - 다음 이동 결과를 결정할 수 있도록 for문으로 상, 하, 좌, 우 위치정보를 차례대로 넘겨주며 동일 함수를 호출한다
구슬의 이동경로를 모두 찾아서 해결하였다.
Pseudo Code
int Solution(count, Red 위치, Blue 위치, 이동방향){
if(count > 10)
return INF;
rx = Red 위치.x;
ry = Red 위치.y;
bx = Blue 위치.x;
by = Blue 위치.y;
res = INF;
While('.'로 Red 이동)
if(hole)
break;
While('.'로 Blue 이동)
if(hole)
return res = INF;
if(Blue hole)
return res;
if(Red/Blue 모두 움직이지 않음)
return res = INF;
if(Red와 Blue 겹침)
안 겹치게 Red/Blue 이동;
for(i; 상/하/좌/우)
res = min(res, Solution(count + 1, 이동된 Red 위치, 이동된 Blue 위치, i));
}
1. Solution 코드
2. 알아야 할 개념
1) 상하좌우 움직이는 (x, y) 좌표 구현
// 상하좌우 방향으로 움직이는 (x, y)좌표
int dx[4] = {0, 0, -1, 1};
int dy[4] = {1, -1, 0, 0};
for(int i = 0; i < 4; i++){
x = x + dx[i];
y = y + dy[i];
}'알고리즘 > 백준 BOJ' 카테고리의 다른 글
| 1012. 유기농 배추 (0) | 2022.07.03 |
|---|---|
| 1978. 소수 찾기 (0) | 2022.04.06 |
| [삼성기출] 백준 - C++ 상어 초등학교 (0) | 2021.10.17 |
| [삼성기출] 백준 - C++ 마법사 상어와 비바라기 (0) | 2021.10.16 |
| [삼성기출] 백준 - C++ 마법사 상어와 블리자드 (0) | 2021.10.15 |
댓글