(8/20-X)
(8/22-O)
https://school.programmers.co.kr/learn/courses/30/lessons/1844
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
구현
bfs를 이용해서 목적지까지의 최단 거리를 구한다.
1) 각 좌표까지마다의 최단 거리를 담을 2차원 배열, 2) 방문했는지 안 했는지 체크 할 2차원 배열이 필요하다.
queue<pair<int,int>>에 출발지를 넣고 큐를 순회하고 비워 가면서 상하좌우의 이동 가능한 좌표들을 큐에 넣는다.
실수
처음에 dfs로 풀었는데 시간 초과가 났다. dfs로 풀게 되면 도착지에 도달해도 계속해서 탐색을 하기 때문에 결국 완전 탐색을 할 수밖에 없다. bfs로 풀면 도착지에 도달했을 때 바로 반복문을 탈출해서 결과 값을 도출할 수 있기 때문에 시간이 덜 걸린다. 이 문제를 통해서 상황에 따라 dfs와 bfs를 적절히 선택해야 된다는 것을 알았다.
코드
#include<vector>
#include<queue>
using namespace std;
int cnt[101][101]; // 1)
bool visited[101][101]; // 2)
int solution(vector<vector<int> > maps)
{
int m = maps.size();// 행의 개수
int n = maps[0].size(); // 열의 개수
int answer = -1;
queue<pair<int, int>> q;
q.push({ 0,0 }); // x,y
cnt[0][0] = 1;
visited[0][0] = true;
while (!q.empty()) {
int x = q.front().first;
int y = q.front().second;
q.pop();
// x,y가 (n-1, m-1)이라면 탈출
if (x == n-1 && y == m - 1) {
break;
}
// 상하좌우가 맵 밖을 뚫지 않고 1이라면 push
if (y - 1 >= 0 && maps[y - 1][x] == 1 && visited[y - 1][x] == false) {
q.push({ x, y - 1 });
cnt[y - 1][x] = cnt[y][x] + 1;
visited[y - 1][x] = true;
}
if (y + 1 < m && maps[y + 1][x] == 1 && visited[y + 1][x] == false) {
q.push({ x, y + 1});
cnt[y + 1][x] = cnt[y][x] + 1;
visited[y + 1][x] = true;
}
if (x - 1 >= 0 && maps[y][x - 1] == 1 && visited[y][x-1] == false) {
q.push({ x - 1, y });
cnt[y][x - 1] = cnt[y][x] + 1;
visited[y][x - 1] = true;
}
if (x + 1 < n && maps[y][x + 1] == 1 && visited[y][x+1] == false) {
q.push({ x + 1, y });
cnt[y][x + 1] = cnt[y][x] + 1;
visited[y][x+1] = true;
}
}
if (cnt[m - 1][n - 1] == 0)
return -1;
return cnt[m - 1][n - 1];
}
'알고리즘 > Programmers' 카테고리의 다른 글
[프로그래머스/C++] 같은 숫자는 싫어 (0) | 2022.07.23 |
---|---|
[프로그래머스/C++] 피로도 (0) | 2022.07.22 |
[프로그래머스/C++] 주식 가격 (0) | 2022.07.18 |
[프로그래머스/C++] 여행 경로 (0) | 2022.07.16 |
[프로그래머스/C++] 카펫 (0) | 2022.07.16 |