구현
board
를 만든다.-5 <= x <=5
, -5 <= y <=5
, 시작점 (0, 0)
로 되어 있으나 편의상 0 <= x <=10
, 0 <= y <=10
, (5,5)
로 생각하여 풀이를 진행하였다.map
을 활용해 각 알파벳이 어떤 방향을 말하는지 저장해서 이후 바로 값을 O(1)으로 조회할 수 있도록 했다.dirs
에서 한 글자씩 가져온다.d
에 map
을 활용해 바로 어떤 방향인지 가져온다.board[x][y][d] == false
or board[testX][testY][3 - d]== flase
) 처음 방문한 길 횟수를 저장하는 answer
을 1씩 증가 한다.board[x][y][d] = true;
board[testX][testY][3 - d] = true;
이 부분에 대하여 조금 더 설명을 덧붙이자면,
위 그림 처럼 방향 인덱스를 붙여서
현재 x, y에서 다음 이동 좌표 testX, testY로 이동한다고 생각했을 때,
'U'
위 방향이라고 가정하면, x, y
에서의 위쪽으로 이동하는 길과 testX, testY
기준에선는 아랫쪽 길이 동일한 길이므로 해당 길을 모두 이동했다고 true
로 표시하였다.
여기서 x, y
에서 보는 방향과 testX, testY
에서 보는 방향이 정 반대 방향 임을 알 수 있는 데, 위처럼 index를 매기면 항상 상 + 하 = 좌 + 우 = 3
으로 동일한 것을 확인 할 수 있다.
따라서 반대 방향의 index
는 항상 3 - 현재 인덱스
를 하면 쉽게 구할 수 있다.
이를 활용해 이동했던 길을 표시하였다.
마지막으로 x, y
를 testX, testY
로 업데이트 해준다.
위 과정을 반복한 후 최종 answer (처음 방문한 길의 수)를 리턴한다.
import java.util.*;
class Solution {
public static boolean[][][] board;
public static final int[] dx = {-1, 0, 0, 1};
public static final int[] dy = {0, 1, -1, 0};
public int solution(String dirs) {
board = new boolean[11][11][4];
int x = 5;
int y = 5;
int answer = 0;
Map<Character, Integer> map = new HashMap<>();
map.put('U', 0);
map.put('R', 1);
map.put('L', 2);
map.put('D', 3);
for (int i = 0; i < dirs.length(); i++) {
int d = map.get(dirs.charAt(i));
int testX = x + dx[d];
int testY = y + dy[d];
if (!isPossible(testX, testY)) continue;
if (!board[x][y][d]) {
answer++;
}
board[x][y][d] = true;
board[testX][testY][3 - d] = true;
x = testX;
y = testY;
}
return answer;
}
public boolean isPossible(int x, int y) {
return 0 <= x && x < 11 && 0 <= y && y < 11;
}
}