문제
https://school.programmers.co.kr/learn/courses/30/lessons/172928
나의 풀이
class Solution {
public int[] solution(String[] park, String[] routes) {
int[] answer = new int[2];
// 시작 좌표 찾기
for (int i = 0; i < park.length; i++) {
int start = park[i].indexOf("S");
if(start >= 0) {
answer[0] = i;
answer[1] = start;
break;
}
}
// 이동
for (String route : routes) {
String[] r = route.split(" ");
String site = r[0];
int moveIndex = Integer.parseInt(r[1]);
int maxW = park[0].length();
int maxH = park.length;
boolean isOk = true;
if (site.equals("E")) {
if ((answer[1] + moveIndex) >= maxW) { // 조건1 : 공원 벗어나는지 확인
continue;
} else { // 조건2 : 장애물을 만나는지 확인
String[] parkW = park[answer[0]].split("");
for (int i = answer[1]; i <= answer[1] + moveIndex; i++) {
if (parkW[i].equals("X")) {
isOk = false;
break;
}
}
}
if (isOk) {
answer[1] += moveIndex;
}
} else if (site.equals("W")) {
if ((answer[1] - moveIndex) < 0) {
continue;
} else {
String[] parkW = park[answer[0]].split("");
for (int i = answer[1]; i >= answer[1] - moveIndex; i--) {
if (parkW[i].equals("X")) {
isOk = false;
break;
}
}
}
if (isOk) {
answer[1] -= moveIndex;
}
} else if (site.equals("S")) {
if ((answer[0] + moveIndex) >= maxH) {
continue;
} else {
for (int i = answer[0]; i <= answer[0] + moveIndex; i++) {
if (park[i].substring(answer[1], answer[1] + 1).equals("X")) {
isOk = false;
break;
}
}
}
if (isOk) {
answer[0] += moveIndex;
}
} else if (site.equals("N")){
if ((answer[0] - moveIndex) < 0) {
continue;
} else {
for (int i = answer[0]; i >= answer[0] - moveIndex; i--) {
if (park[i].substring(answer[1], answer[1] + 1).equals("X")) {
isOk = false;
break;
}
}
}
if (isOk) {
answer[0] -= moveIndex;
}
}
}
return answer;
}
}
각 방향마다 조건 체크해서 Ok가 되면 좌표 이동하도록 구현했다.
최악의 상황으로 시간복잡도가 O(n²)으로 구현되어있지만, 최소한으로 동작하도록 제약 조건을 많이 걸었다.
'알고리즘 & 문제 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 당구 연습(java) (0) | 2023.07.06 |
---|---|
[프로그래머스] 달리기 경주(java) (0) | 2023.07.06 |
[프로그래머스] 두 개 뽑아서 더하기(java) (0) | 2023.02.23 |
[프로그래머스] 카드 뭉치(java) (0) | 2023.02.21 |
[프로그래머스] 3진법 뒤집기(java) (0) | 2023.02.20 |