자료구조 및 알고리즘/프로그래머스

[프로그래머스] level2. 방문 길이

viamemine 2024. 6. 14. 16:07
728x90
반응형

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

풀이 

 

중복 경로의 길이를 제외한 움직인 경로의 길이를 반환 ***


1. 중복 경로는 최종 길이에 포함하지 않음 = 중복 포함하지 않을 때 set() 사용 고려
2. 음수 좌표 포함하지 않음 = 2차원 배열에서 음수 인덱스 사용 안함

원점을 (0,0)에서 (5,5)로 바꿔도 됨

 

def is_valid_move(dx, dy): # 좌표평면을 벗어나는지 체크하는 함수
    return 0 <= dx < 11 and 0 <= dy < 11

def solution(dirs):
    
    # U D R L
    dx = [0, 0, 1, -1]
    dy = [1, -1, 0, 0]
    
    x, y = 5,5 
    
    ans = set() # 겹치는 좌표는 1개로 처리하기 위함
    
    for i in dirs:
        if i == 'U': 
            nx = x + dx[0]
            ny = y + dy[0]

        elif i =='D':
            nx = x + dx[1]
            ny = y + dy[1]
        
        elif i =='R': 
            nx = x + dx[2]
            ny = y + dy[2]
        
        elif i == 'L':
            nx = x + dx[3]
            ny = y + dy[3]
        
        if not is_valid_move(nx, ny): # 벗어난 좌표는 인정하지 않음
            continue
        
        # A에서 B로 간 경우, B에서 A로 간 경우 (총 경로의 개수는 방향성이 없기 때문 )
        ans.add((x, y, nx, ny)) # .add: set에서 요소 추가
        ans.add((nx, ny, x, y))
        
        x, y = nx, ny # 좌표를 이동했기 때문에 업데이트
        
    return len(ans)/2
728x90