미로 탐색 성공
| 시간 제한 | 메모리 제한 | 제출 | 정답 | 맞은 사람 | 정답 비율 |
| 1 초 | 192 MB | 62619 | 22706 | 14445 | 35.210% |
문제
N×M크기의 배열로 표현되는 미로가 있다.
| 1 | 0 | 1 | 1 | 1 | 1 |
| 1 | 0 | 1 | 0 | 1 | 0 |
| 1 | 0 | 1 | 0 | 1 | 1 |
| 1 | 1 | 1 | 0 | 1 | 1 |
미로에서 1은 이동할 수 있는 칸을 나타내고, 0은 이동할 수 없는 칸을 나타낸다. 이러한 미로가 주어졌을 때, (1, 1)에서 출발하여 (N, M)의 위치로 이동할 때 지나야 하는 최소의 칸 수를 구하는 프로그램을 작성하시오. 한 칸에서 다른 칸으로 이동할 때, 서로 인접한 칸으로만 이동할 수 있다.
위의 예에서는 15칸을 지나야 (N, M)의 위치로 이동할 수 있다. 칸을 셀 때에는 시작 위치와 도착 위치도 포함한다.
입력
첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.
출력
첫째 줄에 지나야 하는 최소의 칸 수를 출력한다. 항상 도착위치로 이동할 수 있는 경우만 입력으로 주어진다.
예제 입력
4 6
101111
101010
101011
111011
예제 출력
15
코드
#include
#include
#include
int map[101][101];
std::queue<std::pair<int,int>> que;
int n = 0, m = 0;
int dist = 0;
void BFS()
{
que.push(std::pair<int, int>(1, 1));
dist++;
while (!que.empty())
{
int size = que.size();
for (int ii = 0; ii < size; ii++)
{
std::pair<int, int> pair = que.front();
que.pop();
int row = pair.first;
int col = pair.second;
map[row][col] = 0;
if (row == n && col == m)
std::cout << dist << std::endl;
if (map[row - 1][col] == 1) //up
{
map[row - 1][col] = 0;
que.emplace(std::pair<int, int>(row - 1, col));
}
if (map[row + 1][col] == 1) //down
{
map[row + 1][col] = 0;
que.emplace(std::pair<int, int>(row + 1, col));
}
if (map[row][col - 1] == 1) //left
{
map[row][col - 1] = 0;
que.emplace(std::pair<int, int>(row, col - 1));
}
if (map[row][col + 1] == 1) //right
{
map[row][col + 1] = 0;
que.emplace(std::pair<int, int>(row, col + 1));
}
}
dist++;
}
}
int main()
{
std::cin >> n >> m;
for (int ii = 1; ii <= n; ii++)
{
std::string str;
std::cin >> str;
for (int j = 1; j <= m; j++)
{
map[ii][j] = str[j - 1] - '0';
}
}
BFS();
}
숨바꼭질 성공
| 시간 제한 | 메모리 제한 | 제출 | 정답 | 맞은 사람 | 정답 비율 |
| 2 초 | 128 MB | 69336 | 18873 | 11747 | 24.675% |
문제
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다.
수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.
입력
첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.
출력
수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.
예제 입력
5 17
예제 출력
4
힌트
수빈이가 5-10-9-18-17 순으로 가면 4초만에 동생을 찾을 수 있다.
코드
#include
#include
#include
//int* visit;
//int* road;
int visit[100001];
std::queue que;
int sec = 0;
void BFS(int SuzinPos, int DestPos)
{
que.push(SuzinPos);
while (!que.empty())
{
int size = que.size();
for (int ii = 0; ii < size; ii++)
{
int pos = que.front();
que.pop();
if (pos == DestPos)
{
std::cout << sec;
return;
}
if (pos - 1 >= 0 && visit[pos - 1] == 0)
{
visit[pos - 1] = 1;
que.push(pos - 1);
}
if (pos + 1 <= 100001 && visit[pos + 1] == 0)
{
visit[pos + 1] = 1;
que.push(pos + 1);
}
if (pos * 2 <= 100001 && visit[pos * 2] == 0)
{
visit[pos * 2] = 1;
que.push(pos * 2);
}
}
sec++;
}
}
int main()
{
int N, K;
std::cin >> N >> K;
BFS(N, K);
}
간단한 DFS 두문제에 이어 간단한 BFS 두 문제
간단한 문제인데도 한달동안 까먹어서 많이 버벅였다.
DFS/BFS는 패턴이 비슷해서 자주자주 봐둬서 체화하면 잊어버리지 않을 것 같다.
'프로그래머스' 카테고리의 다른 글
| 1068번 : 트리 (0) | 2020.03.02 |
|---|---|
| 7576 토마토(BFS) (0) | 2020.03.02 |
| DFS 두 문제 (0) | 2020.02.27 |
| 힙 - 디스크 컨트롤러 (0) | 2019.12.30 |
| 그래프 - 순위 (0) | 2019.12.27 |