컴퓨터/프로그래머스
프로그래머스 - 49994번: 방문 길이 [Java]
이상한 나그네
2023. 11. 4. 00:35
문제: https://school.programmers.co.kr/learn/courses/30/lessons/49994
1. 코드
class Solution {
static int answer = 0;
public int solution(String dirs) {
int[][] move = {
{1, 0},
{-1, 0},
{0, 1},
{0, -1}
};
boolean[][][][] visit = new boolean[11][11][11][11];
int[] position = {5, 5};
for(char c : dirs.toCharArray()) {
switch(c) {
case 'U' -> moving(position, move[0], visit);
case 'D' -> moving(position, move[1], visit);
case 'R' -> moving(position, move[2], visit);
case 'L' -> moving(position, move[3], visit);
}
}
return answer;
}
private static void moving(int[]p, int[] m, boolean[][][][] v) {
if((p[0] + m[0]) <= 10 && (p[0] + m[0]) >= 0 && (p[1] + m[1]) <= 10 && (p[1] + m[1]) >= 0) {
int[] before = p.clone();
p[0] += m[0];
p[1] += m[1];
if(!v[p[0]][p[1]][before[0]][before[1]]) {
v[p[0]][p[1]][before[0]][before[1]] = true;
v[before[0]][before[1]][p[0]][p[1]] = true;
answer++;
}
}
}
}
2. 설명
int[][] move = {
{1, 0},
{-1, 0},
{0, 1},
{0, -1}
};
위에서 아래방향으로 U, D, R, L 명령어에 대한 움직임입니다.
for(char c : dirs.toCharArray()) {
switch(c) {
case 'U' -> moving(position, move[0], visit);
case 'D' -> moving(position, move[1], visit);
case 'R' -> moving(position, move[2], visit);
case 'L' -> moving(position, move[3], visit);
}
}
글자를 하나씩 읽어서 글자에 대응하는 움직임을 인자로 전달합니다.
private static void moving(int[]p, int[] m, boolean[][][][] v) {
if((p[0] + m[0]) <= 10 && (p[0] + m[0]) >= 0 && (p[1] + m[1]) <= 10 && (p[1] + m[1]) >= 0) {
int[] before = p.clone();
p[0] += m[0];
p[1] += m[1];
if(!v[p[0]][p[1]][before[0]][before[1]]) {
v[p[0]][p[1]][before[0]][before[1]] = true;
v[before[0]][before[1]][p[0]][p[1]] = true;
answer++;
}
}
}
현재 위치에서 이동한 값이 0미만이나 10 초과가 아니라면 움직여주는데 움직이기 전 좌표와 움직인 후 좌표 값을 기준으로 방문한 흔적이 있는지 확인 후 없다면 방문처리를 해주며 answer를 증가합니다.
3. 정리
- 게임 캐릭터의 위치를 처음부터 5,5로 배치하면 음수에 대한 걱정이 없이 쉽게 해결 가능하다.
- 방문처리를 4차원 배열을 이용한다면 쉽게 처리 가능하다.
출처: 프로그래머스 코딩 테스트 연습,
https://school.programmers.co.kr/learn/challenges