Coding Test/Programmers_Python

[프로그래머스] 2019 카카오 개발자 겨울 인턴십 - 크레인 인형뽑기 게임

  • -
728x90

문제를 제대로 파악한 후 시나리오를 미리 따로 적어두고 코드를 작성하면 크게 어렵지 않게 풀 수 있는 문제인 것 같다


문제

화면의 구성, 규칙을 다음과 같이 설정 할 예정이다

1. 게임 화면은 N x N 크기의 격자이다

2. 위쪽에는 크레인이 있고, 오른쪽에는 바구니가 있다

3. 각 격자마다 다른 속성의 인형이 있고, 인형이 없는 칸은 공백이다

4. 각 인형들은 아래에서부터 차곡차곡 쌓여있다

5. 크레인을 멈춘 위치에서 인형을 들어올릴 수 있다

6. 집어올린 인형이 바구니에 들어가면 아래에서 부터 쌓인다

7. 바구니에 같은 속성의 두 개의 인형이 두 개 붙으면 사라진다

8. 바구니는 모든 인형이 들어갈 정도로 크다


무엇을 확인해야할까?

1. board 배열은 N x N 형태로 ( 5 <= N <= 30 )

2. board의 각 칸에는 0~100인 정수가 담겨있다

3. moves 배열의 크기는 1~1000이다

5. 모든 크레인을 작동시킨 이후의 바구니를 확인한다

6. 무한반복을 통해 사라진 인형의 전체 개수를 구하고 빠져나온다 - 이 부분 간과했다가 20분 날림

7. 올바른 답안 출력


입출력 예 분석

board에는 배열이 다음과 같이 들어있다

[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. board의 1 번째 배열부터 moves의 n번째 위치에 있는 지 확인하면 될 것이다

2. 하나씩 넘겨보면서 확인해보다가 0이 아닌 값이 들어있으면 바구니에 하나씩 append한다

  • 이 때, 바구니에 값이 하나라도 들어있고, 가장 마지막 값이 지금 넣으려는 값과 동일하다면 append 대신 기존에 있던 값을 pop한다
  • 그 후 result의 값을 1 증가시킨다

3. 전체를 돌아봤는데도 board의 현재 위치의 move자리에 없다면 append하지 않는다

 

 


코드 작성

def solution(board, moves):
    answer = 0
    # 바구니 배열로 선언
    basket = []
    # 움직인 위치에서 board 한 층 씩 살펴보며 0이 아니면 바구니에 담기
    for m in moves:
        for bo in board:
            if bo[m-1] != 0:
                basket.append(bo[m-1])
                bo[m-1] = 0
                break
    # 바구니에 담긴 전체 배열을 무한반복시키며 인형을 없앨 수 없을 때까지 반복
    # count를 통해 인형이 사라지지 않는다면 반복문을 끝내고 결과를 출력
    while True:
        count = 0
        for i in range(1, len(basket)):
            if basket[i] == basket[i-1]:
                answer += 2
                count += 1
                basket.pop(i)
                basket.pop(i-1)
                break
        if count == 0:
            break

    return answer

실행 결과

정상적으로 실행된다!


End

728x90
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.