프로그래머스 | 캐릭터의 좌표 [파이썬 python]

2023. 3. 13. 14:13·Algorithm/프로그래머스
 

프로그래머스

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

programmers.co.kr

 

코드

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

up, down, right, left에 따라 이동한 좌표를 구하는 문제이다.

board의 크기가 정해져 있기 때문에 계속해서 left를 하거나 right를 해도 x 또는 y범위를 넘어갈 수 없다는 조건이 있다.

이 조건을 충족시키는 것이 핵심 포인트라고 생각된다.

키가 입력될 때마다 x, y가 board의 범위를 벗어나는지 먼저 확인해 준 뒤 ±1을 할 수 있도록 조건문을 작성하였다.

 

다른 사람의 코드

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]

코드가 너무 길어지는 것 같아 다른 사람들의 코드를 살펴보았다.

딕셔너리를 사용하여 각 keyinput 별로 이동 좌표를 먼저 정의한다.

그런 다음 x_lim, y_lim 범위를 확인하여 범위를 벗어나면 다음 keyinput을 진행하고, 그렇지 않으면 이동시킨다.

딕셔너리를 이용하니 훨씬 간결해진 코드를 보고 딕셔너리와 친숙해져야겠다고 생각했다..

 

처음 시도한 코드

def solution(keyinput, board):
    up = keyinput.count('up')
    down = keyinput.count('down')
    left = keyinput.count('left')
    right = keyinput.count('right')
    
    x = right - left
    y = up - down
    
    if x > board[0]//2 :
        x = board[0]//2
    elif x < -(board[0]//2):
        x = -(board[0]//2)
    
    if y > board[1]//2:
        y = board[1]//2
    elif y < -(board[1]//2):
        y = -(board[1]//2)
    
    return [x, y]

처음 시도한 코드이다.

이 코드에서도 board의 범위는 지켜주었지만 board=[5, 5] 일 때, left, left, left, right, right, right, right을 하게 되면 [2, 0]이 나와야 하지만 이 코드를 실행시켜 보면 실제로는 [1, 0]이 나오게 된다.

끝까지 이동한 뒤 반대로 이동하면 좌표가 달라지는 것을 미처 생각하지 못했다.

그래서 이 코드처럼 이동 횟수를 통한 좌표를 구해 그 값이 board의 범위를 넘어가는지 체크하는 것이 아닌, 각 keyinput 별로 조건문을 작성해 구하고자 하는 답을 구할 수 있게 해 주었다.

 

프로그래머스 문제를 하나씩 풀어보면서 처음으로 긴 코드를 보게 된 것 같은데, 앞으로 1순위로 문제를 푸는 것, 2순위로 간결하게 코드를 작성하는 것 나름대로 기준을 세워 진행해야겠다.

반응형
저작자표시 (새창열림)
'Algorithm/프로그래머스' 카테고리의 다른 글
  • 프로그래머스 | 숨어있는 숫자의 덧셈(2) [파이썬 python]
  • 프로그래머스 | 다항식 더하기 [파이썬 python]
  • 프로그래머스 | 직사각형 넓이 구하기 [파이썬 python]
  • 프로그래머스 | 잘라서 배열로 저장하기 [파이썬 python]
dduniverse
dduniverse
  • dduniverse
    dduniverse
    dduniverse
  • 전체
    오늘
    어제
    • 분류 전체보기 (242)
      • Algorithm (123)
        • 알고리즘 이론 (8)
        • 백준 (19)
        • 프로그래머스 (83)
        • 구름 알고리즘 먼데이 챌린지 (13)
      • 빅데이터분석기사 (10)
        • 통계 (4)
        • 실기 (6)
      • KT에이블스쿨 (26)
      • FrontEnd (11)
        • React (5)
        • 기타 (6)
      • BackEnd (18)
        • Django (15)
        • Spring (3)
      • DS & ML (11)
        • Machine Learning (9)
        • Kaggle (2)
      • TIL (43)
        • python (22)
        • javascript (3)
        • 오류해결 (10)
        • 기타 (7)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 관리
    • 글쓰기
  • 링크

  • 인기 글

  • hELLO· Designed By정상우.v4.10.0
dduniverse
프로그래머스 | 캐릭터의 좌표 [파이썬 python]
상단으로

티스토리툴바