나만의 작은 도서관
문제 172928. 공원 산책 본문
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/172928
난이도 : 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는 직사각형 모양입니다.
- park[i]는 다음 문자들로 이루어져 있으며 시작지점은 하나만 주어집니다.
- 3 ≤ park[i]의 길이 ≤ 50
- 1 ≤ routes의 길이 ≤ 50
- routes의 각 원소는 로봇 강아지가 수행할 명령어를 나타냅니다.
- 로봇 강아지는 routes의 첫 번째 원소부터 순서대로 명령을 수행합니다.
- routes의 원소는 "op n"과 같은 구조로 이루어져 있으며, op는 이동할 방향, n은 이동할 칸의 수를 의미합니다.
- op는 다음 네 가지중 하나로 이루어져 있습니다.
- N : 북쪽으로 주어진 칸만큼 이동합니다.
- S : 남쪽으로 주어진 칸만큼 이동합니다.
- W : 서쪽으로 주어진 칸만큼 이동합니다.
- E : 동쪽으로 주어진 칸만큼 이동합니다.
- 1 ≤ n ≤ 9
- op는 다음 네 가지중 하나로 이루어져 있습니다.
입력 예제
// 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;
}
'프로그래머스 문제풀이 > 코드카타' 카테고리의 다른 글
문제 12939. 최댓값과 최솟값 (0) | 2024.06.28 |
---|---|
문제 92334. 신고 결과 받기 (0) | 2024.06.27 |
문제 178871. 달리기 경주 (0) | 2024.06.25 |
문제 150370. 개인정보 수집 유효기간 (0) | 2024.06.24 |
문제 161990. 바탕화면 정리 (0) | 2024.06.23 |