문제: 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
'컴퓨터 > 프로그래머스' 카테고리의 다른 글
프로그래머스 - 49993번: 스킬트리 [Java] (0) | 2023.11.06 |
---|---|
프로그래머스 - 42584번: 주식가격 [Java] (0) | 2023.11.05 |
프로그래머스 - 1844번: 게임 맵 최단거리 [Java] [실패] (0) | 2023.11.03 |
프로그래머스 - 84512번: 모음사전 [Java] (0) | 2023.11.02 |
프로그래머스 - 42888번: 오픈채팅방 [Java] (0) | 2023.11.01 |