프로그래머스 방문 길이 코드 및 해설 (파이썬)

2021. 4. 21. 11:21algorithm

반응형

programmers.co.kr/learn/courses/30/lessons/49994?language=python3

 

코딩테스트 연습 - 방문 길이

 

programmers.co.kr

 

💡 지나간 길을 리스트에 저장하여 처음 지나는 길인지 아닌지 판단했습니다.

 

우선 move라는 함수를 만들어 U, D, R, L에 따라 움직이도록 했고, solution 함수에서 주어진 명령어에 따라 움직이되, (1) 경계선을 지나는 명령어는 아예 무시하고 위치 업데이트 하지 않았습니다 (2) 그 외의 명령어는 모두 위치 업데이트 하되, 처음 지나간 길을 가는 경우 해당 길을 hist라는 리스트에 저장하고 answer를 1 증가시켰습니다.

 

* 예전에 같은 길을 반대 방향으로 지났던 경우도 중복된 길을 다시 걷는 것임을 주의해야 합니다! 

 

def move(pos, direction):
    if direction == 'U': # 위
        return (pos[0], pos[1]+1)
    elif direction == 'D': # 아래 
        return (pos[0], pos[1]-1)
    elif direction == 'R': # 오른쪽 
        return (pos[0]+1, pos[1])
    else: # 왼쪽
        return (pos[0]-1, pos[1])
    
def solution(dirs):
    answer = 0
    pos = (0,0) # 시작점 
    hist = []
    
    for d in dirs:
        new_pos = move(pos, d)
        
        # 좌표평면의 경계를 넘어가는 명령어는 무시
        if new_pos[0] < -5 or new_pos[0] > 5 or new_pos[1] < -5 or new_pos[1] > 5:
            continue
            
        route = [pos, new_pos]
        # 위치 업데이트 
        pos = new_pos
        
        # 반대 방향 포함하여 처음 걸어본 길이면
        if route not in hist and route[::-1] not in hist:
            hist.append(route)
            answer += 1 
   
    return answer

 

 

 

++ move 함수를 dictionary로 수정 

 

def solution(dirs):
    answer = 0
    pos = (0,0) # 시작점 
    hist = []

    movement = {'U':(0,1), 'D':(0,-1), 'R':(1,0), 'L':(-1,0)}

    for d in dirs:
        x, y = pos
        dx, dy = movement[d]

        new_pos = (x+dx, y+dy)

        # 좌표평면의 경계를 넘어가는 명령어는 무시
        if new_pos[0] < -5 or new_pos[0] > 5 or new_pos[1] < -5 or new_pos[1] > 5:
            continue

        route = [pos, new_pos]
        # 위치 업데이트 
        pos = new_pos

        # 반대 방향 포함하여 처음 걸어본 길이면
        if route not in hist and route[::-1] not in hist:
            hist.append(route)
            answer += 1 

    return answer
반응형