[ baekjoon ] #13901 로봇

eunheelog·2023년 6월 20일
0

baekjoon

목록 보기
9/20

백준 #13901 로봇

문제 요약


  • 로봇의 규칙
    - 로봇은 사용자가 지정한 방향을 일직선으로 이동
    - 벽이나 방문한 지역, 장애물을 만날 경우
    → 사용자가 지정한 다음 방향으로 이동
    - 다음 방향이 없다면 맨 처음 방향으로 돌아가서 위의 과정을 반복
    - 로봇이 움직일 수 없을 경우 동작을 멈춤
  • 로봇이 멈추는 위치를 구하자 !

💡Idea

  1. 장애물을 k크기 만큼 입력 받아 어떻게 처리할까?
    → 방 크기의 2차원 배열room을 만들어 장애물 위치의 값을 1로 바꿔주었다.

[ SourceCode ]

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

int R, C, k; // 방의 세로, 가로, 장애물 개수
int dir[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; // 로봇 방향
pair <int, int> robot; // 로봇의 위치
queue <pair<int, int>> route; // 이동한 곳

// 3. 벽이 아니거나 
void move_bfs(vector <int> direct, vector<vector<int>> room, vector<vector<int>> &visit) {
    // 사용자가 지정한 다음 방향이 없다면 맨 처음 방향으로 돌아가서 반복
    while(1) {
        bool flag = false; // 이동 가능 여부
        for(int i=0; i<4; i++) {
            int dx = dir[direct[i]][0];
            int dy = dir[direct[i]][1];
            int nx = robot.first + dx;
            int ny = robot.second + dy;

            while(1) {
                if(nx < 0 || ny < 0 || nx >= R || ny >= C) break; // 범위 벗어난 경우 끝내기
                if(room[nx][ny] || visit[nx][ny]) break; // 벽이 있거나 방문했던 곳이라면 끝내기
                visit[nx][ny] = 1;
                flag = true;
                nx += dx;
                ny += dy;
            }

            robot = {nx - dx, ny - dy};
        }
        if(!flag) break;
    }
}

int main() {
    // 1. 입력 받기
    cin >> R >> C >> k;
    vector <vector<int>> room(R, vector<int>(C, 0)); // 방의 상태
    for(int i=0; i<k; i++) {
        int x, y;
        cin >> x >> y;
        room[x][y] = 1; // 벽(장애물) 설치
    }
    cin >> robot.first >> robot.second;

    vector <vector<int>> visit(R, vector<int>(C, 0)); // 방문 여부
    visit[robot.first][robot.second] = 1; // 로봇 처음 위치 방문 체크

    // 2. 이동 방향의 순서 입력 받기
    vector <int> direct;
    for(int i=0; i<4; i++) {
        int n;
        cin >> n;
        direct.push_back(n-1);
    }
   
    move_bfs(direct, room, visit);

    // 3. 로봇의 마지막 위치 출력
    cout << robot.first << " " << robot.second;

    return 0;
}

Feedback


  1. "사용자가 지정한 다음 방향이 없다면 맨 처음으로 돌아가서 위의 과정을 반복" 이 규칙이 이해하기 어려웠다.
    • 처음에는 이동방향 순서대로 한 번씩만 이동하였다.
      → 이상한 걸 깨닫고 다시 읽어보았는데 사용자가 '지정한' 다음 방향이라고 해서 총 4개의 입력이 들어오지 않는건가?라는 생각으로 예외처리를 해보았다.
    • 다시 규칙을 읽은 후 이동할 수 없을 때까지 이동방향 4개를 순서대로 계속 반복하는 건 아닐까해서 수정해봤더니 맞았다,,,
      → 이 문제처럼 테스트케이스를 통해 확인할 수 없는 문제들은 자칫하면 시간을 날릴 수 있다 ㅠㅠ 조건이 이해가 안될 때 한 번 더 읽어보자 !!!
  2. 문제 풀 때 주석을 달고 코드의 가독성을 높이려고 노력했다.
    → 피드백 받을 사람은 없지만 이전의 코드들에 비해 가독성이 높아졌고 나름 잘 정리했다는 생각이 들어 뿌듯하다 ^__^
profile
⛧1일 1알고리즘⛧

0개의 댓글