[크레인 인형뽑기 게임]-[2019 카카오 개발자 겨울 인턴십]
My answer
def solution(board, moves):
answer,cnt = 0, 0
tmp=[[0 for i in board] for j in board]
array2=[0]*(len(board)**2)
for i in range(len(board)):
for j in range(len(board)):
tmp[i][j]=board[j][i]
for i in moves:
for j in range(len(tmp[0])):
if(tmp[i-1][j]!=0):
array2[cnt]=tmp[i-1][j]
tmp[i-1][j]=0
# 두개씩 만들어지면 터뜨리는 과정
if(cnt!=0 and array2[cnt-1]==array2[cnt]):
array2.pop()
array2.pop()
answer+=2
cnt-=2
cnt+=1
break
return answer
-----------------------------------------------------------------------
def solution(board, moves):
answer = 0
tmp=[[0 for i in board] for j in board]
array2=[]
for i in range(len(board)):
for j in range(len(board)):
tmp[i][j]=board[j][i]
for i in moves:
for j in range(len(tmp[0])):
if(tmp[i-1][j]!=0):
array2.append(tmp[i-1][j])
tmp[i-1][j]=0
# 두개씩 만들어지면 터뜨리는 과정
if(len(array2)!=1 and array2[-1]==array2[-2]):
array2.pop()
array2.pop()
answer+=2
break
return answer
더보기
위의 코드 수정버전이 아래 코드인데 우선 아래코드에서도 굳이 전치행렬을 안만들어서 풀어도 되는데, 그냥 직관적으로 보기 편하려고 전치시킨다음 했다. 수정사항은 우선 불필요한 인덱스를 나타내는 cnt변수를 없애고 array2의 마지막인형관 그전 인형을 비교하는걸 인덱스 -1,-2를 사용하여 간편화시켰다. 또한 맨처음에 문제를 못풀었던 이유는 pop대신 remove를 사용했어서이다. remove는 똑같은 값이 있는경우 그냥 앞에 있는 것을 삭제하기 때문에 특정 인덱스의 값을 삭제하려면 pop을 써야한다.
[키패드 누르기]-[2020 카카오 인턴십]
My answer
def distance(x,y):
result=abs(x[0]-y)+abs(x[1]-1)
return result
def solution(numbers, hand):
answer = ''
keypad=[[1,2,3],[4,5,6],[7,8,9],['*',0,'#']]
tmp=0
lpos,rpos=[3,0],[3,2]
for i in numbers:
for j in range(len(keypad)):
if(i in keypad[j]):
tmp=keypad[j].index(i)
break
if(tmp==0):
answer+='L'
lpos=[j,0]
elif(tmp==2):
answer+='R'
rpos=[j,2]
else:
dr=distance(rpos,j)
dl=distance(lpos,j)
if(dr==dl):
if(hand=='left'):
answer+='L'
lpos=[j,1]
else:
answer+='R'
rpos=[j,1]
elif(dr>dl):
answer+='L'
lpos=[j,1]
else:
answer+='R'
rpos=[j,1]
return answer
Another answer
def solution(numbers, hand):
answer = ''
key_dict = {1:(0,0),2:(0,1),3:(0,2),
4:(1,0),5:(1,1),6:(1,2),
7:(2,0),8:(2,1),9:(2,2),
'*':(3,0),0:(3,1),'#':(3,2)}
left = [1,4,7]
right = [3,6,9]
lhand = '*'
rhand = '#'
for i in numbers:
if i in left:
answer += 'L'
lhand = i
elif i in right:
answer += 'R'
rhand = i
else:
#curpos는 지금 가야할 위치
curPos = key_dict[i]
lPos = key_dict[lhand]
rPos = key_dict[rhand]
#거리 구하기
ldist = abs(curPos[0]-lPos[0]) + abs(curPos[1]-lPos[1])
rdist = abs(curPos[0]-rPos[0]) + abs(curPos[1]-rPos[1])
if ldist < rdist:
answer += 'L'
lhand = i
elif ldist > rdist:
answer += 'R'
rhand = i
else:
if hand == 'left':
answer += 'L'
lhand = i
else:
answer += 'R'
rhand = i
return answer
더보기
우선 맨처음 문제를 못풀었던 이유는 문제조건에서 거리는 단순히 번호 한칸이동마다 1이라고 지칭하였는데, 번호판의 거리를 잴 때 두 점 사이의 거리 공식을 이용해서 구한게 틀렸었다. 또한 손가락이 계속 움직이기 때문에 각 손가락의 위치들도 저장해놔야한다는 생각을 나중에서야했었다. 아래 코드는 방식은 나와 비슷하지만 아예 자판들의 좌표를 미리 딕셔너리에 저장후에 풀었다는 차이점이 있다.
728x90
반응형
'코딩테스트 > 프로그래머스[Python]' 카테고리의 다른 글
[프로그래머스] 09/27 (6) (0) | 2021.09.27 |
---|---|
[프로그래머스] 09/26 (1) (0) | 2021.09.26 |
[프로그래머스] 09/17 (6) (0) | 2021.09.22 |
[프로그래머스] 09/16 (3) (0) | 2021.09.16 |
[프로그래머스] 09/15 (6) (0) | 2021.09.15 |