알고리즘/programmers[1]

[프로그래머스]크레인 인형뽑기 게임

fladi 2022. 1. 9. 22:04
728x90
def isEmpty(stack):
    return (len(stack) == 0)

def solution(board, moves):
    answer = 0

    b_stack = {}
    stack = []
    height = len(board)
    width = len(board[0])

    for w in range(width):
        tmp = []

        for h in range(height-1, -1, -1):
            if (board[h][w] == 0):
                break
            else:
                tmp.append(board[h][w])

        b_stack[w+1] = tmp

    for m in moves:
        if (not isEmpty(b_stack[m])):
            item = b_stack[m].pop()

            if (not isEmpty(stack) and stack[-1] == item):   # 스택 top이랑 item값 비교
                stack.pop()
                answer += 2           # 터졌다!
            else:
                stack.append(item)

    return answer

<내 코드 분석>

 

■ 사용한 변수: b_stack(각 열에 해당하는 스택들의 모임), stack(뽑은 인형을 쌓을 바구니 스택), height(보드의 행의 수), width(보드의 열의 수)

 

 

1. 코드를 간결하게 만들기 위해 isEmpty함수를 만들어줌. (코드를 다 작성한 후 따로 빼준 것)

2. board의 각 열은 순서대로 1,2,3,4 ... 의 값을 가진다.(크레인이 인형을 뽑는 위치) b_stack은 이 값을 키값으로 가지며, value로 스택을 가진다. 인형이 스택구조와 유사하게 뽑힌다는 점을 이용한 것이다.

3. 보드값을 입력받으면 그 값들을 이용하여 b_stack을 만들어줌. 

4. moves값을 하나씩 빼서 딕셔너리에 키 값으로 접근한다. 해당 스택이 비어있지 않다면 인형을 뽑고(pop) stack에 넣기 전 터져야하는지 확인한 후 append를 해준다.

 

 

> 다른 사람들은 더 짧은 코드로 단순하게 문제를 풀었다. 굳이 새로운 스택을 만들면서까지 문제를 풀 필요는 없었던 것 같다. 다음에는 입력값을 정재하지 않고 문제를 풀 수 있는 방법을 더 고려해봐야겠다.(입력값을 바꾸는 데에 시간이 많이 걸렸다.)

 

 

728x90