Just Fighting

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

Algorithm/코딩테스트 연습

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

yennle 2022. 1. 13. 13:09
728x90

https://programmers.co.kr/learn/courses/30/lessons/64061

 

코딩테스트 연습 - 크레인 인형뽑기 게임

[[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

programmers.co.kr

 

 

<문제 설명>

인형뽑기 게임을 하려고한다. NxN칸으로 구성되어있으며 격자의 아래칸부터 인형이 차곡차곡 쌓아져 있다.

인형을 뽑을 땐 가장 위에 있는 인형부터 뽑으며, 뽑힌 인형은 순서대로 바구니에 집어 넣는다.

이때 바구니에 같은 인형이 연달아 들어가면 같은 인형 2개가 없어진다.

인형이 없는 곳에서 크레인을 작동시키면 아무 일도 일어나지 않으며,

바구니는 모든 인형이 들어갈 수 있을만큼 충분히 크다.

 

 

 

<문제 이해>

NxN배열로 인형의 배열이 들어있기 때문에 일단 인형이 있는 인덱스를 찾는게 우선이라고 생각했다.

그리고 인형을 담기 전에 바구니의 마지막 인형과 같으면 인형을 제거하고 정답에 2를 더해주면 된다고 생각했다.

 

 

 

<문제 풀이>

def solution(board, moves):
    answer = 0
    n = len(board)
    topIdx = [0 for i in range(n)]
    
    for row in range(n):
        for col in range(n):
            if board[row][col] == 0:
                topIdx[col] += 1
        
    basket = []
    for m in moves:
        x = m-1
        if topIdx[x] < n:
            pos = board[topIdx[x]][x]
            topIdx[x] += 1
            
            if len(basket) > 0:
                if pos == basket[len(basket)-1]:
                    basket.pop()
                    answer += 2
                else:
                    basket.append(pos)
            else:
                basket.append(pos)
    
    return answer

마지막에 인형이 같을 때를 고려하기 위해 if문을 두번 썼는데, 뭔가 너무 지저분하다고 생각했다.

다른 사람들의 풀이를 보고 코드를 줄이는 법을 알았다.

인형은 1에서 100까지의 수를 가지니까 basket에 미리 0을 넣어두면

basket안에 들어있는 데이터의 개수를 굳이 따지지 않아도 된다.

 

 

 

<풀이 개선>

def solution(board, moves):
    answer = 0
    n = len(board)
    topIdx = [0 for i in range(n)]
    
    for row in range(n):			# 인형이 있는 인덱스를 찾기
        for col in range(n):
            if board[row][col] == 0:
                topIdx[col] += 1
        
    basket = [0]
    for m in moves:
        x = m-1
        if topIdx[x] < n:			# 인형이 1개 이상인 경우에만 실행
            pos = board[topIdx[x]][x]
            topIdx[x] += 1
            
            if pos == basket[len(basket)-1]:	# 이전 인형과 같으면 실행
                basket.pop()
                answer += 2
            else:
                basket.append(pos)
    
    return answer

728x90
Comments