문제
지나다니는 길을 'O', 장애물을 'X'로 나타낸 직사각형 격자 모양의 공원에서 로봇 강아지가 산책을 하려합니다. 산책은 로봇 강아지에 미리 입력된 명령에 따라 진행하며, 명령은 다음과 같은 형식으로 주어집니다.
- ["방향 거리", "방향 거리" … ]
예를 들어 "E 5"는 로봇 강아지가 현재 위치에서 동쪽으로 5칸 이동했다는 의미입니다. 로봇 강아지는 명령을 수행하기 전에 다음 두 가지를 먼저 확인합니다.
- 주어진 방향으로 이동할 때 공원을 벗어나는지 확인합니다.
- 주어진 방향으로 이동 중 장애물을 만나는지 확인합니다.
위 두 가지중 어느 하나라도 해당된다면, 로봇 강아지는 해당 명령을 무시하고 다음 명령을 수행합니다.
공원의 가로 길이가 W, 세로 길이가 H라고 할 때, 공원의 좌측 상단의 좌표는 (0, 0), 우측 하단의 좌표는 (H - 1, W - 1) 입니다.
공원을 나타내는 문자열 배열 park, 로봇 강아지가 수행할 명령이 담긴 문자열 배열 routes가 매개변수로 주어질 때, 로봇 강아지가 모든 명령을 수행 후 놓인 위치를 [세로 방향 좌표, 가로 방향 좌표] 순으로 배열에 담아 return 하도록 solution 함수를 완성해주세요.
제한사항
- 3 ≤ park의 길이 ≤ 50
- 1 ≤ routes의 길이 ≤ 50
입출력 예
park | routes | result |
["SOO","OOO","OOO"] | ["E 2","S 2","W 1"] | [2,1] |
["SOO","OXX","OOO"] | ["E 2","S 2","W 1"] | [0,1] |
["OSO","OOO","OXO","OOO"] | ["E 2","S 3","W 1"] | [0,0] |
입출력 예 설명
입출력 예 #1
입력된 명령대로 동쪽으로 2칸, 남쪽으로 2칸, 서쪽으로 1칸 이동하면 [0,0] -> [0,2] -> [2,2] -> [2,1]이 됩니다.
입출력 예 #2
입력된 명령대로라면 동쪽으로 2칸, 남쪽으로 2칸, 서쪽으로 1칸 이동해야하지만 남쪽으로 2칸 이동할 때 장애물이 있는 칸을 지나기 때문에 해당 명령을 제외한 명령들만 따릅니다. 결과적으로는 [0,0] -> [0,2] -> [0,1]이 됩니다.
입출력 예 #3
처음 입력된 명령은 공원을 나가게 되고 두 번째로 입력된 명령 또한 장애물을 지나가게 되므로 두 입력은 제외한 세 번째 명령만 따르므로 결과는 다음과 같습니다. [0,1] -> [0,0]
전체 코드
class Solution {
public int[] solution(String[] park, String[] routes) {
int x = 0;
int y = 0;
//시작점 찾기
for(int i = 0; i<park.length; i++)
{
if(park[i].contains("S")){
y = park[i].indexOf("S");
x = i;
break;
}
}
for(String route : routes){
int x_move = x;
int y_move = y;
String[] route_char = route.split(" ");
int route_num = Integer.parseInt(route_char[1]);
for(int j =0; j< route_num; j++)
{
if(route_char[0].equals("E")) y_move++;
else if(route_char[0].equals("W")) y_move--;
else if(route_char[0].equals("N")) x_move--;
else if(route_char[0].equals("S")) x_move++;
if(x_move>-1 && y_move>-1 && x_move<park.length && y_move<park[0].length()){
if(park[x_move].charAt(y_move)== 'X')
{
System.out.println("hahahhha");
break;
}
if(j == route_num-1)
{
x = x_move;
y = y_move;
}
}
}
}
int[] answer = {x,y};
return answer;
}
}
코드 설명
1.
1) 로봇강아지의 위치를 저장할 x,y 변수를 선언
2) 시작점을 찾아서 x,y 변수에 넣기
int x = 0;
int y = 0;
//시작점 찾기
for(int i = 0; i<park.length; i++)
{
if(park[i].contains("S")){
y = park[i].indexOf("S");
x = i;
break;
}
}
2. 이동 로직
//routes에 담긴 요소 만큼 반복문.
for(String route : routes){
//장애물 및 park를 벗어나는 경우를 대비해서
//x,y좌표 유효성 검사를 위한 변수 x_move, y_move 선언
int x_move = x;
int y_move = y;
// route(["E 2","S 2","W 1"])에서
//방향과 이동할 칸 수를 저장할 route_char 배열 선언
String[] route_char = route.split(" ");
//이동할 칸 수가 String이므로 int형으로 변환
int route_num = Integer.parseInt(route_char[1]);
//이동할 칸 수 만큼 반복문
for(int j =0; j< route_num; j++)
{
//방향이 "E"일 경우 y좌표가 늘어남.
//방향이 "W"일 경우 y좌표가 줄어듦.
//방향이 "N"일 경우 x좌표가 줄어듦.
//방향이 "S"일 경우 y좌표가 늘어남.
if(route_char[0].equals("E")) y_move++;
else if(route_char[0].equals("W")) y_move--;
else if(route_char[0].equals("N")) x_move--;
else if(route_char[0].equals("S")) x_move++;
//(x_move,y_move)가 park를 벗어날 경우는 무시
if(x_move>-1 && y_move>-1 && x_move<park.length && y_move<park[0].length()){
//park 장애물에 걸리는 경우에는 다음 칸으로 이동을 하지 않아도
//이동이 어차피 안된다. => 이동 무시.
if(park[x_move].charAt(y_move)== 'X')
{
break;
}
//j가 route_num-1 인 경우
// = park 안에 있다 & 장애물에 걸리지 않는 경우
// 즉, 유효한 이동이므로 이동 !!!
if(j == route_num-1)
{
x = x_move;
y = y_move;
}
}
}
}
배열 반환
좌표 x,y 를 return 한다.
int[] answer = {x,y};
return answer;
결과
p.s) 그렇게 복잡한 문제는 아니였다.. 좌표를 헷갈리지 않고 잘 넣는다면 쉽게 풀리는 문제 !!!
'Coding Test > 프로그래머스' 카테고리의 다른 글
[프로그래머스] Lv.1 성격 유형 검사하기 (java) (0) | 2024.05.17 |
---|---|
[프로그래머스] Lv.1 체육복 (java) (0) | 2024.05.09 |
[프로그래머스] Lv.1 달리기 경주 (Java) (0) | 2024.05.05 |
[프로그래머스] Lv.1 개인정보 수집 유효기간 (Java) (0) | 2024.04.04 |
[프로그래머스] Lv.1 크레인 인형뽑기 게임 (java) (0) | 2024.03.21 |