728x90
프로그래머스 level 2 : 게임 맵 최단거리
https://programmers.co.kr/learn/courses/30/lessons/1844?language=cpp
💍 문제
게임 맵의 상태 maps가 매개변수로 주어질 때, 캐릭터가 상대 팀 진영에 도착하기 위해서 지나가야 하는 칸의 개수의 최솟값을 return 하도록 solution 함수를 완성해주세요. 단, 상대 팀 진영에 도착할 수 없을 때는 -1을 return 해주세요.
💍 코드
#include <iostream>
#include<vector>
#include <algorithm>
#include <queue>
using namespace std;
int nexti[4] = {1,0,-1,0}, nextj[4] = {0,1,0,-1};
int n, m;
bool visited[101][101] = {false, };
int maxSize = 0;
vector<vector<int> > map;
struct pos{
int i;
int j;
int dis;
};
int BFS(){
queue<pos> q;
q.push({0,0,1});
visited[0][0] = true;
while(!q.empty()){
pos p = q.front();
q.pop();
if(p.i == n-1 && p.j == m-1){
cout << p.dis << "\n";
return p.dis;
}
for(int k=0; k<4; k++){
int ni = p.i + nexti[k];
int nj = p.j + nextj[k];
if(ni<0 || nj<0 || ni >=n || nj>= m){
continue;
}
if(visited[ni][nj] == false && map[ni][nj] == 1){
q.push({ni,nj, p.dis+1});
visited[ni][nj] = true;
}
}
}
return -1;
}
int solution(vector<vector<int> > maps)
{
int answer = 0;
n = maps.size();
m = maps[0].size();
map = maps;
answer = BFS();
return answer;
}
💍 시간초과 코드
26 q.pop();
27 visited[p.i][p.j] = true;
어느 부분에 visited를 사용하느냐에 따라서 걸리는 시간이 다르다.
처음 visited를 큐를 pop한 후 방문 여부를 확인할 때 true로 변경해주었지만 이 코드는 시간초과가 났다.
시간초과가 나지 않게 구현하려면 큐에 push할 때 방문 여부를 확인해주어야 한다. 큐에 push할 때 확인해야지만 큐에 중복적으로 들어가지 않기 때문에 시간이 줄어든다.
이 부분을 생각하지 않고 아무곳에서나 방문 여부를 확인해주면 되겠지라고 생각한 나의 착오였다.
💍 고찰
기본적인 DFS, BFS 문제였다. DFS는 모든 경우를 다 탐색한 후 가장 빠른 길을 찾아내는 것이기 때문에 시간이 매우 오래 걸린다. 그래서 이번 문제는 BFS로 칸의 최솟값을 구해야 한다.
나는 BFS보다 DFS로 푸는 것을 더 선호하기 때문에 습관적으로 DFS로 풀게 되는거 같다. 최솟값을 구할 때는 BFS를 사용하여 시간을 최대한 줄이는 방법을 생각하면서 DFS로 풀지 BFS로 풀지 결정해야 할거 같다.
728x90
'알고리즘 > 프로그래머스' 카테고리의 다른 글
프로그래머스(C++, JAVA) / level 1 : 신고 결과 받기 (0) | 2022.03.25 |
---|---|
프로그래머스(C++) / 프로그래머스 level 2 : 양궁대회 (0) | 2022.02.07 |
프로그래머스(C++) / level 2 : 단체사진 찍기 (0) | 2022.02.03 |
프로그래머스(MySQL) / IS NULL(이름이 없는 동물의 아이디, 이름이 있는 동물의 아이디, NULL 처리하기) (0) | 2022.01.19 |
알고리즘(C++) / 프로그래머스 level 3 : 스티커 모으기(2) (0) | 2021.11.04 |
댓글