DM Log

[Summer/Winter Coding(~2018)] 방문 길이 - Python / JavaScript 본문

알고리즘/프로그래머스

[Summer/Winter Coding(~2018)] 방문 길이 - Python / JavaScript

Dev. Dong 2025. 7. 20. 10:51

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

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

[문제 간단 요약]

 

  • (0,0)에서 시작하여 명령어("U", "D", "R", "L")에 따라 이동
  • 좌표 범위는 -5 ~ 5이며, 범위를 벗어난 이동은 무시
  • 동일한 길은 한 번만 방문한 것으로 처리

 

 

[문제 해결 방안]

  • 현재 좌표에서 이동할 좌표를 계산
  • 이동 가능하면 (출발지, 도착지) 쌍을 저장
  • 중복 제거를 위해 (a, b)와 (b, a)를 정렬된 튜플 또는 문자열로 저장
  • Python은 set, JavaScript는 Set을 사용해 중복 제거

[문제 해결 코드 - python]

def move_dir(y, x, directs):
    diry, dirx = directs
    dy = y + diry
    dx = x + dirx
    if dy < -5 or dy > 5 or dx < -5 or dx > 5:
        return y, x
    return dy, dx

def solution(dirs):
    direction_map = {
        "U": (1, 0),
        "D": (-1, 0),
        "R": (0, 1),
        "L": (0, -1)
    }

    y, x = 0, 0
    checked = set()

    for move in dirs:
        dy, dx = move_dir(y, x, direction_map[move])
        if (dy, dx) == (y, x):
            continue
        edge = tuple(sorted([(y, x), (dy, dx)]))
        checked.add(edge)
        y, x = dy, dx
    return len(checked)

 

 

[문제 해결 코드 - javascript]

 

<기본 큐 방식>

function moveDir(y, x, [dy, dx]) {
    const ny = y + dy;
    const nx = x + dx;
    if (ny < -5 || ny > 5 || nx < -5 || nx > 5) {
        return [y, x];
    }
    return [ny, nx];
}

function solution(dirs) {
    const directDict = { "U": [1, 0], "D": [-1, 0], "R": [0, 1], "L": [0, -1] };
    let y = 0;
    let x = 0;
    let checked = new Set();
    for (let dir of dirs) {
        const [ny, nx] = moveDir(y, x, directDict[dir]);
        if (ny === y && nx === x) continue;
        const edge = [[y, x], [ny, nx]]
            .sort()
            .map(p => p.join(','))
            .join("|");
        checked.add(edge);
        y = ny;
        x = nx;
    }
    return checked.size;
}