2019 카카오 개발자 겨울 인턴쉽 1번 문제이기도 하다.
스택
내 코드
def pick(j, board):
for i in range(0, len(board)):
if board[i][j] != 0:
item = board[i][j]
board[i][j] = 0
return item
def move(stack, item):
if stack and stack[-1] == item and item is not None:
stack.pop()
return 2
stack.append(item)
return 0
def solution(board, moves):
answer = 0
stack = []
for j in moves:
j = j - 1
item = pick(j, board)
if item == 0 or item is None:
continue
answer += move(stack, item)
return answer
print(solution([[0, 0, 0, 0, 0], [0, 0, 1, 0, 3], [0, 2, 5, 0, 1], [4, 2, 4, 4, 2], [3, 5, 1, 3, 1]],
[1, 5, 3, 5, 1, 2, 1, 4]), 4)
print(solution([[0, 0, 1, 0, 0], [0, 0, 1, 0, 0], [0, 2, 1, 0, 0], [0, 2, 1, 0, 0], [0, 2, 1, 0, 0]],
[1, 2, 3, 3, 2, 3, 1]), 4)
print(solution([[0, 0, 0, 0, 0], [0, 0, 1, 0, 3], [0, 2, 5, 0, 1], [4, 2, 4, 4, 2], [3, 5, 1, 3, 1]],
[1, 5, 3, 5, 1, 2, 5, 1, 4, 3]), 8)
프로그래머스 다른 사람 깔끔한 코드
def solution(board, moves):
stacklist = []
answer = 0
for i in moves:
for j in range(len(board)):
if board[j][i-1] != 0:
stacklist.append(board[j][i-1])
board[j][i-1] = 0
if len(stacklist) > 1:
if stacklist[-1] == stacklist[-2]:
stacklist.pop(-1)
stacklist.pop(-1)
answer += 2
break
return answer
처음 풀었을 때 실수한 부분은 크레인이 내렸을 때 아무 것도 없으면 pick 함수의 결과로 None이 반환되는 것이다. 이 None에 대한 예외처리를 해주지 않으면 스택에 'None'이 추가된다.
item != None
위 코드를 치니 IDE에서 노란 줄이 생겼다. 알고보니 None과 비교할 때는 is not 을 쓰는 것이 더 추천된단다. 평소에 생각 없이 잘 쓰던 부분이라 찾아봤다.
우리가 흔히 쓰는 ==는 값을 비교하는 연산자이다. 반대로 'is'는 같은 주소를 가지고 있는지 비교하는 연산자다.
list1 = []
list2 = []
list3=list1
if (list1 == list2):
print("True")
else:
print("False")
if (list1 is list2):
print("True")
else:
print("False")
if (list1 is list3):
print("True")
else:
print("False")
list3 = list3 + list2
if (list1 is list3):
print("True")
else:
print("False")
결과
True
False
True
False
list1과 list2는 각각 생성된 객체이고, 안에 내용 값은 같다. 그래서 list1==list2이다. 하지만 각각 생성된 객체이기에 주소 값이 같을 수 없다. 그래서 list is list2는 False이다. list3에는 list1이 가리키고 있는 주소 값을 넣었기 때문에 둘은 같은 주소를 가지고 있다. 따라서 list1 is list3이다. list = list3 + list2라고 하면 새로운 객체를 생성해서 할당하고, 그렇게되면 list1 is list3는 False가 된다.