코테/프로그래머스

[프로그래머스/C++] 리코쳇 로봇

내꺼블로그 2024. 2. 18. 12:08

문제


https://school.programmers.co.kr/learn/courses/30/lessons/169199?language=cpp

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

 

 

코드


#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문 네 개를 만들어놓아버렸,,,, 멍청아!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

 

암튼 위의 코드는 매우 엉망진창임을 양해부탁드립니다.... 급해서 막 갈겼습니다...