개발 창고/Algorithm
[프로그래머스] 공원 산책 - JAVA
로이제로
2024. 1. 31. 23:41
반응형
문제
https://school.programmers.co.kr/learn/courses/30/lessons/172928
문제 내용은 지적 재산 보호 차원에서 가져오지 않고 풀이만 공유드리도록 하겠습니다.
풀이
제 풀이가 무조건적으로 맞는 것도 최적의 답변도 아니지만, 이런 풀이도 있다는 차원에서 작성해 보며, 좀 더 나은 방법이 있다면 이야기해 주셔도 도움 될 것 같습니다.
class Solution {
public int[] solution(String[] park, String[] routes) {
int[] answer = new int[2];
// Step. 시작 위치와 장애물 x좌표와 y좌표 기준으로 체크위치 체크
int stX = 0; // 시작 x좌표
int stY = 0; // 시작 y좌표
int maxX = park[0].length() - 1;
int maxY = park.length - 1;
String[] parkX = park; // 가로 방향 동선 (EAST, WEST)
String[] parkY = new String[maxX + 1]; // 세로 방향 동선 (NORTH, SOUTH)
for(int i = 0; i <= maxY; i++){
String line = park[i];
for(int j = 0; j <= maxX; j++){
char point = line.charAt(j);
if(point == 'S'){
stX = j;
stY = i;
}
if(parkY[j] == null) parkY[j] = "";
parkY[j] += point;
}
}
// System.out.println(String.join(", ", parkX));
// System.out.println(String.join(", ", parkY));
// Step. 산책 시작
int moveX = stX;
int moveY = stY;
for(String route:routes){
String op = route.split(" ")[0];
int n = Integer.valueOf(route.split(" ")[1]);
// System.out.println(moveX + ", " + moveY);
// Step. 동쪽으로 이동하는 경우
if(op.equals("E")){
int sIdx = moveX;
int eIdx = moveX + n;
if(eIdx > maxX) eIdx = maxX;
// System.out.println(n + " : " + parkX[moveY].substring(sIdx, eIdx + 1));
// Step. 중간에 장애물이 있는지 체크
int blockIdx = parkX[moveY].substring(sIdx, eIdx + 1).indexOf("X");
// Step. 장애물이 없거나 공원을 벗어나지 않는 경우
if(blockIdx < 0 && moveX + n <= maxX) moveX = eIdx;
// Step. 서쪽으로 이동하는 경우
}else if(op.equals("W")){
int sIdx = 0;
int eIdx = moveX;
if(moveX > n) sIdx = moveX - n;
// System.out.println(n + " : " + parkX[moveY].substring(sIdx, eIdx + 1));
// Step. 중간에 장애물이 있는지 체크
int blockIdx = parkX[moveY].substring(sIdx, eIdx + 1).lastIndexOf("X");
// Step. 장애물이 없거나 공원을 벗어나지 않는 경우
if(blockIdx < 0 && moveX - n >= 0) moveX = sIdx;
// Step. 남쪽으로 이동하는 경우
}else if(op.equals("S")){
int sIdx = moveY;
int eIdx = moveY + n;
if(eIdx > maxY) eIdx = maxY;
// System.out.println(n + " : " + parkY[moveX].substring(sIdx, eIdx + 1));
// Step. 중간에 장애물이 있는지 체크
int blockIdx = parkY[moveX].substring(sIdx, eIdx + 1).indexOf("X");
// Step. 장애물이 없거나 공원을 벗어나지 않는 경우
if(blockIdx < 0 && moveY + n <= maxY) moveY = eIdx;
// Step. 북쪽으로 이동하는 경우
}else if(op.equals("N")){
int sIdx = 0;
int eIdx = moveY;
if(moveY > n) sIdx = moveY - n;
// System.out.println(n + " : " + parkY[moveX].substring(sIdx, eIdx + 1));
// Step. 중간에 장애물이 있는지 체크
int blockIdx = parkY[moveX].substring(sIdx, eIdx + 1).lastIndexOf("X");
// Step. 장애물이 없거나 공원을 벗어나지 않는 경우
if(blockIdx < 0 && moveY - n >= 0) moveY = sIdx;
}
}
// System.out.println("[" + moveY + ", " + moveX + "]");
answer[0] = moveY;
answer[1] = moveX;
return answer;
}
}
반응형