반응형
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/172928
문제 이해하기
- 시작은 어떤 공간에서든 할 수 있다.
- 대각선으로는 이동할 수 없고, 동서남북으로만 이동할 수 있다.
- 장애물이 있는 곳으로는 이동할 수 없으며, 이동할 수 없는 경우는 해당 명령은 아예 취소한다.
- 외부로 벗어나는 경우는 이동할 수 없으며, 이동할 수 없는 경우는 해당 명령은 아예 취소한다.
문제 풀이
boolean[][] parkFull = new boolean[park.length][park[0].length()];
int x = 0, y = 0;
int xWall = parkFull.length, yWall = parkFull[0].length;
for(int i=0; i<park.length; i++) {
char[] cols = park[i].toCharArray();
for(int j=0; j<cols.length; j++) {
if(cols[j] == 'O') parkFull[i][j] = true;
else if(cols[j] == 'S') {
parkFull[i][j] = true;
x = i;
y = j;
}
}
}
먼저 배열에 공원을 그리는 것으로 시작했습니다.
주어진 문자열 park
를 boolean 타입의 이차원 배열로 변환합니다.
이 때, 이동할 수 있는 곳은 true, 장애물이 있는 곳은 false로 저장하고, 시작 위치를 기억합니다.
for(String route : routes) {
String[] r = route.split(" ");
int step = Integer.parseInt(r[1]);
int target = 0, temp = 0;
switch(r[0]) {
case "E":
temp = y;
while(target++ < step && y+1 < yWall && parkFull[x][y+1]) y++;
if(target-1 != step) y = temp;
break;
case "W":
temp = y;
while(target++ < step && y-1 >= 0 && parkFull[x][y-1]) y--;
if(target-1 != step) y = temp;
break;
case "S":
temp = x;
while(target++ < step && x+1 < xWall && parkFull[x+1][y]) x++;
if(target-1 != step) x = temp;
break;
case "N":
temp = x;
while(target++ < step && x-1 >= 0 && parkFull[x-1][y]) x--;
if(target-1 != step) x = temp;
break;
}
}
공원을 이차원 배열로 그려놨기 때문에, 명령을 순서대로 수행하면 됩니다.
x 또는 y의 값이 배열의 범위를 벗어나지 않고, 장애물을 만나지 않을 경우만 명령을 수행합니다.
전체 코드
class Solution {
public int[] solution(String[] park, String[] routes) {
boolean[][] parkFull = new boolean[park.length][park[0].length()];
int x = 0, y = 0;
int xWall = parkFull.length, yWall = parkFull[0].length;
for(int i=0; i<park.length; i++) {
char[] cols = park[i].toCharArray();
for(int j=0; j<cols.length; j++) {
if(cols[j] == 'O') parkFull[i][j] = true;
else if(cols[j] == 'S') {
parkFull[i][j] = true;
x = i;
y = j;
}
}
}
for(String route : routes) {
String[] r = route.split(" ");
int step = Integer.parseInt(r[1]);
int target = 0, temp = 0;
switch(r[0]) {
case "E":
temp = y;
while(target++ < step && y+1 < yWall && parkFull[x][y+1]) y++;
if(target-1 != step) y = temp;
break;
case "W":
temp = y;
while(target++ < step && y-1 >= 0 && parkFull[x][y-1]) y--;
if(target-1 != step) y = temp;
break;
case "S":
temp = x;
while(target++ < step && x+1 < xWall && parkFull[x+1][y]) x++;
if(target-1 != step) x = temp;
break;
case "N":
temp = x;
while(target++ < step && x-1 >= 0 && parkFull[x-1][y]) x--;
if(target-1 != step) x = temp;
break;
}
}
return new int[] {x, y};
}
}
정확성 테스트
테스트 1 〉 | 통과 (11.25ms, 85.9MB) |
---|---|
테스트 2 〉 | 통과 (10.02ms, 70MB) |
테스트 3 〉 | 통과 (8.11ms, 73.1MB) |
테스트 4 〉 | 통과 (8.89ms, 82.4MB) |
테스트 5 〉 | 통과 (9.15ms, 68.2MB) |
테스트 6 〉 | 통과 (9.08ms, 84MB) |
테스트 7 〉 | 통과 (8.59ms, 77.7MB) |
테스트 8 〉 | 통과 (11.24ms, 76.2MB) |
테스트 9 〉 | 통과 (9.36ms, 77.5MB) |
테스트 10 〉 | 통과 (9.58ms, 77MB) |
테스트 11 〉 | 통과 (9.61ms, 72.6MB) |
테스트 12 〉 | 통과 (11.37ms, 74.5MB) |
테스트 13 〉 | 통과 (9.45ms, 70.8MB) |
테스트 14 〉 | 통과 (10.77ms, 79MB) |
테스트 15 〉 | 통과 (8.67ms, 69.8MB) |
테스트 16 〉 | 통과 (8.26ms, 83.1MB) |
테스트 17 〉 | 통과 (10.74ms, 77.2MB) |
테스트 18 〉 | 통과 (10.58ms, 77.7MB) |
테스트 19 〉 | 통과 (9.98ms, 79.2MB) |
테스트 20 〉 | 통과 (10.59ms, 76.8MB) |
반응형
'Algorithm > Java' 카테고리의 다른 글
프로그래머스 - 햄버거 만들기 JAVA :: 133502 (0) | 2023.08.02 |
---|---|
프로그래머스 - 개인정보 수집 유효기간 JAVA :: 2023 KAKAO BLIND RECRUITMENT :: 150370 (0) | 2023.01.09 |
프로그래머스 - 크기가 작은 부분 문자열 JAVA :: 147355 (0) | 2022.12.23 |
프로그래머스 - 푸드 파이트 대회 JAVA :: 134240 (0) | 2022.12.22 |
프로그래머스 - 삼총사 JAVA :: 131705 (0) | 2022.12.21 |