문제
https://programmers.co.kr/learn/courses/30/lessons/49994
코딩테스트 연습 - 방문 길이
programmers.co.kr
풀이
빡구현 문제이다. 흔히 시뮬레이션이라고 하는데 몇 가지 예외에 대해 생각을 못 해서 힘들었다.
일단 움직일 수 있는 보드를 만들었다. 4차원 배열로 만들었는데 앞에 2칸은 현재 위치를 저장해줬고, 뒤에 두칸은 어느 위치에서 왔는지 저장해주었다. 이렇게 설계한 이유는 예를들어 현재 위치만 저장하는 2차원 배열을 통해 'U' -> 'D'로 움직여 0,0이라는 위치에 도달하여 0,0을 방문처리해버리면 나중에 다른 방향에서 0,0에 방문했을 때 따라온 길은 다른데 0,0이 이미 방문했다는 이유로 새로운 길이 아니라는 판단을 해버릴 수 있어서 4차원 배열을 통해 관리를 해주었다.
문제의 의도대로 move함수를 통해 보드밖으로 나가는 움직임에 대해서는 무시처리를 해주었고, 예를들어 0,0 -> 0,1과 0,1 -> 0,0은 같은 길을 지나온 것이기 때문에 중복 체크를 막기위해 양방향에 대해 방문처리를 해주었다.
코드
class Solution {
// 앞에 2개 -> 지금 도착한 위치, 뒤에 2개 -> 출발지의 위치
int[][][][] board = new int[11][11][11][11];
int moveCnt = 0;
int x = 5;
int y = 5;
public int solution(String dirs) {
int answer = 0;
for(int i = 0; i < dirs.length(); i++) {
move(dirs.charAt(i));
System.out.println("i = " + i + " moveCnt = " + moveCnt);
}
answer = moveCnt;
return answer;
}
public void move(char dir) {
switch (dir) {
case 'U':
x--;
if(x < 0) {
x++;
break;
} else {
if(board[x][y][x + 1][y] == 0) {
board[x][y][x + 1][y] = 1;
board[x + 1][y][x][y] = 1;
moveCnt++;
}
break;
}
case 'D':
x++;
if(x > 10) {
x--;
break;
} else {
if(board[x][y][x - 1][y] == 0) {
board[x][y][x - 1][y] = 1;
board[x - 1][y][x][y] = 1;
moveCnt++;
}
break;
}
case 'R':
y++;
if(y > 10) {
y--;
break;
} else {
if(board[x][y][x][y - 1] == 0) {
board[x][y][x][y - 1] = 1;
board[x][y - 1][x][y] = 1;
moveCnt++;
}
break;
}
case 'L':
y--;
if(y < 0) {
y++;
break;
} else {
if(board[x][y][x][y + 1] == 0) {
board[x][y][x][y + 1] = 1;
board[x][y + 1][x][y] = 1;
moveCnt++;
}
break;
}
}
}
}
'프로그래머스' 카테고리의 다른 글
[프로그래머스] 프로그래머스 Level2 점프와 순간 이동 Java (0) | 2022.05.05 |
---|---|
[프로그래머스] 프로그래머스 Level1 신규 아이디 추천 Java (카카오 코딩테스트) (0) | 2022.05.04 |
[프로그래머스] 프로그래머스 Level1 두 개 뽑아서 더하기 Java (0) | 2022.05.04 |
[프로그래머스] 프로그래머스 Level1 약수의 개수와 덧셈 Java (0) | 2022.05.04 |
[프로그래머스] 프로그래머스 Level3 멀리 뛰기 C++ (0) | 2022.05.03 |