캐릭터의 좌표

2024. 8. 16. 18:00코딩테스트 입문

https://school.programmers.co.kr/learn/courses/30/lessons/120861

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


문제 설명
머쓱이는 RPG게임을 하고 있습니다. 게임에는 updownleftright 방향키가 있으며 각 키를 누르면 위, 아래, 왼쪽, 오른쪽으로 한 칸씩 이동합니다. 예를 들어 [0,0]에서 up을 누른다면 캐릭터의 좌표는 [0, 1], down을 누른다면 [0, -1], left를 누른다면 [-1, 0], right를 누른다면 [1, 0]입니다. 머쓱이가 입력한 방향키의 배열 keyinput와 맵의 크기 board이 매개변수로 주어집니다. 캐릭터는 항상 [0,0]에서 시작할 때 키 입력이 모두 끝난 뒤에 캐릭터의 좌표 [x, y]를 return하도록 solution 함수를 완성해주세요.

  • [0, 0]은 board의 정 중앙에 위치합니다. 예를 들어 board의 가로 크기가 9라면 캐릭터는 왼쪽으로 최대 [-4, 0]까지 오른쪽으로 최대 [4, 0]까지 이동할 수 있습니다.

제한사항

  • board은 [가로 크기, 세로 크기] 형태로 주어집니다.
  • board의 가로 크기와 세로 크기는 홀수입니다.
  • board의 크기를 벗어난 방향키 입력은 무시합니다.
  • 0 ≤ keyinput의 길이 ≤ 50
  • 1 ≤ board[0] ≤ 99
  • 1 ≤ board[1] ≤ 99
  • keyinput은 항상 updown, leftright만 주어집니다.

입출력 예

keyinput board result
["left", "right", "up", "right", "right"] [11, 11] [2, 1]
["down", "down", "down", "down", "down"] [7, 9] [0, -4]

입출력 예 설명
입출력 예 설명 #1

  • [0, 0]에서 왼쪽으로 한 칸 오른쪽으로 한 칸 위로 한 칸 오른쪽으로 두 칸 이동한 좌표는 [2, 1]입니다.

입출력 예 설명 #2

  • [0, 0]에서 아래로 다섯 칸 이동한 좌표는 [0, -5]이지만 맵의 세로 크기가 9이므로 아래로는 네 칸을 넘어서 이동할 수 없습니다. 따라서 [0, -4]를 return합니다.

이동을 끝마친 캐릭터의 좌표를 구하는 문제입니다.

이 문제의 특징은 시작점 (0, 0)이 왼쪽 상단이 아니라, board의 정중앙에 위치한다는 점입니다.

그래서 이동할 수 있는 한계점이 존재하고 있죠. 이 지점을 넘는 입력은 전부 무시해야 하는 게 중요합니다.

 

예제 1번의 board를 구현한다면 다음과 같습니다.

가장 끝부분만 표시해두긴 했는데, x가 -5나 5를 넘어가거나 y가 -5나 5를 넘어가는 입력에 대해서는 전부 무시해야 합니다.

다행히 board의 가로, 세로가 모두 홀수라는 조건이 있기 때문에, 한계점을 구하는 건 어렵지 않습니다.

 

한계점을 구한 이후에는 keyinput을 받아 탐색을 시작합니다.

현재 좌표를 nx, ny, 입력된 좌표가 dx, dy, 이동할 좌표가 tx, ty일 때, tx와 ty가 한계 범위 내에 있는지 확인하면 됩니다.

모든 입력에 대해서 탐색이 끝나면, 마지막으로 캐릭터의 좌표를 반환하면 끝입니다.

 

이 내용들을 만족하는 코드를 파이썬으로 작성해보겠습니다.

def solution(keyinput, board):
    # 캐릭터의 좌표
    answer = [0, 0]
    # x, y 최대 - 최소 좌표
    min_x, max_x = -(board[0] // 2), board[0] // 2
    min_y, max_y = -(board[1] // 2), board[1] // 2
    # 방향키 좌표 설정
    move = {"up": [0, 1], "down": [0, -1], "left": [-1, 0], "right": [1, 0]}
    
    # 방향키 입력을 탐색합니다.
    for key in keyinput:
        # 현재 좌표 nx, ny
        nx, ny = answer[0], answer[1]
        # 이동될 좌표 tx, ty
        dx, dy = move[key][0], move[key][1]
        tx, ty = nx + dx, ny + dy
        # 정상 좌표만 적용
        if min_x <= tx <= max_x and min_y <= ty <= max_y:
            answer[0], answer[1] = tx, ty
        
    return answer

 

이렇게 보니까 왠지 BFS 알고리즘이 생각나는 문제였습니다.

'코딩테스트 입문' 카테고리의 다른 글

다항식 더하기  (0) 2024.08.18
최댓값 만들기 (2)  (0) 2024.08.17
직사각형 넓이 구하기  (0) 2024.08.15
배열 원소의 길이  (0) 2024.08.14
컨트롤 제트  (0) 2024.08.13