[문제]
지나다니는 길을 'O', 장애물을 'X'로 나타낸 직사각형 격자 모양의 공원에서 로봇 강아지가 산책을 하려합니다. 산책은 로봇 강아지에 미리 입력된 명령에 따라 진행하며, 명령은 다음과 같은 형식으로 주어집니다.
- ["방향 거리", "방향 거리" … ]
예를 들어 "E 5"는 로봇 강아지가 현재 위치에서 동쪽으로 5칸 이동했다는 의미입니다. 로봇 강아지는 명령을 수행하기 전에 다음 두 가지를 먼저 확인합니다.
- 주어진 방향으로 이동할 때 공원을 벗어나는지 확인합니다.
- 주어진 방향으로 이동 중 장애물을 만나는지 확인합니다.
위 두 가지중 어느 하나라도 해당된다면, 로봇 강아지는 해당 명령을 무시하고 다음 명령을 수행합니다.
공원의 가로 길이가 W, 세로 길이가 H라고 할 때, 공원의 좌측 상단의 좌표는 (0, 0), 우측 하단의 좌표는 (H - 1, W - 1) 입니다.
공원을 나타내는 문자열 배열 park, 로봇 강아지가 수행할 명령이 담긴 문자열 배열 routes가 매개변수로 주어질 때, 로봇 강아지가 모든 명령을 수행 후 놓인 위치를 [세로 방향 좌표, 가로 방향 좌표] 순으로 배열에 담아 return 하도록 solution 함수를 완성해주세요.
[제한 조건]
- 3 ≤ park의 길이 ≤ 50
- 3 ≤ park[i]의 길이 ≤ 50
- park[i]는 다음 문자들로 이루어져 있으며 시작지점은 하나만 주어집니다.
- S : 시작 지점
- O : 이동 가능한 통로
- X : 장애물
- park[i]는 다음 문자들로 이루어져 있으며 시작지점은 하나만 주어집니다.
- park는 직사각형 모양입니다.
- 3 ≤ park[i]의 길이 ≤ 50
- 1 ≤ routes의 길이 ≤ 50
- routes의 각 원소는 로봇 강아지가 수행할 명령어를 나타냅니다.
- 로봇 강아지는 routes의 첫 번째 원소부터 순서대로 명령을 수행합니다.
- routes의 원소는 "op n"과 같은 구조로 이루어져 있으며, op는 이동할 방향, n은 이동할 칸의 수를 의미합니다.
- op는 다음 네 가지중 하나로 이루어져 있습니다.
- N : 북쪽으로 주어진 칸만큼 이동합니다.
- S : 남쪽으로 주어진 칸만큼 이동합니다.
- W : 서쪽으로 주어진 칸만큼 이동합니다.
- E : 동쪽으로 주어진 칸만큼 이동합니다.
- 1 ≤ n ≤ 9
- op는 다음 네 가지중 하나로 이루어져 있습니다.
[코드]
public int[] solution(String[] park, String[] routes) {
int[] answer=new int[2];
int x=0,y=0;
char[][] map=new char[park.length][park[0].length()];
// 맵을 2차원으로 변경, 시작 지점 저장
for(int i=0;i<park.length;i++) {
String str=park[i];
for(int j=0;j<park[i].length();j++) {
if(str.charAt(j)=='S') { // 시작 지점 저장
x=i;
y=j;
}
map[i][j]=str.charAt(j);
}
}
// 명령 수행
for(int i=0;i<routes.length;i++) {
char dir=routes[i].charAt(0); // 방향
int count=routes[i].charAt(2)-48; // 이동 칸수
int nx=x;
int ny=y;
boolean check=false; // 해당 명령을 무시해야 하는지 체크하는 변수
for(int j=0;j<count;j++) {
if(dir=='N') // 북
nx-=1;
else if(dir=='S') // 남
nx+=1;
else if(dir=='W') // 서
ny-=1;
else // 동
ny+=1;
// 이동할때 맵을 벗어나거나 장애물을 만나면 해당 명령 무시
if(nx<0||ny<0||nx>=map.length||ny>=map[0].length||map[nx][ny]=='X') {
check=true; // check 값 변경
break;
}
}
if(!check) { // check 값이 false인 경우에만 위치 갱신
x=nx;
y=ny;
check=false;
}
}
answer[0]=x;
answer[1]=y;
return answer;
}
[고찰]
이번 문제에서 가장 시간이 걸렸던 부분은 장애물을 만나는 경우였다. 처음에는 count 만큼 모두 이동한 후 장애물이 있는 칸인지 확인했는데 오답 처리를 받았다. 문제를 제대로 읽어보니 dir 방향으로 count 만큼 이동하는 과정에서 장애물을 만나면 즉시 해당 명령을 무시해야 했다. 이 부분은 boolean 값을 갖는 변수로 해결하였다.
'프로그래머스' 카테고리의 다른 글
[프로그래머스_Level2] 할인 행사 (0) | 2023.10.03 |
---|---|
[프로그래머스_Level1] 삼총사 (0) | 2023.04.25 |
[프로그래머스_Level1] 그리움 점수 (1) | 2023.04.25 |
[프로그래머스] 신고 결과 받기_2022 KAKAO BLIND RECRUITMENT (0) | 2022.02.18 |
[프로그래머스_Level2] 괄호 변환_2020 카카오 신입 공채 (0) | 2021.08.10 |