프로그래머스 (Java) 공원 산책
문제 이름:
공원 산책
문제 설명:
지나다니는 길을 'O', 장애물을 'X'로 나타낸 직사각형 격자 모양의 공원에서 로봇 강아지가 산책을 하려합니다.
산책은 로봇 강아지에 미리 입력된 명령에 따라 진행하며, 명령은 다음과 같은 형식으로 주어집니다.
["방향 거리", "방향 거리" … ]
예를 들어 "E 5"는 로봇 강아지가 현재 위치에서 동쪽으로 5칸 이동했다는 의미입니다.
로봇 강아지는 명령을 수행하기 전에 다음 두 가지를 먼저 확인합니다.
주어진 방향으로 이동할 때 공원을 벗어나는지 확인합니다.
주어진 방향으로 이동 중 장애물을 만나는지 확인합니다.
위 두 가지중 어느 하나라도 해당된다면, 로봇 강아지는 해당 명령을 무시하고 다음 명령을 수행합니다.
공원의 가로 길이가 W, 세로 길이가 H라고 할 때, 공원의 좌측 상단의 좌표는 (0, 0), 우측 하단의 좌표는 (H - 1, W - 1) 입니다.
공원을 나타내는 문자열 배열 park, 로봇 강아지가 수행할 명령이 담긴 문자열 배열 routes가 매개변수로 주어질 때,
로봇 강아지가 모든 명령을 수행 후 놓인 위치를 [세로 방향 좌표, 가로 방향 좌표] 순으로 배열에 담아
return 하도록 solution 함수를 완성해주세요.
코드:
class Solution {
public int[] solution(String[] park, String[] routes) {
int x = 0, y = 0;
for(int i = 0; i < park.length; i++){
for(int j = 0; j < park[0].length(); j++){
if(park[i].charAt(j) == 'S'){
x = i; //시작지점
y = j;
break;
}
}
}
for(String ro : routes){
String[] str = ro.split(" ");
String di = str[0];
int n = Integer.parseInt(str[1]);
int dx = 0, dy = 0; // 해당 방향으로 이동
switch(di){
case "N" -> dx--;
case "S" -> dx++;
case "E" -> dy++;
case "W" -> dy--;
}
boolean flag = true;
for(int i = 1; i <= n; i++){
int nx = x + dx * i;
int ny = y + dy * i;
// 시작지점 + 방향 관련 한 번 이동 * 총 이동거리; E 2 : park[0].charAt(1), park[0].charAt(2)를 비교
if(nx < 0 || nx >= park.length ||
ny < 0 || ny >= park[0].length() ||
park[nx].charAt(ny) == 'X'){
flag = false;
break;
}
}
if(flag){
x += dx * n;
y += dy * n;
}
}
return new int[]{x,y};
}
}
int x = 0, y = 0;
for(int i = 0; i < park.length; i++){
for(int j = 0; j < park[0].length(); j++){
if(park[i].charAt(j) == 'S'){
x = i; //시작지점
y = j;
break;
}
}
}
공원의 시작지점이 다르기 때문에 시작지점을 먼저 초기화 해준다
공원의 총 길이를 먼저 반복문으로 돌리고 그 반복문안에 공원의 각 값의 길이만큼 돌려서 하나씩 차례대로 S를 찾는다.
S가 있으면 그 자리를 X ,Y 에다가 저장해준다. 저장이 되면 더 이상 진행을 안 해도 되기 때문에 break로 멈춘다
for(String ro : routes){
String[] str = ro.split(" ");
String di = str[0];
int n = Integer.parseInt(str[1]);
int dx = 0, dy = 0; // 해당 방향으로 이동
switch(di){
case "N" -> dx--;
case "S" -> dx++;
case "E" -> dy++;
case "W" -> dy--;
}
방향을 알아야 하기 때문에 routes의 값을 하나씩 가져와서 그 값을 split을 사용해서
공백을 기준으로 잘라서 배열에 담아준다.
배열의 담긴 값 중 방향을 나타내는 값과 이동거리를 나타내는 값을 따로 빼서 저장해준다.
방향이 담긴 변수를 switch문을 통해서 방향에 맞게 이동을 시켜준다.
boolean flag = true;
for(int i = 1; i <= n; i++){
int nx = x + dx * i;
int ny = y + dy * i;
// 시작지점 + 방향 관련 한 번 이동 * 총 이동거리; E 2 : park[0].charAt(1), park[0].charAt(2)를 비교
if(nx < 0 || nx >= park.length ||
ny < 0 || ny >= park[0].length() ||
park[nx].charAt(ny) == 'X'){
flag = false;
break;
}
}
이제 총 이동거리와 공원의 장애물이 있는지 없는지 공원을 벗어나는지를 확인을 해줘야 한다.
반복문을 통해서 1부터 총 이동거리까지 반복을하고 시작지점에서 한 칸씩 이동하면서
장애물과 공원을 벗어나는지를 확인한다.
장애물을 만나거나 공원을 벗어나면 flag를 false로 바꾸고 반복문을 종료시킨다.
flag는 정상적으로 이동을 했을 때 더해주기 위한 조건문을 사용하기 위해 사용함
if(flag){
x += dx * n;
y += dy * n;
}
장애물을 만나지 않거나 공원을 안 벗어나면 정상적으로 이동이 된 것이기 때문에
이동한 거리만큼 X,Y에 더해줘야한다.