안녕하세요. 오늘은 크레인 인형뽑기 게임이라는 문제를 풀어보려고 합니다.

 

 

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

해당 문제는 2019 카카오 개발자 겨울 인턴십 코딩테스트에 나왔던 문항입니다.

 

 

 

 

 

 

 

문제 풀이:

def solution(board, moves):
    answer = 0
    crab_lst = []
    
    for m in moves:
        for i in range(len(board)):
            if board[i][m-1] != 0:
                crab_lst.append(board[i][m-1])
                board[i][m-1] = 0 # 인형을 뽑았으니 0으로 처리
                
                # 뽑은 인형이 2개 이상일 때만 터짐 발생
                if len(crab_lst) > 1:
                    if crab_lst[-1] == crab_lst[-2]: # last 2개가 같으면
                        crab_lst.pop()
                        crab_lst.pop()
                        answer += 2
                        
                break # 한 번 뽑았다면 다음 move로 넘어가야 함
                        
    return answer

먼저 우리가 몇 번째 위치에서 인형을 집을지 저장해 둔 moves에서 for문을 진행합니다.

 

주의해야 할 점은, moves는 n번 위치를 나타내기 때문에 실제로 우리가 board 배열에서 해당 위치를 찾을 때는 -1 해줘야 한다는 점입니다. (list에서는 첫 번째가 index 기준 0이므로)

 

다음으로는 board의 길이 만큼 for문을 진행하게 되는데, 이는 moves에서 지정된 위치에서 board의 맨 위부터 내려가면서 인형이 있는 위치를 찾아가는 것이라고 생각해 주시면 됩니다.

 

그래서 if board[i][m-1] != 0이 나오게 됩니다. 즉, 0이 아닌 경우(인형이 있는 경우)에 도달하면 if문에 걸리게 되는 것이죠.

 

인형이 있으면, 이를 뽑힌 인형이 저장되는 crab_lst에 저장해 주고, 인형이 뽑혔으므로 해당 위치는 인형이 없어지게 되니 이 자리를 0으로 채워줍니다.

 

그리고 문제에서 만약 뽑힌 인형이 동일한 두개가 연달아 있으면 인형이 사라진다고 했으므로, crab_lst가 2 이상은 되어야 인형이 터지는 일이 발생합니다. 이를 반영해 if len(crab_lst) > 1 : 의 조건을 걸어줍니다.

 

 

list이므로 가장 마지막과 마지막에서 두 번째는 [-1]와 [-2]로 index 접근이 가능하며, 둘이 같으면 pop으로 빼주고 answer에 2를 더해줍니다.

 

그리고 break를 꼭 해줘야 하는데, 이는 해당 번째 위치에서 인형은 한 번만 뽑기 때문입니다. 해당 break가 없으면 moves에 해당하는 m 번째 위치에서 인형을 계속 뽑게 됩니다.

 

 

 

이번 문제는 여기까지 정리하도록 하겠습니다.

 

 

감사합니다.

+ Recent posts