<로직 고민>
- 일단 잘은 모르겠으나..뭔가 딕셔너리를 활용하고 싶단 생각이 든다
def solution(keyinput, board):
answer = [0,0]
keys = {
"up" : [0,1],
"down" : [0,-1],
"left" : [-1,0],
"right" : [1,0]
}
for key in keyinput:
answer.append(keys[key])
return answer
print(solution(["left", "right", "up", "right", "right"],[11, 11]))
# [0, 0, [-1, 0], [1, 0], [0, 1], [1, 0], [1, 0]]
- 일단 어떻게 나오는지 찍어보려고 실행해봤다
- 흠 뒤에 이어 붙는 게 아니라 0번째 인덱스의 값끼리, 1번째 인덱스의 값끼리 더해져야 하는데 말이지..
answer = answer[0] + keys[key]
# TypeError: unsupported operand type(s) for +: 'int' and 'list'
- 아 딕셔너리의 value가 리스트니까 인덱스까지 넣어줬어야 했군
answer = answer[0] + keys[key][0]
# TypeError: 'int' object is not subscriptable
- 아닌데..흠..
answer[0] = answer[0] + keys[key][0]
# [2, 0]
- 값이 들어가는 변수에도 인덱스를 정해줬어야 했다!!!
- 그렇다면 이제 1번째 값도 덧셈을 해줘야겠군
answer[1] = answer[1] + keys[key][1]
- 이걸 추가해줬더니 원하는 결과값 [2,1]이 나왔다
- 근데 board 제한을 안 둬서 아마 2번째 예시는 안 될 거다
def solution(keyinput, board):
answer = [0,0]
keys = {
"up" : [0,1],
"down" : [0,-1],
"left" : [-1,0],
"right" : [1,0]
}
for key in keyinput:
answer[0] = answer[0] + keys[key][0]
answer[1] = answer[1] + keys[key][1]
return answer
print(solution(["left", "right", "up", "right", "right"],[11, 11])) # [2, 1]
print(solution(["down", "down", "down", "down", "down"],[7, 9])) # [0, -5]
- 역시 그렇군
def solution(keyinput, board):
answer = [0,0]
keys = {
"up" : [0,1],
"down" : [0,-1],
"left" : [-1,0],
"right" : [1,0]
}
limit = [0,0]
limit[0] = (board[0] - 1) // 2
limit[1] = (board[1] - 1) // 2
for key in keyinput:
answer[0] = answer[0] + keys[key][0]
answer[1] = answer[1] + keys[key][1]
if abs(answer[0]) > abs(limit[0]) or abs(answer[1]) > abs(limit[1]):
answer[0] = limit[0]
answer[1] = limit[1]
return answer
print(solution(["left", "right", "up", "right", "right"],[11, 11])) # [2, 1]
print(solution(["down", "down", "down", "down", "down"],[7, 9])) # [3, 4]
- 좀 지저분하긴 한데 이따 정리하기로 하고...일단....이렇게 하니까 answer[0]은 board를 안 넘었는데 엉뚱한 값이 들어가버렸다 if를 나눠줘야겠다
if abs(answer[0]) > abs(limit[0]):
answer[0] = limit[0]
elif abs(answer[1]) > abs(limit[1]):
answer[1] = limit[1]
- 이렇게 바꿔서 [0, 4] 원하는 숫자가 나오긴 했는데 음수가 나와야 하거늘.....하 코드가 더 길어지는 거 같은데
- 딕셔너리는 노답이었나
x_limit.append(-((board[0] - 1) // 2))
x_limit.append((board[0] - 1) // 2)
y_limit.append(-((board[1] - 1) // 2))
y_limit.append((board[1] - 1) // 2)
print(x_limit, y_limit) # [-5, 5] [-5, 5] or [-3, 3] [-4, 4]
- 여기까지 성공은 했는데....코드가 ....너무 지저분하다...
for key in keyinput:
answer[0] = answer[0] + keys[key][0]
answer[1] = answer[1] + keys[key][1]
- 일단 이거는 += 이 연산자로 바꿔야겠다
for key in keyinput:
answer[0] += keys[key][0]
answer[1] += keys[key][1]
- 바로 이렇게...쫌더...깔끔해지긴 함..!
def solution(keyinput, board):
answer, x_limit, y_limit = [0,0], [], []
keys = {
"up" : [0,1],
"down" : [0,-1],
"left" : [-1,0],
"right" : [1,0]
}
x_limit.append(-((board[0] - 1) // 2))
x_limit.append((board[0] - 1) // 2)
x = range(x_limit[0], x_limit[1]+1)
y_limit.append(-((board[1] - 1) // 2))
y_limit.append((board[1] - 1) // 2)
y = range(y_limit[0], y_limit[1]+1)
for key in keyinput:
answer[0] += keys[key][0]
answer[1] += keys[key][1]
if answer[0] not in list(x):
if x_limit[0] > answer[0]:
answer[0] = x_limit[0]
if x_limit[1] < answer[1]:
answer[0] = x_limit[1]
if answer[1] not in list(y):
if y_limit[0] > answer[1]:
answer[1] = y_limit[0]
if y_limit[1] < answer[1]:
answer[1] = y_limit[1]
return answer
print(solution(["left", "right", "up", "right", "right"],[11, 11])) # [2, 1]
print(solution(["down", "down", "down", "down", "down"],[7, 9])) # [0, -4]
- 일단 완성...! 이제 중복코드 이런 거를 좀 정리해본다..!!
def solution(keyinput, board):
answer, limit = [0,0], []
keys = {
"up" : [0,1],
"down" : [0,-1],
"left" : [-1,0],
"right" : [1,0]
}
limit.append(-((board[0] - 1) // 2))
limit.append((board[0] - 1) // 2)
limit.append(-((board[1] - 1) // 2))
limit.append((board[1] - 1) // 2)
print(limit)
for key in keyinput:
answer[0] += keys[key][0]
answer[1] += keys[key][1]
if limit[0] > answer[0]:
answer[0] = limit[0]
if limit[1] < answer[0]:
answer[0] = limit[1]
if limit[2] > answer[1]:
answer[1] = limit[2]
if limit[3] < answer[1]:
answer[1] = limit[3]
return answer
- 흠 코드 줄이기는 너무 어려워...
- 그나저나 채점했더니 테스트 1개 통과가 안 된다 젠장 정답이 아니라니..
- 질문하기를 뒤져보다가 어떤 사람이 이걸 참고하라고 했다
- if문이 for문 안에 있어야 한다는 걸 깨달았다!
- keyinput에 의해 좌표가 바뀔 때마다 if문을 돌려줘야 한다
- 근데 if문 어떻게 줄이는 방법 없을까...? 내 코드 참 조잡하다..
<완성된 코드>
def solution(keyinput, board):
answer, limit = [0,0], []
keys = {
"up" : [0,1],
"down" : [0,-1],
"left" : [-1,0],
"right" : [1,0]
}
limit.append(-(board[0] // 2))
limit.append(board[0] // 2)
limit.append(-(board[1] // 2))
limit.append(board[1] // 2)
for key in keyinput:
answer[0] += keys[key][0]
answer[1] += keys[key][1]
if limit[0] > answer[0]:
answer[0] = limit[0]
if limit[1] < answer[0]:
answer[0] = limit[1]
if limit[2] > answer[1]:
answer[1] = limit[2]
if limit[3] < answer[1]:
answer[1] = limit[3]
return answer
print(solution(["left", "right", "up", "right", "right"],[11, 11])) # [2, 1]
print(solution(["down", "down", "down", "down", "down"],[7, 9])) # [0, -4]
print(solution(["left", "left", "left", "right"],[3, 3])) # [0, 0]
<다른 사람 풀이>
- 천재풀이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]
- 나도 abs()함수 써보려고 했는데.. 음수는 어떻게 해야 하나 해서 결국 x좌표 양수 최댓값, 음수 최솟값, y좌표 양수 최댓값, 음수 최솟값 이렇게 했는데....
- 근데 이렇게 봐도 이해가 잘..........print문 찍어봐야겠다
- 이거 약간 튜플에 대한 이해도 필요하구나..
- 이해했다
- if문에 해당한다는 건 board밖을 넘어갔다는 거라서 그냥 다음 for문으로 넘어가고 if문에 해당하지 않는다는 건 board 안에 좌표가 있다는 거여서 x, y 좌표가 key에 맞게 하나씩 증가하는거다...!!
- 뭐랄까 약간 반대로 생각하기?
- 나는 x, y좌표에 key에 맞는 값을 계속 더하면서 board를 넘어서면 그 값을 제한할 생각을 했는데 이 사람은 반대로 board를 넘지 않으면 x좌표에 key에 맞는 값을 더하고 넘으면 더하지 않음으로써 board를 넘어가지 않게 하는....
- 하 나는 왜 이렇게 생각하지 못하는 걸까..!!!
- 근데 이건 진짜 튜플에 대한 이해도 있어야 하고....특히 dx,dy=move[k] 이거....리스트로는 이게 안 된단 말이다...