문제
https://school.programmers.co.kr/learn/courses/30/lessons/169199?language=cpp
코드
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
bool visited[100][100];
int solution(vector<string> board) {
int answer = -1;
bool search = false;
for(int i=0;i<board.size();i++){
for(int j=0;j<board[i].size();j++){
if(board[i][j]=='R'){
visited[i][j]=true;
queue<pair<int, int>> graph;
queue<int> count;
graph.push(make_pair(i, j));
count.push(0);
while(!graph.empty()){
int y = graph.front().first;
int x = graph.front().second;
int c = count.front();
graph.pop();
count.pop();
for(int k=1;k<=100;k++){
if(y-k<0||board[y-k][x]=='D'){
if(board[y-k+1][x]=='G'){
answer=c+1;
}
else if(!visited[y-k+1][x]){
visited[y-k+1][x]=true;
graph.push(make_pair(y-k+1, x));
count.push(c+1);}
break;
}
}
if(answer!=-1) break;
for(int k=1;k<=100;k++){
if(x+k==board[y].size()||board[y][x+k]=='D'){
if(board[y][x+k-1]=='G'){
answer=c+1;
}
else if(!visited[y][x+k-1]){
visited[y][x+k-1]=true;
graph.push(make_pair(y, x+k-1));
count.push(c+1);}
break;
}
}
if(answer!=-1) break;
for(int k=1;k<=100;k++){
if(y+k==board.size()||board[y+k][x]=='D'){
if(board[y+k-1][x]=='G'){
answer=c+1;
}
else if(!visited[y+k-1][x]){
visited[y+k-1][x]=true;
graph.push(make_pair(y+k-1, x));
count.push(c+1);
}
break;
}
}
if(answer!=-1) break;
for(int k=1;k<=100;k++){
if(x-k<0||board[y][x-k]=='D'){
if(board[y][x-k+1]=='G'){
answer=c+1;
}
else if(!visited[y][x-k+1]){
visited[y][x-k+1]=true;
graph.push(make_pair(y, x-k+1));
count.push(c+1);
}
break;
}
}
if(answer!=-1)break;
}
search=true;
break;
}
}
if(search) break;
}
return answer;
}
다시 보니 정말 개판이군ㅎㅎ
풀이
BFS를 사용하여 해결
R에서 출발하여 위, 오른쪽, 아래, 왼쪽 방향 순으로 for문을 사용해 돌림.(첫 번째 for문이 위, 두 번째 for문이 오른쪽 요런 식으로)
갈 수 있는 만큼 가도록 설정. 만약 D를 만났다거나 범위를 벗어나면 이전 지점을 확인하여 'G'가 아니면 visited 체크하고 방문한 적이 없는 좌표였다면 queue에 좌표와 이동 횟수를 enqueue.
그러나 만약 도착 지점이 'G'라면 answer에 이동 횟수를 대입.
조건문에 걸린 상태는 그냥 다 break 처리해줌.
근데 내가 정말 바보같이 풀었던 게 맞는것이 배열로 row방향 {-1, 0, 1, 0} col방향 {0, 1, 0, -1} 정해놓고(북,동,남,서=> 북 기준으로 시계방향) for문으로 4번 돌리고 그 안에서 그 방향대로 끝까지 갈 때까지 while문을 돌리면 되는 거였는데 그걸 for문 네 개를 만들어놓아버렸,,,, 멍청아!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
암튼 위의 코드는 매우 엉망진창임을 양해부탁드립니다.... 급해서 막 갈겼습니다...
'코테 > 프로그래머스' 카테고리의 다른 글
[프로그래머스/C++] 산 모양 타일 (0) | 2024.02.26 |
---|---|
[프로그래머스/C++, C#] 네트워크 (0) | 2024.02.19 |
[프로그래머스/C#]가장 많이 받은 선물 (0) | 2024.02.13 |
[프로그래머스/C#]문자열 붙여서 출력하기/문자열의 앞의 n글자/문자열의 뒤의 n글 (0) | 2024.02.13 |
[프로그래머스/C++, C#] 타겟 넘버 (0) | 2024.02.05 |