새소식

Computer Science/코딩테스트 문제 풀이

⭐⭐⭐⭐[코드트리] [시뮬레이션] 1차원 폭발 게임

  • -

 

 

문제

이상 이하의 숫자가 적혀있는 개의 폭탄이 쌓여있습니다.

이때 개 이상 연속으로 같은 숫자가 적혀있는 폭탄들은 터지게 되고, 중력에 의해 위에 있던 폭탄들은 밑으로 떨어지게 됩니다. 개 이상 연속한 폭탄은 부분만 터져서는 안되고 전부 다 터져야 합니다.

예를 들어 다음과 같은 예시에서  인 경우 이라는 숫자가 연속하여 번 이상 나오므로 그 폭탄들이 터지게 됩니다.

만약 개 이상인 폭탄들의 쌍이 여러 개라면 동시에 터지게 됩니다.

 

이 과정을 개 이상 연속한 숫자를 갖는 폭탄들이 존재하지 않을때까지 계속 반복했을 때, 최종 결과를 출력하는 프로그램을 작성해주세요.

위의 예에서 인 경우 진행 과정은 다음과 같습니다.

 

첫째 줄에는  이 공백을 사이에 두고 주어집니다.

두 번째 줄 부터 개의 줄에 걸쳐 각 폭탄의 숫자가 주어집니다. 숫자는 위에 있는 폭탄에 적혀있는 숫자부터 아래 방향으로 순서대로 주어집니다.

첫 번째 줄에는 최종적으로 남게 된 폭탄의 개수를 출력합니다.

두 번째 줄 부터는 한 줄에 하나씩 위에서부터 아래 방향으로 각 폭탄에 적혀있는 숫자를 출력합니다.

 

입력:

8 2
1
3
3
3
2
1
1
2

 

출력:

1
1

 


진짜 꼭 기억해야할 문제이다.

- 폭발할 폭탄은 0으로 만들고 

- 폭발할 연속된 폭탄 번호는 start와 end로 구분한다

- start부터 end까지 폭발할 폭탄의 수가 조건 개수 m보다 크거나 같으면 

폭발 시키는데 이때 폭발하는 폭탄은 0이 된다. 

 

import sys def count_explode_bomb(start, num): for end in range(start + 1, len(arr)): # 현재위치 다음 위치부터 끝까지 if arr[end] != num: return end - 1 return len(arr) - 1 if __name__=="__main__": # 변수 선언 및 입력 n, m = tuple(map(int, input().split())) arr = [int(input()) for _ in range(n)] while True: did_explode = False for start, num in enumerate(arr): if num == 0: continue end = count_explode_bomb(start, num) if (end-start+1) >= m: arr[start:end + 1] = [0] * (end - start + 1) # 터질 폭탄의 num을 0으로 만듬 did_explode = True arr = list(filter(lambda x: x > 0, arr)) ''' 또는 new_arr=[] for a in arr: if a!=0: new_arr.append(a) arr=new_arr ''' if not did_explode: # 리스트 한바퀴 돌면서 터진적이 없으면 더이상 터질게 없으므로 while문 탈출 break print(len(arr)) for num in arr: print(num)

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

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