프로그래머스 알고리즘 문제

프로그래머스 Python 알고리즘 문제 캐릭터의 좌표

5kiran 2022. 12. 14.
반응형

프로그래머스 알고리즘 문제 캐릭터의 좌표

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

 

프로그래머스

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

programmers.co.kr

 

문제 설명

머쓱이는 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만 주어집니다.

입출력 예keyinputboardresult
["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합니다.

 

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

나는 처음에 이렇게 문제를 풀었다...
이제 문제가 뭐냐....
만약 board가 [10,10]이라면 위로 5 아래로 -5까지 밖에 이동할 수 없어야 한다.
keyinput으로 up이 10번 들어오면
지금 코드에서는 -10이 되어버린다.
이걸 어떻게 해결해야 할까 .. 고민 고민하다가 밑에서 if 문으로 다시 걸러주면 되겠다는 생각을 했다..

def solution(keyinput, board):
    answer = []
    x = 0
    y = 0
    board_x = board[0] // 2
    board_y = board[1] // 2
    for i in keyinput:
        if i == 'left':
            x -= 1
        elif i == 'right':
            x += 1
        elif i == 'up':
            y += 1
        elif i == 'down':
            y -= 1
    if board_x < x :
        x = board_x
    elif -board_x > x:
        x = -board_x
    elif board_y < y :
        y = board_y
    elif -board_y > y :
        y = -board_y
    answer.append(x)
    answer.append(y)         
    return answer

 

코드가 이렇게 길어졌는데.. 이게 맞나 싶다 ...
맞았나 싶었는데 틀렸다??...
그래서 다시 곰곰이 생각해 보다가 for 문을 돌때 처음부터 조건을 and로 걸어주면 되는 거 아닌가라고 생각이 들었다

 

최종적으로 합격 통보를 받았다 ...!!!

감격 ㅠㅠ

최종적으로 작성한 코드

def solution(keyinput, board):
    answer = []
    x = 0
    y = 0
    board_x = board[0] // 2
    board_y = board[1] // 2
    for i in keyinput:
        if i == 'left' and -board_x < x:
            x -= 1
        elif i == 'right' and board_x > x:
            x += 1
        elif i == 'up' and board_y > y:
            y += 1
        elif i == 'down' and -board_y < y:
            y -= 1
            
    answer.append(x)
    answer.append(y)         
    return answer

 

 

1. keyinput으로 받은 배열을 하나씩 조건문을 통해 검사한다.

2. i == 'left'이고 -board_x보다 x가 크면 x에 -1을 해준다 만약 -board_x가 x보다 크다면 처음에 board로 넘겨받았던 필드를 벗어나는 게 된다!!

3. 즉 -board_x 가 -3이고 x가 -3인 상태라면 -board_x < x 가 성립되지 않기 때문에 조건문을 실행하지 않는다!!

반응형

댓글