방문 길이 Pgs#49994
방문 길이 PGs#49994
Python 코드 보기
def move(now, _dir, visited):
x = now[0]
y = now[1]
if _dir == "U":
if now[1] != 10:
now[1] += 1
if visited[x][y][x][y+1] != 1 and visited[x][y+1][x][y] != 1:
visited[x][y][x][y+1] = 1
return 1
elif _dir == "D":
if now[1] != 0:
now[1] -= 1
if visited[x][y][x][y-1] != 1 and visited[x][y-1][x][y] != 1:
visited[x][y][x][y-1] = 1
return 1
elif _dir == "R":
if now[0] != 10:
now[0] += 1
if visited[x][y][x+1][y] != 1 and visited[x+1][y][x][y] != 1:
visited[x][y][x+1][y] = 1
return 1
elif _dir == "L":
if now[0] != 0:
now[0] -= 1
if visited[x][y][x-1][y] != 1 and visited[x-1][y][x][y] != 1:
visited[x][y][x-1][y] = 1
return 1
return 0
def solution(dirs):
answer = 0
now = [5,5]
visited = [[[[0]*11 for i in range(11)]*11 for j in range(11)]*11 for k in range(11)]
# 4차원. [전x][전y][후x][후y]
for i in range(0,len(dirs)):
answer += move(now, dirs[i], visited)
return answer
게임 캐릭터를 4가지 명령어를 통해 움직이려 합니다. 명령어는 다음과 같습니다.
- U: 위쪽으로 한 칸 가기
- D: 아래쪽으로 한 칸 가기
- R: 오른쪽으로 한 칸 가기
- L: 왼쪽으로 한 칸 가기
캐릭터는 좌표평면의 (0, 0) 위치에서 시작합니다. 좌표평면의 경계는 왼쪽 위(-5, 5), 왼쪽 아래(-5, -5), 오른쪽 위(5, 5), 오른쪽 아래(5, -5)로 이루어져 있습니다.
게임 캐릭터가 지나간 길 중 캐릭터가 처음 걸어본 길의 길이를 구하려고 합니다.
단, 좌표평면의 경계를 넘어가는 명령어는 무시합니다.
☝ 입력 형식
명령어가 매개변수 dirs
로 주어집니다.
제한사항
dirs
는 string형으로 주어지며, ‘U’, ‘D’, ‘R’, ‘L’ 이외에 문자는 주어지지 않습니다.dirs
의 길이는 500 이하의 자연수입니다.
🤞 출력 형식
- 게임 캐릭터가 처음 걸어본 길의 길이를 구하여 return 하는 solution 함수를 완성해 주세요.
🤟 구현 과정
1. 방향에 따른 이동/기저사례 구현
move()
함수 구현을 최우선 과제로 삼았다.
음수 index는 존재하지 않으므로, 좌표 값에 각각 5씩 더하여 대응시켜 기저사례를 구현하였다.
기저사례가 아닌 경우 해당 방향으로 이동하고, 처음 가는 길이면 1을 return, 이외의 경우는 0을 return 하도록 구현하였다.
2. 처음 가는 길 판별
4차원 배열 visited
를 확인하는 방식으로 구현하였다.
A->B = B->A인 양 방향 그래프이므로, 길을 지나는 두 가지 경우를 모두 비교해주어야한다.
🍀 Pain Points
1. 지나간 길 표시 방법
지나간 길을 어떤 방식으로 표시할지에 대해 고민을 많이 하였다.
길을 가로와 세로로 나누어 2개의 2차원 배열을 이용할까 생각하였지만, 결국 조금 더 직관적으로 코딩하기 위해 4차원 배열을 선언하여, 출발좌표-도착좌표로 이루어진 배열을 통해 지나간 길을 확인하였다.
2. 전역 변수를 가능한 사용하지 않기
처음에는 answer을 전역 변수로 정의하고 코딩을 진행하였다.
조건을 만족할 때 마다 전역 변수 answer을 호출하고, 더하면 끝이니 편했다!
하지만 함수형 프로그래밍의 원칙에서 모든 함수는 순수 함수로 구성하여야 한다는 내용을 떠올려, 기왕 코딩할거 좀 더 좋게 해보자고 생각하여 가능한 입력 값 외의 값을 건드리지 않도록 수정하였다.
하는 버릇이라도 익혀두면 도움이 되겠지..ㅎㅎ
댓글남기기