-
코딩테스트 연습> 2019 카카오 개발자 겨울 인턴십> 크레인 인형뽑기 게임ALGORITHM/Programmers 2020. 10. 24. 10:04728x90
<문제링크: programmers.co.kr/learn/courses/30/lessons/64061>
문제설명:
인형뽑기 통(?)이 board 배열로 주어지고, 뽑기 기계가 움직이는 방향을 담은 moves 배열이 주어진다.
moves 방향에 따라 기계가 이동하면서 인형들을 뽑아 임시 바구니에 차곡차곡 담는다.
이때, 같은 모양의 인형이 2개가 만나면, 터지면서 사라진다.
이 때, 사라지는 인형들의 개수를 모두 더해 최종 ans로 return 하면 된다.
[1차 시도]
def solution(board, moves): ans = 0 basket = [] for i in moves: i-=1 for line in board: if line[i]>0: if basket and basket[-1] == line[i]: basket.pop() ans+=2 else: basket.append(line[i]) line[i] = 0 break return ans
풀이:
맨 처음 인형들을 담을 빈 배열 basket을 만든다.
moves 배열의 원소들을 for문으로 돌면서, board 배열의 인덱스로 접근해야 하기때문에
i에서 1씩 빼준다.
board 배열을 도는 line은 인형뽑기 통의 가로 한 줄씩을 탐색하면서,
만약 현재 기계가 움직인 위치의 값이 0이면 비어있는 칸이므로 고려하지 않고,
만약 숫자가 있다면 인형이 존재하므로 계속해서 탐색한다.
숫자는 각 인형에 해당하는 별칭이므로 해당 숫자(line[i])를 바구니에 저장하는데,
만약 바구니가 비어있지 않고, 마지막으로 바구니에 저장한 인형인
그림 상 가장 위에 놓여있을거라고 생각하는 인형이 현재 뽑은 인형(line[i])와 동일하다면,
같은 모양의 인형이 2개가 만난것이므로 현재 뽑은 인형은 저장하지 않고
바구니에 마지막으로 저장되어 있는 인형을 pop()으로 제거 해줘야 한다.
그러면 2개의 인형이 터지면서 사라진 것이므로 최종 ans에 +2
그리고 else문인 바구니가 비어있거나, 바구니에 마지막 저장된 인형이
현재 뽑은 인형과 일치하지 않다면, 바구니에 뽑은 인형을 추가한다.
그리고 인형을 뽑은 해당 위치는 인형이 사라져 비어있으므로 0으로 초기화시켜
다음 번 같은 위치에 뽑기 기계가 왔을 때, 한 칸 아래 인형을 뽑을 수 있도록 한다.
마지막으로 break를 걸어 다음 번 뽑기 기계가 다시 첫번째 가로줄부터 탐색해서
내려올 수 있도록 한다.
최종적으로 ans를 return하면,
채첨결과: 정확성 테스트케이스 11개 모두 잘 통과한다.
'ALGORITHM > Programmers' 카테고리의 다른 글
코딩테스트 연습> 그래프 > 순위 (0) 2021.03.09 코딩테스트 연습> 2020 카카오 인턴십> 키패드 누르기 (0) 2020.09.10 코딩테스트 연습> 탐욕법(Greedy)> 구명보트 (0) 2020.08.14 코딩테스트 연습> Summer/Winter Coding(~2018)> 예산 (0) 2020.07.26 코딩테스트 연습> 스택/큐> 쇠막대기 (0) 2020.07.24