문제를 제대로 파악한 후 시나리오를 미리 따로 적어두고 코드를 작성하면 크게 어렵지 않게 풀 수 있는 문제인 것 같다
문제
화면의 구성, 규칙을 다음과 같이 설정 할 예정이다
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
'Coding Test > Programmers_Python' 카테고리의 다른 글
[프로그래머스] 문자열 나누기 (0) | 2023.02.12 |
---|---|
[프로그래머스] 2021 KAKAO BLIND RECRUITMENT - 신규 아이디 추천 (0) | 2023.02.12 |
[프로그래머스] 2020 카카오 인턴십 - 키패드 누르기 (0) | 2023.02.12 |
[Python] 오늘의 연습 문제 풀기 5편 (0) | 2022.12.01 |
[Python] 프로그래머스 코딩테스트 입문 Day1 (0) | 2022.12.01 |