팀원들과 페어프로그래밍 과정에서 풀어봤던 알고리즘 문제.
알고리즘은 풀 때마다 이걸 왜 생각 못 했을까 아쉬워하는데, 그 횟수를 줄이기 위해서라도 꾸준히 해야겠다.
캐릭터의 좌표
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만 주어집니다.
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