팀원들과 페어프로그래밍 과정에서 풀어봤던 알고리즘 문제.
알고리즘은 풀 때마다 이걸 왜 생각 못 했을까 아쉬워하는데, 그 횟수를 줄이기 위해서라도 꾸준히 해야겠다.

캐릭터의 좌표
https://school.programmers.co.kr/learn/courses/30/lessons/120861

  • 머쓱이는 RPG게임을 하고 있습니다. 게임에는 up, down, left, right 방향키가 있으며 각 키를 누르면 위, 아래, 왼쪽, 오른쪽으로 한 칸씩 이동합니다. 예를 들어 [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은 항상 up, down, left, right만 주어집니다.

접근방식

  1. 주어진 keyinput에 들어있는 up, down, left, right를 판별하자
  2. 판별 된 값에 맞게 좌표를 이동시키자
  3. 좌표의 한계를 board로 지정하자

문제풀이

  • 주어진 기본 구성
def solution(keyinput, board):
    answer = []
    return answer

def solution(keyinput, board):
    [x,y] = [0,0]
    for i in keyinput:
        if i == "up":
            [x,y] = [x,y+1]
        elif i == "down":
            [x,y] = [x,y-1]
        elif i == "left":
            [x,y] = [x-1,y]
        elif i == "right":
            [x,y] = [x+1,y]

시작지점[0,0]을 [x,y]로 지정.

for문을 이용해서 keyinput 값을 하나하나 가져오고 나서 if문을 이용해 좌표를 이동시켰다.

문제점

문제는 이 다음이었는데,
첫 번째, 좌표의 한계를 어떻게 구할 것인가..?

두 번째, 지정한 한계를 어떻게 제한시킬 것인가..?

좌표의 한계를 지정하는 건 board의 첫 번째 값과 두 번째 값을 각 각 반으로 나누면 된다. (나는 삽질하고 있었고 팀원분의 도움으로 깨달았다..)

중앙을 포함한 가로와 세로의 길이는 반드시 홀수가 나오기 때문에

ex)
        o
        o
        o
o o o o o o o o o
        o
        o
        o

//를 사용해서 정수 몫만을 구했다.

X = int(board[0] // 2)
Y = int(board[1] // 2)

이렇게 지정된 한계를 어떻게 좌표에 적용시킬 것인가 하는 문제는 max를 사용해야 하지만 적용방법이 막연했다.

팀원의 도움+이전에 사용했던 기억을 떠올려서

    for i in keyinput:
        if i == "up":
            [x,y] = [x,min(y+1,Y)]
        elif i == "down":
            [x,y] = [x,max(y-1,-Y)]
        elif i == "left":
            [x,y] = [max(x-1,-X),y]
        elif i == "right":
            [x,y] = [min(x+1,X),y]

for문을 이렇게 바꿨다.
음수로 가면 min값을 써야한다는 걸 깜빡하고 삽질을 한 번 더 했었다 ㅎㅎ

문제해결

그래서 정답은 다음과 같다.

def solution(keyinput, board):
    [x,y] = [0,0]
    X = int(board[0] // 2)
    Y = int(board[1] // 2)
    for i in keyinput:
        if i == "up":
            [x,y] = [x,min(y+1,Y)]
        elif i == "down":
            [x,y] = [x,max(y-1,-Y)]
        elif i == "left":
            [x,y] = [max(x-1,-X),y]
        elif i == "right":
            [x,y] = [min(x+1,X),y]
    answer = [x,y]
    return answer

항상 느끼기만 하는 것..

복습.. 복습이 정말 중요하다. 복습은 반복이다. 반복은 배신하지 않는다! 가보자고!!

profile
가보자고

0개의 댓글

관련 채용 정보