[프로그래머스] LV.0 캐릭터의 좌표

seho·2023년 2월 20일
0

codetest

목록 보기
7/17
post-thumbnail

문제

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

입출력 예시

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

풀이

  1. 게임에서 캐릭터가 움직이는 좌표를 구하는 문제로 x,y 2개의 축을 이용한다고 생각하면 된다. 여기서 가장 중요한 점은ㅍ x,y 축 최대 값에서 추가적으로 이동할 때는 값이 변하지 않는 점이 있다.
  2. 먼저 x,y 축의 최대 값을 구해주고 각 키보드가 눌릴 때 축의 변화를 if문을 통해서 적용시켜준다.

풀이 1

def solution(keyinput, board):
    answer = [0,0]
    max_ud = (board[1]-1)//2
    max_lr = (board[0]-1)/2
    
    for key in keyinput:
        
        if key == 'up':
            if  max_ud > answer[1] :
                answer[1]+=1        
        elif key == 'down':
            if  -max_ud < answer[1]:
                answer[1]-=1
        
        if key == 'right':
            if  max_lr > answer[0]:
                answer[0]+=1
        elif key == 'left':
            if -max_lr < answer[0]:
                answer[0]-=1

    return answer
    
  • 먼저 축의 시작 값을 [0,0]으로 초기화시켜주고 시작한다.
  • max_ud는 y축의 최대값으로 입력된 board 배열의 [1] 값에서 중앙값인 1을 빼주고 2를 나누어 최대로 움직일 수 있는 값을 정의해준다. max_lr 또한 x축의 최대값으로 같은 방법으로 정의해준다.
  • for문으로 keyinput의 모든 값을 빼내어 if문으로 필터링하여 축의 이동값을 초기화된 answer 배열에 입력해준다.
  • 첫 번째 if/elif문에는 y축의 이동 값으로 keyinput 값이 'up' 혹은 'down'일 때 적용되는데 이 때 'up'일 때는 (+)값의 최대치보다 작을 때 까지 축의 값을 더해주도록 이중 if문을 사용해주도록 한다. 'down'일 때는 (-)값의 최소치(절대값의 최대치)보다 클 때 까지 축의 값을 빼주도록 한다.
  • 두 번째 if/elif 문은 x축의 이동 값으로 첫 번째와 같은 방법으로 처리해준다.

오답노트

  • 이중 if문을 사용하는 것은 알고 있었지만 최대값 처리하는 방법을 틀렸었다.
  • 처음에는 abs()함수를 사용해 절대값으로 최대값을 처리해서 오답이 되었는데 (+) (-)의 조건을 따로 나누어서 해결하였다.

오답 내용

def solution(keyinput, board):
    answer = [0,0]
    max_ud = (board[1]-1)//2
    max_lr = (board[0]-1)/2
    
    for key in keyinput:
        if abs(answer[1]) < max_ud: # 절대값 설정으로 오류 발생
            if key == 'up':
                answer[1]+=1
            elif key == 'down':
                answer[1]-=1
                
        if abs(answer[0]) < max_lr:            
            if key == 'right':
                print('r')
                answer[0]+=1
            elif key == 'left':
                print('l')
                answer[0]-=1
    return answer
profile
develop my'self and sw

0개의 댓글