본문 바로가기
코딩테스트/파이썬

[python] 1차원 뿌요뿌요

by onggury 2023. 6. 16.

문제

뿌요뿌요는 여러 색깔의 뿌요(블럭)들을 적절히 배치하여, 가능한 많은 뿌요를 터트리는 것이 목적인 낙하형 퍼즐 게임이다. 원래 게임은 2차원 보드에서 진행이 되지만 이 문제는 1차원 보드라고 가정하자.

 

현재 보드 위에 N개의 뿌요가 늘어선 상태이며, 같은 색깔의 뿌요가 M개 이상 서로 붙어 있으면 터진다. 여러 뿌요가 동시에 터지는 조건을 만족할 때는 그 중 가장 왼쪽에 있는 뿌요들이 터지기 시작한다.

 

보드의 초기 상태를 나타낸 문자열이 주어졌을 때, 더 이상 뿌요가 터지지 않게 되었을 때 보드의 상태를 구해보자.

 

 

예제 설명

처음 보드의 상태는 ABCCBCCDA 이고 2개가 붙어있을 경우 터진다고 가정하자.

처음 뿌요가 터짐에 따라 ABBCCDA, ACCDA, ADA 순서로 보드의 상태가 변하게 된다.

 

 

입력

첫째 줄에 두 정수 N, M이 공백을 두고 주어진다.

둘째 줄에 길이 N의 뿌요 문자열 S가 주어진다. 뿌요 문자열의 각 문자는 해당 위치에 놓여있는 뿌요의 색깔을 의미한다.

  • 2 ≤ M ≤ N ≤ 200,000
  • S는 알파벳 대문자로만 이루어진 문자열이다.

 

 

import sys
input = sys.stdin.readline

n, m = map(int, input().split())
s = input().rstrip()

resultStack = []
resultStack.append(['', 1])  # 첫 뿌요를 확인하기 위한 더미데이터

s += 'a'  # 마지막 뿌요가 터저야 할지 말지 판단하기 위한 더미데이터
for c in s:
	if resultStack[-1][0] != c:
		if resultStack[-1][1] >= m:
			bbooYoPop = resultStack[-1][0]
			while bbooYoPop == resultStack[-1][0]:
				resultStack.pop()
	
	if resultStack[-1][0] == c:
		resultStack.append([c, resultStack[-1][1] + 1])
	else:
		resultStack.append([c, 1])

resultStack.pop()

if len(resultStack) > 1:
	print(''.join(resultStack[i][0] for i in range(len(resultStack))))
else:
	print("CLEAR!")

뿌요가 해당 갯수 이상이 되면 터져야 함을 잊고 구현했다가 한참 고생했던 문제이다.

그리고 스택을 활용하여 [현재뿌요, 연속된개수]로 한다는 아이디어는 처음 봐서 분명 언젠가 또 써먹을 아이디어라고 생각한다.

 

 

 

※출처

https://multicampus-kdt.goorm.io/lecture/38996/멀티잇-코딩테스트-러닝클래스-python-6월반