본문 바로가기

Python(알고리즘,문제풀이)/프로그래머스(입문100제)

코딩테스트입문 / 캐릭터의 좌표

728x90

📚문제

출처 : 프로그래머스 / 캐릭터의 좌표(https://school.programmers.co.kr/learn/courses/30/lessons/120861)

 

📝풀이

def solution(keyinput, board):
    
    start_x = 0
    start_y = 0

    for i in keyinput:
        if i == 'left':
            start_x -= 1
        elif i == 'right':
            start_x += 1
        elif i == 'up':
            start_y += 1
        else:
            start_y -= 1

    result = [start_x,start_y]
    
    # x값이 보드보다 클 때
    if abs(result[0]) > (board[0]-1)/2 and result[0] < 0:
        return [-int((board[0]-1)/2), result[1]]
    elif abs(result[0]) > (board[0]-1)/2 and result[0] > 0:
        return [int((board[0]-1)/2), result[1]]
    
    # y값이 보드보다 클 때
    elif abs(result[1]) > (board[1]-1)/2 and result[1] < 0:
        return [result[0], -int((board[1]-1)/2)]
    elif abs(result[1]) > (board[1]-1)/2 and result[1] > 0:
        return [result[0], int((board[1]-1)/2)]
    
    # x,y값이 모두 보드보다 클 때
    elif abs(result[1]) > (board[1]-1)/2 and abs(result[0]) > (board[0]-1)/2:
        if result[0] > 0 and result[1] < 0:
            return [int((board[0]-1)/2),-int((board[1]-1)/2)]
        elif result[0] < 0 and result[1] > 0:
            return [-int((board[0]-1)/2),int((board[1]-1)/2)]
        elif result[0] > 0 and result[1] > 0:
            return [int((board[0]-1)/2),int((board[1]-1)/2)]
        else:
            return [-int((board[0]-1)/2),-int((board[1]-1)/2)]
    
    # x,y값이 모두 보드보다 작을 때
    else:
        return result

심혈을 기울여 풀었는데 계속 틀린다...

테스트는 통과했는데

제출하고 3군데에서 계속 틀렸다

 

계속 생각해보다가 x,y값이 모두 보드보다 클 경우를 고려해주지 않은것 같아서

추가해주었다

 

그런데도 동일한 테스트 케이스에서 또 실패가 떴다

코드가 길고 직관적이진 않지만 이론적으로는 맞다고 생각하는데 

어디서 틀린지를 잘 모르겠다 🤔

 

 

+ 구글링하여 다른 코드를 참고해보면

다 움직이고 나서 확인하는게 아니라

한번 움직일 때 보드의 x,y범위를 벗어나는지 확인해주는 것 같다

def solution(keyinput, board):
    
    start_x = 0
    start_y = 0
    
    x_lim = board[0]//2
    y_lim = board[1]//2
    
    for i in keyinput:
        if i=='left':
            if start_x >= xlim:
                start_x = xlim
            else:
                start_x += 1
        elif i=='left':
            if start_x <= -xlim:
                start_x = -xlim
            else:
                start_x -= 1
        elif i=='up':
            if start_y >= ylim:
                start_y = ylim
            else:
                start_y += 1
        else:
            if start_y <= -ylim:
                start_y = -ylim
            else:
                start_y -= 1
        return [start_x,start_y]
# ------------------------------------
# 위 코드 조금 더 간결하게 
def solution(keyinput, board):
    
    start_x = 0
    start_y = 0

    xlim = board[0]//2
    ylim = board[1]//2
    
    for i in keyinput:
        # x좌표
        if i == 'left' and -xlim <= start_x -1:
            start_x -1
        elif i == 'right' and start_x + 1 <= xlim:
            start_x +1
        # y좌표
        elif i == 'down' and -ylim <= start_y -1:
            start_y -1
        elif i == 'up' and start_y +1 <= ylim:
            start_y +1
    return [start_x, start_y]

이런 문제는 한 번 내가풀던 방식이랑 달라지면 머릿속에서 다른 해법이 잘 떠오르지 않는 것 같다

그러니 많이 풀어보고 많은 방법과 경험을 머릿속에 넣어놓자..

 

 

+ 다른 분 dictionary 활용 코드

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]

1. 상하좌우를 move라는 dictionary에 배열

2. keyinput에서 for문을 돌며 해당하는 상하좌우 좌표를 move에서 찾아서 dx,dy에 할당

3. if 문에서 x+dx가 x_lim보다 커지거나 y+dy가 y_lim보다 커질 경우에는

   continue를 사용해 다음 반복으로 넘어가기 

 

이 코드에서 dictionary의 사용도 사용이지만

if문에서도 좋은 방법을 발견했다

굳이 xlim, -xlim 처럼 보드의 왼쪽 오른쪽 경계를 구분짓는게 아니라

절대값을 써서 그냥 보드의 한계점보다 넘어가면

continue를 사용하여 값을 추가하지 않고 그대로 두는 방법이 인상적이었다

 

나도 절대값을 사용하긴했지만

이동이 다 끝나고 나서 최종좌표에 절대값을 씌워주었다

그렇기 때문에 그 값이 음수인지 양수인지도 확인 한 다음,

양수면 양수 방향의 한계값을 설정하고

음수면 음수 방향의 한계값을 설정해주어서 

번거롭고 코드가 복잡해진것 같다

 

728x90