문제
문제 설명
게임 캐릭터를 4가지 명령어를 통해 움직이려 합니다. 명령어는 다음과 같습니다.
- U: 위쪽으로 한 칸 가기
- D: 아래쪽으로 한 칸 가기
- R: 오른쪽으로 한 칸 가기
- L: 왼쪽으로 한 칸 가기
캐릭터는 좌표평면의 (0, 0) 위치에서 시작합니다. 좌표평면의 경계는 왼쪽 위(-5, 5), 왼쪽 아래(-5, -5), 오른쪽 위(5, 5), 오른쪽 아래(5, -5)로 이루어져 있습니다.
예를 들어, ULURRDLLU로 명령했다면
- 1번 명령어부터 7번 명령어까지 다음과 같이 움직입니다.
- 8번 명령어부터 9번 명령어까지 다음과 같이 움직입니다.
이때, 우리는 게임 캐릭터가 지나간 길 중 캐릭터가 처음 걸어본 길의 길이를 구하려고 합니다. 예를 들어 위의 예시에서 게임 캐릭터가 움직인 길이는 9이지만, 캐릭터가 처음 걸어본 길의 길이는 7이 됩니다. (8, 9번 명령어에서 움직인 길은 2, 3번 명령어에서 이미 거쳐 간 길입니다)
단, 좌표평면의 경계를 넘어가는 명령어는 무시합니다.
예를 들어, LULLLLLLU로 명령했다면
- 1번 명령어부터 6번 명령어대로 움직인 후, 7, 8번 명령어는 무시합니다. 다시 9번 명령어대로 움직입니다.
이때 캐릭터가 처음 걸어본 길의 길이는 7이 됩니다.
명령어가 매개변수 dirs로 주어질 때, 게임 캐릭터가 처음 걸어본 길의 길이를 구하여 return 하는 solution 함수를 완성해 주세요.
제한사항
- dirs는 string형으로 주어지며, 'U', 'D', 'R', 'L' 이외에 문자는 주어지지 않습니다.
- dirs의 길이는 500 이하의 자연수입니다.
코드
def solution(dirs):
answer = 0
x, y = 0, 0 #시작점
dic = {"U" : (0, 2), "D" : (0, -2), "R" : (2, 0), "L" : (-2, 0)} #방향별 움직임
point = {"U" : (0, 1), "D" : (0, -1), "R" : (1, 0), "L" : (-1, 0)} #방향별 지나왔던 지점
stack = []
for dir_ in dirs:
dx, dy = dic[dir_] #해당 좌표만큼 이동
px, py = point[dir_] #해당 좌표만큼 움직였을때 지나온 지점과 같다
#좌표를 벗어나지 않게 예외처리해준다
if ((x + dx) ** 2) ** 0.5 > 10 or ((y + dy) ** 2) ** 0.5 > 10:
continue
#이미 지나온 지점을 지나지 않았다면 지나가도 되는 지점이다
if (x + px, y + py) not in stack:
stack.append((x + px, y + py))
answer += 1
x, y = x + dx, y + dy #이동
return answer
진행 과정
예제 #1
dirs = "ULURRDLLU"
캐릭터가 처음 걸어본 길의 길이를 구하려면 걸은 길의 중간 지점을 안지났던 길을 구하면 된다.
위 좌표에서 캐릭터는 1씩 움직임으로 0.5만큼의 지점을 이용하여 캐릭터가 지나왔는지 안지나왔는지를 판단하면 되는 것이다. 나는 해당 좌표를 (10, 10)으로 두 배만큼 넓히고 1만큼의 지점을 지나온 중간 지점으로 보았다.
위 그림과 같은 좌표라 가정하고 해당 문제를 풀었다.
1) dic_ = "U" #위로 이동
위 그림과 같이 빨간색 점이 캐릭터가 이동하여 도착한 지점이고, 초록색 점이 캐릭터가 지나온 지점이다
2) stack = [(0, 1)] #(0,1) 지점을 지나옴
위에처럼 진행해보겠다.
3) dic_ = "L" #왼쪽으로 이동
3) stack = [(0, 1), (-1, 2)] #1)과 같이 이동하면서 지나온 지점을 저장
4) dic_ = "U" #위로 이동
5) stack = [(0, 1), (-1, 2), (-2, 3)] #지나온 지점 저장
6) dic_ = "R"
7) stack = [(0, 1), (-1, 2), (-2, 3), (-1, 4)]
8) dic_ = "R"
9) stack = [(0, 1), (-1, 2), (-2, 3), (-1, 4), (1, 4)]
10) dic_ = "D"
11) stack = [(0, 1), (-1, 2), (-2, 3), (-1, 4), (1, 4), (2, 3)]
12) dic_ = "L"
위 그림과 같이 여기까지가 새로운 길을 걸은 캐릭터의 움직임이다. 초록색 점을 기준으로 캐릭터가 새로운 길을 지난 것인지 아닌 것인지를 판단하였다.
13) stack = [(0, 1), (-1, 2), (-2, 3), (-1, 4), (1, 4), (2, 3), (1, 2)]
14) dic_ = "L"
15) stack = [(0, 1), (-1, 2), (-2, 3), (-1, 4), (1, 4), (2, 3), (1, 2)]
16) dic_ = "U"
17) stack = [(0, 1), (-1, 2), (-2, 3), (-1, 4), (1, 4), (2, 3), (1, 2)]
18) return = 7
'Algorithm & Data Structure > Programmers' 카테고리의 다른 글
[Programmers]Python_야근 지수 (0) | 2020.12.23 |
---|---|
[Programmers]Python_불량 사용자 (0) | 2020.12.22 |
[Programmers]Python_멀리 뛰기 (0) | 2020.12.20 |
[Programmers]Python_거스름돈 (0) | 2020.12.19 |
[Programmers]Python_블록 이동하기 (0) | 2020.12.18 |