프로그래머스_방문 길이

임정민·2023년 12월 29일
0

알고리즘 문제풀이

목록 보기
135/173
post-thumbnail

프로그래머스 Lv2 문제입니다. 실전에 대비하기 위해 60분 시간제한을 두고 풀었습니다.

문제

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

[나의 풀이]

⌛ 51분


def solution(dirs):
    answer = 0

    board = {}
    
    for i in range(11):
        for j in range(11):
            for com in ['R','D','L','U']:
                key = str(i)+str(j)+com
                board[key] = 0
    
    move = {'R':[0,1], 'D':[1,0], 'L':[0,-1], 'U':[-1,0]}
    reverse_key = {'R':'L','D':'U','L':'R','U':'D'}
    x,y = 5,5
    
    for dir_ in dirs:
        
        x_, y_ = move[dir_]
        x_next = x+x_
        y_next = y+y_
        
        if x_next>=0 and x_next<=10 and y_next>=0 and y_next<=10:
            
            key1 = str(x)+str(y)+dir_
            x = x_next
            y = y_next
            key2 = str(x)+str(y)+reverse_key[dir_]
            
            if board[key1]==0 :
                board[key1] = 1
                board[key2] = 1         
                answer += 1
    
    return answer

11x11 좌표평면에서 입력된 명령대로 이동하며 중복되지 않은 이동 경로 갯수를 구하는 문제입니다.🐕🐕🐕

지나온 좌표가 아닌 이동 경로를 파악해야 하므로 '00R', '55D','109D'과 같이 현재 좌표 위치와 명령어로 이루어진 key들을 갖는 dict을 선언하여 이동 경로를 기억하였습니다.

입력된 명령들 대로 이동하며 경로를 기억할 때, '55L'로 이동했다면 동일 이동 경로의 다른 표현인 '54R'으로도 이동한 것으로 취급하여 해결하였습니다.

[다른 사람의 풀이1]


def solution(dirs):
    s = set()
    d = {'U': (0,1), 'D': (0, -1), 'R': (1, 0), 'L': (-1, 0)}
    x, y = 0, 0

    for i in dirs:
        nx, ny = x + d[i][0], y + d[i][1]

        if -5 <= nx <= 5 and -5 <= ny <= 5:
            s.add((x,y,nx,ny))
            s.add((nx,ny,x,y))
            x, y = nx, ny

    return len(s)//2

이동 경로들을 set() 집합에 넣어 간결히 풀어낸 방식입니다.🕊️🕊️🕊️

'나의 풀이'와 유사하게 동일한 이동한 경로, 이동했다고 취급할 경로

  1. (현재x, 현재y, 이동 후x, 이동 후y)
  2. (이동 후x, 이동 후y, 현재x, 현재y)

들을 각각 set()에 add하여 갯수를 셀 수 있었습니다.

[다른 사람의 풀이2]


def solution(dirs):
    visit = set()
    x = 0; y = 0
    
    for d in dirs:
        if d == 'U' and y < 5:
            visit.add(((x, y), (x, y+1)))
            y += 1
            
        elif d == 'D' and y > -5:
            visit.add(((x, y-1), (x, y)))
            y -= 1
            
        elif d == 'R' and x < 5:
            visit.add(((x, y), (x+1, y)))
            x += 1
            
        elif d == 'L' and x > -5:
            visit.add(((x-1, y), (x, y)))
            x -= 1

    return len(visit)

'다른 사람의 풀이1'과 같이 set()을 활용하되, 명령어별 이동 방식을 if-elif 문으로 처리하여 풀이를 이해하는데는 더 직관적인 코드였습니다.

감사합니다.

profile
https://github.com/min731

0개의 댓글