나만의 작은 도서관

문제 172928. 공원 산책 본문

프로그래머스 문제풀이/코드카타

문제 172928. 공원 산책

pledge24 2024. 6. 26. 10:12

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/172928

 

프로그래머스

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

programmers.co.kr

 

 

난이도 : Lv.1 

 

문제 요약 설명

지나다니는 길을 'O', 장애물을 'X'로 나타낸 직사각형 격자 모양의 공원에서 로봇 강아지가 산책을 하려합니다. 산책은 로봇 강아지에 미리 입력된 명령에 따라 진행하며, 명령은 다음과 같은 형식으로 주어집니다.
["방향 거리", "방향 거리" … ]

예를 들어, "E 5"는 로봇 강아지가 현재 위치에서 동쪽으로 5칸 이동했다는 의미입니다. 로봇 강아지는 명령을 수행하기 전에 다음 두 가지를 먼저 확인합니다.

  • 주어진 방향으로 이동할 때 공원을 벗어나는지 확인합니다.
  • 주어진 방향으로 이동 중 장애물을 만나는지 확인합니다.

위 두 가지중 어느 하나라도 해당된다면, 로봇 강아지는 해당 명령을 무시하고 다음 명령을 수행합니다.
공원의 가로 길이가 W, 세로 길이가 H라고 할 때, 공원의 좌측 상단의 좌표는 (0, 0), 우측 하단의 좌표는 (H - 1, W - 1) 입니다.

 

공원을 나타내는 문자열 배열 park, 로봇 강아지가 수행할 명령이 담긴 문자열 배열 routes가 매개변수로 주어질 때, 로봇 강아지가 모든 명령을 수행 후 놓인 위치를 [세로 방향 좌표, 가로 방향 좌표] 순으로 배열에 담아 return 하도록 solution 함수를 완성해주세요.

입력

  • 공원을 나타내는 문자열 배열 park
  • 로봇 강아지가 수행할 명령이 담긴 문자열 배열 routes

입력 제한

  • 3 ≤ park의 길이 ≤ 50
    • 3 ≤ park[i]의 길이 ≤ 50
      • park[i]는 다음 문자들로 이루어져 있으며 시작지점은 하나만 주어집니다.
        • S : 시작 지점
        • O : 이동 가능한 통로
        • X : 장애물
      • park는 직사각형 모양입니다.
  • 1 ≤ routes의 길이 ≤ 50
    • routes의 각 원소는 로봇 강아지가 수행할 명령어를 나타냅니다.
    • 로봇 강아지는 routes의 첫 번째 원소부터 순서대로 명령을 수행합니다.
    • routes의 원소는 "op n"과 같은 구조로 이루어져 있으며, op는 이동할 방향, n은 이동할 칸의 수를 의미합니다.
      • op는 다음 네 가지중 하나로 이루어져 있습니다.
        • N : 북쪽으로 주어진 칸만큼 이동합니다.
        • S : 남쪽으로 주어진 칸만큼 이동합니다.
        • W : 서쪽으로 주어진 칸만큼 이동합니다.
        • E : 동쪽으로 주어진 칸만큼 이동합니다.
      • 1 ≤ n ≤ 9

입력 예제

// input
["SOO","OOO","OOO"] // park
["E 2","S 2","W 1"] // routes

// ans
[2,1]

 

풀이 방식

dx, dy 테크닉을 사용한다.우선 각 방향(N, E, S, W)에 대한 매핑된 숫자들을 저장한 map 자료구조 dir을 준비한다. 여기서 매핑된 숫자들은 dx, dy의 index를 의미하게 된다. 

ex. {N, 0} -> dx = -1, dy = 0 -> x방향으로 -1만큼 이동 -> 북쪽으로 이동

routes를 순회하면서 로봇을 이동시킨다. 단, 이동할 수 없는 경우는 이동하면 안되니 다음 2가지 조건을 확인하고 이동한다.

  • 장애물이 있는가?
  • 이동할 수 있는 범위인가 (inRange함수로 확인)

모든 routes를 순회했다면 정답을 answer에 넣고 반환한다.

정답 코드 

더보기
#include <string>
#include <vector>
#include <iostream>
#include <map>
#include <sstream>

#define DIR 4
using namespace std;

int H, W;

int dx[DIR] = {-1, 0, 1, 0};
int dy[DIR] = {0, 1, 0, -1};

bool inRange(int x, int y){
    return 0 <= x && x < H && 0 <= y && y < W;
}

vector<int> solution(vector<string> park, vector<string> routes) {
    vector<int> answer;
    map<char, int> dir = {{'N', 0}, {'E', 1}, {'S', 2}, {'W', 3}};
    
    H = park.size();
    W = park[0].size();
    
    int pos_x = -1, pos_y = -1;
    bool find = false;
    // find start_pos.
    for(int i = 0; i < H; i++){
        for(int j = 0; j < W; j++){
            if(park[i][j] == 'S'){
                pos_x = i;
                pos_y = j;
                
                find = true;
                break;
            }
        }
        if(find) break;
    }
    
    // cout << start_r << " " << start_c << '\n';
    

    for(string s : routes){
      
        char order_dir = s[0];
        char order_cnt = s[2];
               
        bool canmove = true;
        
        int nx = pos_x;
        int ny = pos_y;
        
        while(order_cnt - '0' > 0){  
            
            nx += dx[dir[order_dir]];
            ny += dy[dir[order_dir]];
            
            if(!inRange(nx, ny) || park[nx][ny] == 'X'){
                canmove = false;
                break;
            }
                       
            order_cnt--;
        }
        
        pos_x = canmove ? nx : pos_x;
        pos_y = canmove ? ny : pos_y;
        
        cout << pos_x << " " << pos_y << '\n';
        
            
        
    }
    
    answer = {pos_x, pos_y};
    return answer;
}