[プログラマ/python]アクセス長


🧑🏻‍💻 質問リンク

問題を解く


所与の方向に座標中の運動長を求める実現問題.この問題は白俊問題の機械掃除機問題に似ている.重複する線を区別するために,set()関数を用いた.set()関数を覚えていない場合があります
set関数クリーンアップサイトを参考にすればいいです.
visited.add((x, y, nx, ny))
visited.add((nx, ny, x, y))
コードを見ると、例えば座標が(0,0)から(1,0)に移動するときと(1,0)から(0,0)に移動するときとが同じ線であることから、上記の手順が実現される.

コード#コード#

def direction(d):
    # 위쪽으로 한 칸
    if d == "U":
        return 0
    # 아래쪽으로 한 칸
    elif d == "D":
        return 2
    # 오른쪽으로 한 칸
    elif d == "R":
        return 1
    # 왼쪽으로 한 칸
    elif d == "L":
        return 3
      

def solution(dirs):
    answer = 0

    # 위, 오른쪽, 아래, 왼쪽
    dx = [-1, 0, 1, 0]
    dy = [0, 1, 0, -1]

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

    for d in dirs:
        i = direction(d)
        nx, ny = x + dx[i], y + dy[i]
        # 범위를 벗어날 경우 무시
        if nx < -5 or nx > 5 or ny < -5 or ny > 5:
            continue

        # 하나의 선분을 이동할 때 양방향을 같이 확인
        if (x, y, nx, ny) not in visited:
            visited.add((x, y, nx, ny))
            visited.add((nx, ny, x, y))
            answer += 1
            
        x, y = nx, ny

    return answer

結果