-
[Programmers] 방문 길이[+] 알고리즘 [+] 2020. 3. 12. 19:50
[문제 설명]
게임 캐릭터를 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 함수를 완성해 주세요.
[풀이 과정]
구현은 어렵지 않다. 그저 값에 따라 순차적으로 좌표값을 바꾸며 값을 기록하면 된다.
허나.. 문제는 처음 걸었던 길의 수를 요구한다. 처음 (1,2) -> (2,2) 를 지났다면 후에 (1,2) -> (2,2)는 셈하지 말아야 한다.
'ㅇㅎ! 별거없네!' 하고 구현하였다. 역시 구현은 어렵지 않았다. 집합 자료형을 이용하여 중복을 제거하면 그만이다..
허나.. 역시 정답이아니다... 어쩐지 너무 쉽더라... 문제가 뭘까...
문제는 처음 걸어본 길의 길이를 요구한다.
처음 (1,2) -> (2,2) 를 지났다면 후에 (1,2) -> (2,2)를 지났다면 후에 걸었던 길은 처음 걸어본 길이 아니다.
그리고 (2,2) -> (1,2) 를 지난다면 이또한 처음 걸어본 길이 아니지 않은가?
예제에서는 '(2,2) -> (1,2) 또한 처음 걸어본 길이 아닙니다!'라는 힌트를 주지 않았다.
'(1,2) -> (2,2)만 제거하면 되는거 아니야'라는 생각에 국한되게끔 한다.
문제 해결의 키는 디버깅 능력인듯하다. 머릿속으로 스스로 경우의 수를 추가해가며 '!!! 이또한 처음 걸어본 길이 아니구나!' 하고 생각할 수 있는지를 묻는 듯 하다.
def solution(dirs): player = [0,0] answer = [[0,0]] answers = [] for i in range(0, len(dirs)): if dirs[i] == 'U': if player[1] < 5: player[1] += 1 elif dirs[i] == 'L': if player[0] > -5: player[0] -= 1 elif dirs[i] == 'D': if player[1] > -5: player[1] -= 1 elif dirs[i] == 'R': if player[0] < 5: player[0] += 1 answer.append(player[:]) for i in range(0, len(answer)-1): if answer[i] != answer[i+1]: if answer[i]+answer[i+1] not in answers and answer[i+1]+answer[i] not in answers: answers.append(answer[i]+answer[i+1]) return len(set(map(str,answers)))
'[+] 알고리즘 [+]' 카테고리의 다른 글
[Programmers] 멀쩡한 사각형 (0) 2020.03.20 [Programmers] 종이접기 (0) 2020.03.18 [Programmers] 정수 삼각형 (0) 2020.03.10 [Programmers] 최고의 집합 (0) 2020.03.10 [Programmers] 완주하지 못한 선수 (0) 2020.03.09 -