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

2023. 5. 18. 14:49·Algorithm/프로그래머스
 

프로그래머스

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

programmers.co.kr

 

코드

def solution(board, moves):
    basket = [] #  바구니
    c = 0  # 터트려져 사라진 인형의 개수
    for m in moves:
        for i in range(len(board)):
            if board[i][m-1] != 0:
                print(board[i][m-1])
                basket.append(board[i][m-1])
                board[i][m-1] = 0
                break  # 인형을 찾았으면 board 반복 종료
        
        # 바구니에 마지막으로 들어온 두 인형이 같으면 터트리기
        if len(basket) > 1 and basket[-2] == basket[-1]:
            basket.pop()
            basket.pop()
            c += 2
                
    return c

문제를 완벽하게 이해했다면 한 번만에 해결할 수 있는 문제이다.

하지만 나는 문제 이해를 하지 못해서 테스트 케이스는 통과하지만 채점 시 모두 오답이 되는 쓰디쓴 경험을 했다.

 

이 문제에서 키 포인트는 입력으로 주어지는 board를 이해하는 것이라고 생각된다.

board가 다음과 같이 주어질 때 이를 그림으로 표현해 보았다.

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

board는 각 가로줄을 나타내는 것이다. 나는 여기서 board의 각 위치에 대한 정보, 즉 세로로 이해했다.

왼쪽 그림은 board를 그대로 나타낸 것이고, 오른쪽 그림은 0을 제외하고 나타낸 것이다.

문제에서 0은 빈칸이라고 알려주었기 때문에 실제 인형 배치는 오른쪽 그림과 같다.

 

moves에는 board의 몇 번칸으로 가야 하는지에 대한 정보가 주어지므로 이는 board의 [열]에 해당한다.

그럼 어떻게 board에서 m칸에 인형이 있는지 파악할 수 있을까?

board를 0행부터 방문하여 m열의 값을 확인하면 된다. 0이 아니면 인형이 존재하는 것이다.

이 과정을 코드로 나타내면 다음과 같다.

for m in moves:
    for i in range(len(board)):
        if board[i][m-1] != 0:
            print(board[i][m-1])
            basket.append(board[i][m-1])
            board[i][m-1] = 0
            break  # 인형을 찾았으면 board 반복 종료

크레인은 위에 있는 인형부터 가져간다. 그러므로 가장 위에 위치한 인형을 찾았으면 break를 한다. 

이때 break를 하지 않으면 다음 행에서 인형 찾는 과정을 계속하게 되어 또 인형을 찾기 때문에 i의 반복을 종료해야 한다.

인형을 찾았으면 바구니(bakset)에 추가해 주고 원래 위치인 board[i][m-1]은 빈칸(0)으로 바꿔준다.

# 바구니에 마지막으로 들어온 두 인형이 같으면 터트리기
if len(basket) > 1 and basket[-2] == basket[-1]:
    basket.pop()
    basket.pop()
    c += 2

그다음으로 바구니에서 같은 인형인지 확인한다.

바구니에 2개 이상의 인형이 있어야 비교가 가능하므로 basket의 길이를 확인해 주고 마지막에 담긴 인형[-1]과 그전에 담긴 인형[-2]을 비교하여 같은 값이면(=같은 인형이면) pop() 함수를 사용하여 두 인형을 모두 리스트 basket에서 없애준다.

반응형
저작자표시 (새창열림)
'Algorithm/프로그래머스' 카테고리의 다른 글
  • 프로그래머스 | 2023 KAKAO BLIND RECRUITMENT | 개인정보 수집 유효기간 [파이썬 python]
  • 프로그래머스 | 2020 카카오 인턴십 | 키패드 누르기 [파이썬 python]
  • 프로그래머스 | 옹알이(2) [파이썬 python]
  • 프로그래머스 | 체육복 [파이썬 python]
dduniverse
dduniverse
  • dduniverse
    dduniverse
    dduniverse
  • 전체
    오늘
    어제
    • 분류 전체보기 (242)
      • Algorithm (123)
        • 알고리즘 이론 (8)
        • 백준 (19)
        • 프로그래머스 (83)
        • 구름 알고리즘 먼데이 챌린지 (13)
      • 빅데이터분석기사 (10)
        • 통계 (4)
        • 실기 (6)
      • KT에이블스쿨 (26)
      • FrontEnd (11)
        • React (5)
        • 기타 (6)
      • BackEnd (18)
        • Django (15)
        • Spring (3)
      • DS & ML (11)
        • Machine Learning (9)
        • Kaggle (2)
      • TIL (43)
        • python (22)
        • javascript (3)
        • 오류해결 (10)
        • 기타 (7)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 관리
    • 글쓰기
  • 링크

  • 인기 글

  • hELLO· Designed By정상우.v4.10.0
dduniverse
프로그래머스 | 2019 카카오 개발자 겨울 인턴십 | 크레인 인형뽑기 게임 [파이썬 python]
상단으로

티스토리툴바