[알고리즘] 프로그래머스 64061 크레인 인형뽑기 게임 파이썬

June·2020년 12월 26일
0

알고리즘

목록 보기
5/260

문제

크레인 인형뽑기 게임

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 의 차이점

우리가 흔히 쓰는 ==는 값을 비교하는 연산자이다. 반대로 '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가 된다.

0개의 댓글