https://school.programmers.co.kr/learn/courses/30/lessons/49994
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
def solution(dirs):
cx = 0
cy = 0
moved = set()
for d in dirs:
if d == 'U':
nx = cx
ny = cy+1
elif d == 'D':
nx = cx
ny = cy-1
elif d == 'L':
nx = cx-1
ny = cy
elif d =='R':
nx = cx+1
ny = cy
if nx > 5 or nx < -5 or ny > 5 or ny < -5:
continue
moved.add((cx, cy, nx, ny))
moved.add((nx, ny, cx, cy))
cx = nx
cy = ny
return len(moved) // 2
먼저 사용한 변수는 다음과 같이 구성됩니다.
- cx : 현재 x 좌표
- cy : 현재 y 좌표
- nx : 다음 x 좌표
- ny : 다음 y 좌표
- moved : 움직였던 길을 저장하기 위한 집합(set) 자료구조
dirs 리스트를 반복하며 조건문을 지나게 됩니다.
조건 'U'와 'D'는 x 좌표를 바꿀 이유가 없기 때문에 현재 x 좌표를 다음 x 좌표가 그대로 따라갑니다.
하지만 y 좌표는 'U'의 경우에 한 칸 위로 올라가야 하기 때문에 +1, 'D'의 경우에는 한 칸 아래로 내려가야 하기 때문에 -1입니다.
조건 'L'과 'R'은 'U', 'D'와 반대로 y 좌표를 바꾸지 않고 x 좌표를 바꾸게 됩니다.
위치를 다음 x, y로 바로 이동시키는 것이 아니라 다음 x, y 좌표가 좌표 평면의 경계를 넘어가면 무시해야 하기 때문에
다음 조건문에서 좌표 평면의 경계를 넘어가는 경우는 continue 키워드를 사용하여 무시해줍니다.
움직인 길을 저장하기 위하여 (현재 x, 현재 y 다음 x, 다음 y)를 저장합니다.
그리고 캐릭터가 (0, 0)에서 (0,1)로 간 길과 (1, 0)에서 (0,0)으로 간 길은 동일한 길이기 때문에
(다음 x, 다음 y, 현재 x, 현재 y)또한 저장해줍니다.
집합 자료구조는 중복 저장을 하지 않기 때문에 중복으로 들어온 값은 자연스럽게 무시가 됩니다.
마지막으로 (0, 0) --> (1, 0) 길과 (1,0) --> (0,0)으로 간 길은 동일하기 때문에 2로 나누어 값을 반환합니다.
'코딩테스트' 카테고리의 다른 글
[코딩테스트] 프로그래머스 더 맵게 파이썬(Python) (0) | 2023.01.03 |
---|---|
[코딩테스트] 프로그래머스 스킬트리 파이썬(Python) (0) | 2023.01.01 |
[코딩테스트] 프로그래머스 점프와 순간 이동 파이썬(Python) (0) | 2022.12.28 |
[코딩테스트] 프로그래머스 영어 끝말잇기 파이썬(Python) (0) | 2022.12.27 |
[코딩테스트] 프로그래머스 할인 행사 파이썬(Python) (0) | 2022.12.26 |