페어코딩7: 캐릭터 좌표
What I learned:
Python에서는 항상 버림 나눗셈(floor division: 바닥 나눗셈)을 한다.
예를들어 -5를 2로 나눌 때
Python에서는 항상 버림 나눗셈으로 계산합니다.
버림 나눗셈은 몫이 소수점 이하를 버리고 정수 부분만 취하는 것을 말합니다.
-5 = (-3) * 2 + 1
-5를 2로 나누면, 나눗셈의 결과는 -2.5입니다. 이 때, 소수점 이하를 버리고 정수 부분만을 구하면 -3이 됩니다.
따라서 몫은 -3이 되고, 나머지는 1이 됩니다.
즉, 파이썬은 몫을 계산하는 방식이 다르기 때문에 -5//2의 결과가 다르게 나오는 것 입니다.
이를 이해하기 위해서는 버림 나눗셈과 올림 나눗셈의 개념을 이해해야 합니다.
따라서, 파이썬 인터프린터의 동작은 언어 명세서에 따라 결정되므로, 인터프리터가 어떤 언어로 만들어졌든 결과는 동일
https://docs.python.org/3/reference/expressions.html#binary-arithmetic-operations
6. Expressions
This chapter explains the meaning of the elements of expressions in Python. Syntax Notes: In this and the following chapters, extended BNF notation will be used to describe syntax, not lexical anal...
docs.python.org
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 가로 (-49,0)~(+49,0)
1 ≤ board[1] ≤ 99 세로 (0,-49)~(0,+49)
keyinput은 항상 up, down, left, right만 주어집니다.
"""
# 이준영님 풀이
def solution(keyinput, board):
current_point = [0, 0]
for key in keyinput:
if key == "left":
if current_point[0] != -abs(board[0]//2):
current_point[0] += -1
elif key == "right":
if current_point[0] != board[0]//2:
current_point[0] += 1
elif key == "down":
if current_point[1] != -abs(board[1]//2):
current_point[1] += -1
elif key == "up":
if current_point[1] != board[1]//2:
current_point[1] += 1
return current_point
""" 정재준님 풀이
def solution(keyinput, board):
answer = []
result = {'x':0,'y':0}
for i in keyinput:
if i == "left":
if result['x'] > ((-(board[0]//2))):
result['x'] += -1
elif i == "right":
if result['x'] < ((board[0]//2)+1):
result['x'] += 1
elif i == "up":
if result['y'] <= ((board[1]//2)+1):
result['y'] += 1
elif i == "down":
if result['y'] > ((-(board[1]//2))):
result['y'] += -1
answer.append(result["x"])
answer.append(result["y"])
return answer
"""
''' 다른 사람 최고의 풀이
def solution(keyinput, board):
x_lim,y_lim = board[0]//2,board[1]//2
move = {'left':(-1,0),'right':(1,0),'up':(0,1),'down':(0,-1)}
x,y = 0,0
for k in keyinput:
dx,dy = move[k]
if abs(x+dx)>x_lim or abs(y+dy)>y_lim:
continue
else:
x,y = x+dx,y+dy
return [x,y]
딕셔너리로 맛깔나게 만들였다.
'''
#박소진님의 제안
#while문 또는 for문으로 돌려서
#아래 조건은 if문으로 조건을 나눠줌
#left = [0] -1 =< border[0]//2
#right = [0] +1 < border[0]//2
#up = [1]+1 < border[1]//2
#down = [1]-1 < border[1]//2
#처음에 캐릭터가 있는 위치의 변수를 하나 만들어주기
#if key == left:
#if currnet_point[0] >= -(border[0]//2)
#current_point[0] -1 #11 -5,+5
print(solution(["left", "right", "up", "right", "right"],[11, 11])) #[2,1]
print(solution(["down", "down", "down", "down", "down"],[7, 9])) #[0,-4]