< 풀이 >
class Solution {
public int[] solution(String[] park, String[] routes) {
char arr[][]=new char[park.length][park[0].length()];
int start=0,end=0;
//2차원 배열에 값 넣기
for(int i=0;i<arr.length;i++){
String s=park[i];
for(int j=0;j<arr[i].length;j++){
arr[i][j]=s.charAt(j);
if(arr[i][j]=='S'){ //시작 위치 저장
start=i;
end=j;
}
}
}
for(int i=0;i<routes.length;i++){
String where[]=routes[i].split(" ");
int n=Integer.parseInt(where[1]);
int temp_s=start;
int temp_e=end;
if(where[0].equals("N")){
temp_s=temp_s-n;
}
if(where[0].equals("S")){
temp_s=temp_s+n;
}
if(where[0].equals("W")){
temp_e=temp_e-n;
}
if(where[0].equals("E")){
temp_e=temp_e+n;
}
boolean stopped=false;
if(temp_s>arr.length-1||temp_s<0||temp_e>arr[0].length-1||temp_e<0) //범위를 넘어가면
continue;
else { // 범위를 넘어가지 않았을 때, 중간에 장애물(X)이 있는지 확인
for(int k=Math.min(start,temp_s);k<=Math.max(start,temp_s);k++){
for(int j=Math.min(end,temp_e);j<=Math.max(end,temp_e);j++){
if(arr[k][j]=='X'){
stopped=true;
break;
}
}
}
}
if(!stopped){ //장애물이 없었다면 위치 변경
start=temp_s;
end=temp_e;
}
}
int[] answer = {start,end};
return answer;
}
}
✍🏻 풀이 방법
1. 2차원 배열 arr 을 생성해 park 배열의 값을 저장한다. 시작 위치의 인덱스 또한 start와 end 변수에 저장한다.
2. routes 배열 반복문을 돌며 이동할 방향에 따라 temp_s와 temp_e 의 값을 조정해준다.
-> 만약 temp_s 의 값 또는 temp_e 의 값이 배열의 범위를 넘어가면: start와 end 의 값을 변경해주지 않고 다음 반복문으로
넘어간다.
-> 배열의 범위를 넘어가지 않으면: arr[start][end] ~ arr[temp_s][temp_e] 사이에 장애물이 있었는지 확인한다.
: 장애물이 있었다면 이동 불가한 곳이므로 위치를 변경하지 않는다.
: 장애물이 없었다면 이동할 수 있는 곳이므로 start와 end의 값을 변경해준다.
3. 모든 명령을 수행하고 난 후 위치 (start, end) 를 리턴한다.
✏️ 느낀점
우선 처음 봤을 때는 간단한 문제라고 생각했는데, 여러 가지 실수를 해서 푸는데 오래걸렸다,, 내가 했던 실수들을 말해보자면
1. 이동중에 장애물이 있으면 안되는건데, 이동후의 위치에서 장애물을 찾으려고 해서 잘못된 결과 나옴
2. 배열의 범위 내인지 확인할 때 0보다 작을 때는 확인 안 함
3. 중간에 장애물이 있는지 확인하는 반복문에서 k =start ~ temp_s 까지, j=end~temp_e 까지로 고정을 해두고 계산을 해서 이상하게 값이 나왔다. 예를 들면 [start][end] 가 [2][2] 이고, [temp_s][temp_e] 가 [2][0] 이라면 2~0 까지 확인하는걸로 되어서 내가 의도한대로 반복문을 돌지 않는다. 따라서 start와 temp_s , end와 temp_e의 대소 비교를 하고 반복문을 돌아야 내가 의도한대로 중간에 있는 장애물을 확인할 수 있다.
너무 많은 부분에서 실수를 하고, 런타임 에러도 나고 여러가지 오류들을 많이 겪은 문제였다,, 빠른 시간 안에 효율적으로 푸는거 어케 하는건데,, ㅜㅜ 좀 더 꼼꼼히 푸는 연습을 해야할 것 같다.
< 오류를 찾는데 도움이 됐던 반례들 >
입력값 〉 ["OOO", "OSO", "OOO", "OOO"], ["N 2", "S 2"]
기댓값 〉 [3, 1]
입력값 〉 ["OOS", "OOO", "OOO"], ["E 1"]
기댓값 〉 [0, 2]
입력값 〉 ["SOOO", "OOOO", "OOOO"], ["E 3", "S 3", "S 2"]
기댓값 〉 [2, 3]
입력값 〉 ["OXXO", "XSXO", "XXXX"], ["E 1", "S 1"]
기댓값 〉 [1, 1]
입력값 〉 ["SXO", "XOO", "OOO"], ["E 2", "S 2", "W 1"]
기댓값 〉 [0, 0]
입력값 〉 ["SOOXO", "OOOXO", "OXOOO", "XOOOO"], ["E 2", "S 2", "W 2", "S 1", "W 1"]
기댓값 〉 [3, 1]
➡️ 질문하기에 올라와 있는 반례들을 정리해봤다. 테스트케이스에 추가해서 오류가 나는 부분을 통해 문제를 해결할 수 있었다. 다들 감사합니다,, 🥲 누군가에게도 도움이 되길 !
'코딩테스트 > Programmers' 카테고리의 다른 글
[JAVA] 개인정보 수집 유효기간 (0) | 2024.05.27 |
---|---|
[JAVA] 신고 결과 받기 (0) | 2024.05.23 |
[JAVA] 키패드 누르기 (0) | 2024.05.13 |
[JAVA] 소수 찾기 LV.2 (0) | 2024.05.10 |
[JAVA] 할인 행사 (0) | 2024.05.08 |