[Programmers] 풍선 터뜨리기

Date:

[Programmers] 풍선 터뜨리기

Problem URL : 풍선 터뜨리기

#include <string>
#include <vector>

using namespace std;

int dpLeft[1000000], dpRight[1000000];

int solution(vector<int> a) {
	int answer = 0;
	dpLeft[0] = a[0];
	// 처음 풍선부터 i 풍선까지의 최솟값을 기록
	for (int i = 1; i < a.size(); i++)
		dpLeft[i] = dpLeft[i - 1] > a[i] ? a[i] : dpLeft[i - 1];
	
	int size = a.size();
	dpRight[size - 1] = a[size - 1];
	// 마지막 풍선부터 i풍선까지의 최솟값을 기록
	for (int i = size - 2; i >= 0; i--) 
		dpRight[i] = dpRight[i + 1] > a[i] ? a[i] : dpRight[i + 1];

	// 왼쪽, 오른쪽 중에 한 방향으로 풍선을 터뜨릴 수 있는지 체크
	for (int i = 0; i < size; i++)
		if (a[i] == dpLeft[i] || a[i] == dpRight[i]) answer++;
	
	return answer;
}

Comments


처음에는 세그먼트 트리를 이용해서 부분 최솟값을 구할 생각을 했다.
생각해보니 한 끝이 고정된 (처음과 마지막 풍선) 부분의 최솟값이어서 dp 배열로 해결된다.

댓글