algorithm

페어코딩7: 캐릭터 좌표

베스트오버 2023. 5. 4.

목차

    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]

    댓글