문제 설명
게임 캐릭터를 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):
dx,dy = [-1,0,1,0], [0,-1,0,1]
move_type = {'U':0,'L':1,'D':2,'R':3}
answer = 0
visited_add = set()
x,y, = 0,0
for dir in dirs:
i = move_type[dir]
nx = x + dx[i]
ny = y + dy[i]
if nx > 5 or nx < -5 or ny >5 or ny < -5 :
continue
if (x,y,nx,ny) not in visited_add:
visited_add.add((nx,ny,x,y))
visited_add.add((x,y,nx,ny))
answer += 1
x,y = nx,ny
return answer
문제 풀이
4일 만에 풀어보는 알고리즘은 정말 내 머리를 쥐어짜는 듯하다..
뜻하지 않게 지원했던 기업 두군데에서 서류 합격을 하고 면접 준비를 하느라 다른 걸 공부할 여유가 아예 안 났다. 저번 주에 두 군데 모두 면접을 보고 한 군데는 임원면접을 앞두고 있지만.. 인적성검사와 직무검사에서 갈려버린 나의 멘털 덕분에 다시 열심히 공부를 해야겠다는 마음이 들어서 알고리즘을 다시 폈다.
이 문제는 그래프에서 이동하는 만큼의 중복되지 않은 길이를 구하는 문제다. DFS/BFS로 접근해서 풀어보려고 하다보니 계속해서 꼬여서 해결하지 못했다. 그래서 다른 분들의 풀이를 보니 Set을 이용한 양방향 간선 형태로 만들어 푸는 것을 볼 수 있었다.
기존 좌표와 다음 좌표가 Set에 포함되지 않았다면 양쪽 간선을 연결하고 기존함수를 다음 좌표로 바꿔줘 연산을 계속한다.
다음에 이런 문제가 나온다면 응용해서 풀어볼 수 있겠다.
'Algorithm' 카테고리의 다른 글
[BOJ/백준] 11000번 강의실 배정 (0) | 2021.05.10 |
---|---|
[BOJ/백준] 11286번 절댓값 힙 (0) | 2021.05.10 |
[프로그래머스] 게임 맵 최단거리 (0) | 2021.05.07 |
[프로그래머스] 2019 KAKAO BLIND RECRUITMENT 오픈채팅방 (0) | 2021.05.07 |
[BOJ/백준] 14503번 로봇 청소기 (0) | 2021.04.30 |