본문 바로가기

컴퓨터/프로그래머스

프로그래머스 - 49994번: 방문 길이 [Java]

문제: https://school.programmers.co.kr/learn/courses/30/lessons/49994

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

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