
게임 캐릭터를 4가지 명령어를 통해 움직이려 합니다.
명령어는 다음과 같습니다.
캐릭터는 좌표평면의 (0, 0) 위치에서 시작합니다.
좌표평면의 경계는 왼쪽 위(-5, 5), 왼쪽 아래(-5, -5), 오른쪽 위(5, 5), 오른쪽 아래(5, -5)로 이루어져 있습니다.

예를 들어, "ULURRDLLU"로 명령했다면



이때, 우리는 게임 캐릭터가 지나간 길 중 캐릭터가 처음 걸어본 길의 길이를 구하려고 합니다.
예를 들어 위의 예시에서 게임 캐릭터가 움직인 길이는 9이지만, 캐릭터가 처음 걸어본 길의 길이는 7이 됩니다. (8, 9번 명령어에서 움직인 길은 2, 3번 명령어에서 이미 거쳐 간 길입니다.)
단, 좌표평면의 경계를 넘어가는 명령어는 무시합니다.
예를 들어, "LULLLLLLU"로 명령했다면


이때 캐릭터가 처음 걸어본 길의 길이는 7이 됩니다.
명령어가 매개변수 dirs로 주어질 때, 게임 캐릭터가 처음 걸어본 길의 길이를 구하여 return하는 solution 함수를 완성해 주세요.
dirs는 string형으로 주어지며, 'U', 'D', 'R', 'L' 이외에 문자는 주어지지 않습니다.dirs의 길이는 500 이하의 자연수입니다.| dirs | answer |
|---|---|
| "ULURRDLLU" | 7 |
| "LULLLLLLU" | 7 |
추가적으로 "LR"이라고 했을 때
처음 L에서 (0, 0), (-1, 0)으로 갔을 때 같이 (-1, 0), (0, 0)을 저장하면 R에서 가는 것을 중복 제거로 없앨 수 있다.
마지막에 결과 반환할 때 /2로 중복 제거로 최종적인 처음 가는 길을 구할 수 있다.
is_movable(x, y)이거나 이거나 이거나 이면 움직일 수 없으므로 False 반환
저 범위가 아니라면 움직일 수 있으므로 True 반환
def is_movable(x, y):
if x > 5 or x < -5 or y > 5 or y < -5:
return False
return True
move(dir, x, y)문제의 제한사항에 dirs에는 'U', 'D', 'R', 'L'이외에는 주어지지 않으므로 R의 경우 else로 처리하였다.
def move(dir, x, y):
if dir == "U":
return x, y + 1
elif dir == "D":
return x, y - 1
elif dir == "L":
return x - 1, y
else:
return x + 1, y
def is_movable(x, y):
if x < -5 or x > 5 or y < -5 or y > 5:
return False
return True
def move(dir, x, y):
if dir == "U":
return x, y + 1
elif dir == "D":
return x, y - 1
elif dir == "L":
return x - 1, y
else:
return x + 1, y
def solution(dirs):
x, y = 0, 0
answer = set()
for dir in dirs:
nx, ny = move(dir, x, y)
if not is_movable(nx, ny):
continue
answer.add((x, y, nx, ny))
answer.add((nx, ny, x, y))
x, y = nx, ny
return len(answer) // 2
이번 문제는 아예 감도 안잡혀서 어떻게 하는지 책을 통해 확인하였다.
문제에 처음 걸어본 길의 길이를 구한다고 하였기 때문에 중복을 제거하는 문제이다.
중복을 포함하지 않는다는 문장이 나오면 set() 함수를 생각해보면 좋다는 것을 알게 되었다.
또한, 코드가 긴 경우에는 기능별로 함수를 구현하는 게 좋다는 것을 알게 되었다.
처음 걸어본 길이라는 것이 (0, 0) (0, 1)과 (0, 1) (0, 0)이 같다는 것을 해결하는 과정이 인상 깊었다.