본문 바로가기

Algorithm/프로그래머스

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

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

 

프로그래머스

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

programmers.co.kr

 

 

1. 해결방법

상하좌우를 딕셔너리 구조로 초기 값을 설정한다.

for문을 돌려서 if문으로 범위를 넘어가지 않는 선에서 로직을 구성하는데 여기서 중요한 부분은
result 리스트에 저장할 때, (y, x, dy, dx) 형태로 저장을 한다. 중복된 거리를 이동하더라도 answer 카운트는 올라가지 않기 때문에 set() 메서드를 통해서 중복된 값들을 제거한다.

틀린 코드에서는 단순히 일방통행을 기준으로 잡았다. (0, 0)에서 (1, 0)으로 업 했다면 그 거리는 중복으로 카운팅되지 않는다. 하지만 (1,0)에서 (0,0)으로 다운될 때에도 카운팅이 되지 않는다는 특징이 숨어있다... 그래서 반대의 경우도 result에 append해주고, 길이를 // 2 하면 된다.

물론 본인은 풀지 못했다. 오히려 초기 값을 딕셔너리 구조로 설정하는 것 부터 막혀서 다른 분들의 설명을 많이 도움 받았다. ㅠ

 

2. 정답코드

(1) 틀린 코드

def solution(dirs):
    answer = 0
    
    keys = {'U': (1, 0), 'D': (-1, 0), 'R': (0, 1), 'L':(0, -1)}
    start = (0, 0)
    result = []
    
    for key in dirs:
        y, x = start
        dy, dx = keys[key]
        
        if x + dx > 5 or x + dx < -5 or y + dy > 5 or y + dy < -5:
            continue
        
        result.append((y, x, y + dy, x + dx))
        start = (y + dy, x + dx)
        
    return len(set(result))

 

 

(2) 맞은 코드

def solution(dirs):
    answer = 0
    
    keys = {'U': (1, 0), 'D': (-1, 0), 'R': (0, 1), 'L':(0, -1)}
    start = (0, 0)
    result = []
    
    for key in dirs:
        y, x = start
        dy, dx = keys[key]
        
        if x + dx > 5 or x + dx < -5 or y + dy > 5 or y + dy < -5:
            continue
        
        result.append((y, x, y + dy, x + dx))
        result.append((y + dy, x + dx, y, x))
        start = (y + dy, x + dx)
        
    return len(set(result)) // 2