프로그래머스 방문 길이

맹민재·2023년 4월 4일
0

알고리즘

목록 보기
29/134
board = set()
direction = {"L":[0,-1], "R":[0,1], 'U':[1,0], "D":[-1,0]}

def move(dir, c):
    d = direction[dir]
    tmp = [0,0]
    for i in range(len(d)):
        tmp[i] = c[i] + d[i]
    
    if 0 > tmp[0] or 10 < tmp[0] or 0 > tmp[1] or 10 < tmp[1]:
        return c
    
    board.add((tuple(c), tuple(tmp)))
    board.add((tuple(tmp), tuple(c)))
    return tmp
    
def solution(dirs):
    c = [5,5]
    for dir in dirs:
        c = move(dir, c)
    print(board)
    return len(board) // 2

set 자료구조를 사용해 푼 문제이다.
캐릭터에 현재 이동 방향을 더해서 만약 갈 수 있는 경우라면 set에 현재 위치와 이동할 위치를 넣어주고 현재 위치를 이동할 위치로 바꿔준다.

set에 넣어줄때 반대 방향에 대해서도 같이 넣어줌으로써 나중에 반대 방향으로 이동하는 경우도 대비해준다.

양쪽 방향에 대해 set에 넣어주었기 때문에 2로 나눈 값이 정답이다.


처음에는 board[10][10] 크기의 2중 리스트를 만든후 이동한 캐릭터 위치에 대해 1을 넣어줘서 최종적으로 count(1)을 통해 답을 구하려고 했다.

debug 과정에서 set을 사용하면 굳이 2중 리스트를 만들 필요가 없다고 느껴져서 바로 set 자료구조를 사용하는 것으로 전환해 해결했다.

그 다음 이동한 좌표 정보만 set에 넣었다가 Test Case에서 반만 맞았는데 이유를 찾다가 같은 좌표에 도착했더라도 이동했던 경로가 다르면 다른 경우인 것을 깨달았다. 그래서 이동 전 좌표와 이동 후 좌표(반대 방향도 같이)를 set에 넣어 줌으로써 해결할 수 있었다.

profile
ㄱH ㅂrㄹ ㅈr

0개의 댓글