반응형
리뷰
아주 기초적인 BFS 문제였다. 맵의 왼쪽 상단에서 오른쪽 하단으로 이동하고, 걸린 시간을 출력하는 문제
전역 변수
- dx, dy : 상하좌우 4방향으로 이동하기 위한 방향 배열
- v : BFS시 방문 처리 및 걸린 시간을 계산하기 위한 정수형 배열, 맵의 최대 크기인 100 * 100으로 초기화
- n, m : 맵의 행의 수 n, 맵의 열의 수 m
- Pos : BFS시 현재 위치 정보를 저장하기 위한 구조체
함수
1. bfs
int bfs(const vector<vector<int>>& maps)
맵을 탐색하며 우측 하단으로 갈 수 있는지 여부와, 걸리는 시간을 리턴하는 함수
- 구조체 Pos타입의 큐 q를 초기화 하고 초기 위치 0, 0을 추가해 준다.
- memset 메서드를 통해 방문 배열을 초기화 해주고, 초기위치에 방문 처리를 해준다.
- 큐가 빌때까지 반복문을 수행하고, 4방향 탐색을 하며 모든 맵에 방문한다.
- 단, 맵의 범위를 벗어나거나 이미 방문한 위치나 맵 상에서 벽에 막혀있는 경우는 이동하면 안된다.
- 이동에 성공했을 경우 현재 위치의 방문 값 + 1을 이동 위치의 v배열에 최신화 해주고 좌표를 큐에 추가해 준다.
- 만약 현재 위치가 우측 하단이라면 현재 위치의 방문값을 리턴해 준다.
- 반복문이 끝날때 까지 목표 위치까지 도달하지 못했다면 -1을 리턴해 준다.
문제풀이
- n, m을 맵의 행, 열의 개수로 초기화 해준다.
- answer변수에 bfs함수의 리턴값을 저장해 준다. 매개변수로는 맵 정보를 전달한다.
- answer를 리턴해 준다.
참고 사항
시뮬레이션을 돌려보니 시작 위치부터 거리가 1인 상태인 문제이다.
정답 코드
#include<bits/stdc++.h>
using namespace std;
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
int v[100][100];
int n, m;
struct Pos {
int x, y;
};
int bfs(const vector<vector<int>>& maps) {
queue<Pos> q;
q.push({0, 0});
memset(v, 0, sizeof(v));
v[0][0] = 1;
while(!q.empty()) {
Pos pos = q.front(); q.pop();
int cx = pos.x, cy = pos.y;
if (cx == n - 1 && cy == m - 1) return v[cx][cy];
for (int i = 0; i < 4; i++) {
int nx = cx + dx[i], ny = cy + dy[i];
if (0 <= nx && nx < n && 0 <= ny && ny < m && !v[nx][ny] && maps[nx][ny]) {
v[nx][ny] = v[cx][cy] + 1;
q.push({nx, ny});
}
}
}
return -1;
}
int solution(vector<vector<int>> maps)
{
n = maps.size();
m = maps[0].size();
int answer = bfs(maps);
return answer;
}
728x90
반응형
'알고리즘 공부 > C++' 카테고리의 다른 글
[D5] 백준 18185번 라면 사기(Small) C++ 그리디 알고리즘 (0) | 2024.10.26 |
---|---|
[L3] 프로그래머스 단어 변환 C++ 백트래킹, 완전 탐색 (0) | 2024.10.26 |
[L3] 프로그래머스 단속카메라 C++ 우선순위 큐, 그리디 알고리즘 (1) | 2024.10.25 |
[L3] 프로그래머스 섬 연결하기 C++ MST, 최소 신장 트리, 유니온 파인드 (0) | 2024.10.25 |
[L2] 프로그래머스 구명보트 C++ 덱 (0) | 2024.10.25 |