본문 바로가기

알고리즘 문제풀이

방문 길이

방문 길이 (프로그래머스)

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

문제 설명

게임 캐릭터를 4가지 명령어를 통해 움직이려 합니다. 명령어는 다음과 같습니다.

U: 위쪽으로 한 칸 가기

D: 아래쪽으로 한 칸 가기

R: 오른쪽으로 한 칸 가기

L: 왼쪽으로 한 칸 가기

캐릭터는 좌표평면의 (0, 0) 위치에서 시작합니다.

좌표평면의 경계는 왼쪽 위(-5, 5), 왼쪽 아래(-5, -5), 오른쪽 위(5, 5), 오른쪽 아래(5, -5)로 이루어져 있습니다.

좌표평면의 경계를 넘어가는 명령어는 무시합니다.

명령어가 매개변수 dirs로 주어질 때, 게임 캐릭터가 처음 걸어본 길의 길이를 구하여 return 하는 solution 함수를 완성해 주세요.

풀이

set 자료구조를 이용하여 풀었습니다

set 자료구조는 중복을 허용하지 않는 자료구조입니다

이 특성을 이용하여 이미 한번 지나간 거리를 제외시킬 수 있습니다

dirs길이만큼 반복하면서 set 자료구조에 이동한 거리를 문자열로 저장합니다(기록)

ex)

  • 0,0 시작 => 위쪽으로 이동 0,1 => 기록 0001, 0100 // (출발+도착), (도착+출발)

지나왔던길을 다시 지나가는경우와 되돌아가는경우 2가지를 고려하여 2개씩 기록합니다

현재 set 자료구조 값: Set(2) { '0001', '0100' }

  • 0, 1 시작 = > 왼쪽으로 이동 -1, 0 => 기록 '01-11', '-1101' // (출발+도착), (도착+출발)

현재 set 자료구조 값: Set(4) { '0001', '0100', '01-11', '-1101' }

마지막으로 나누기 2를 하여 (2개씩 기록했으니) 정답을 구하면 됩니다

 

function solution(dirs) {
    let move = { L: [-1, 0], R: [1, 0], U: [0, 1], D: [0, -1] };
    let now = [0, 0];
    let route = new Set();

    for (let dir of dirs) {
        let nowX = now[0] + move[dir][0];
        let nowY = now[1] + move[dir][1];
        if (nowX > 5 || nowX < -5 || nowY > 5 || nowY < -5) continue;
        route.add('' + now[0] + now[1] + nowX + nowY);
        route.add('' + nowX + nowY + now[0] + now[1]);
        now = [nowX, nowY];
    }

    return route.size / 2;
}

'알고리즘 문제풀이' 카테고리의 다른 글

영어 끝말잇기  (0) 2023.02.07
스킬트리  (0) 2023.02.07
멀쩡한 사각형  (0) 2023.02.07
숫자 게임  (0) 2023.02.06
시소 짝궁  (0) 2023.01.25