https://school.programmers.co.kr/learn/courses/30/lessons/49994
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
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스] Lv.2 2개 이하로 다른 비트 (0) | 2022.09.30 |
---|---|
[프로그래머스] Lv.2 모음사전 (0) | 2022.09.30 |
[프로그래머스] Lv.2 땅따먹기 (0) | 2022.09.28 |
[프로그래머스] Lv.2 피로도 (0) | 2022.09.28 |
[프로그래머스] Lv.2 위장 (0) | 2022.09.27 |