📚문제
📝풀이
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를 사용하여 값을 추가하지 않고 그대로 두는 방법이 인상적이었다
나도 절대값을 사용하긴했지만
이동이 다 끝나고 나서 최종좌표에 절대값을 씌워주었다
그렇기 때문에 그 값이 음수인지 양수인지도 확인 한 다음,
양수면 양수 방향의 한계값을 설정하고
음수면 음수 방향의 한계값을 설정해주어서
번거롭고 코드가 복잡해진것 같다
'Python(알고리즘,문제풀이) > 프로그래머스(입문100제)' 카테고리의 다른 글
코딩테스트입문 / 숨어있는 숫자의 덧셈(2)(isalpha()) (0) | 2023.08.03 |
---|---|
코딩테스트입문 / 다항식 더하기 (0) | 2023.08.02 |
코딩테스트입문 / 직사각형 넓이 구하기 (0) | 2023.08.02 |
코딩테스트입문 / 머쓱이보다 키 큰 사람(filter 메서드) (0) | 2023.08.01 |
코딩테스트입문 / 중복된 숫자 개수(collections 모듈) (0) | 2023.08.01 |