※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 12354번 문제인 Ocean View (Small)이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/12354 

 

12354번: Ocean View (Small)

The first line of the input gives the number of test cases, T. T test cases follow. Each test case will consist of two lines. The first line will contain a single integer N, the number of houses on Awesome Boulevard. The next line will list the height of e

www.acmicpc.net

12355번 문제에서 입력에 제한이 걸린 문제이다. 해당 문제의 풀이를 참고하자.

 

답이 4 이하라는 강한 제약을 이용해 없앨 건물의 개수별 모든 가능한 경우를 시험해보는 브루트포스 풀이를 이용할 수도 있다.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <cstring>
using namespace std;

int seg[2049];

int upd(int L, int R, int qI, int qVal, int sI) {
	if (R < qI || qI < L) return seg[sI];
	if (L == R) return seg[sI] = qVal;
	return seg[sI] = max(upd(L, (L + R) / 2, qI, qVal, sI * 2), upd((L + R) / 2 + 1, R, qI, qVal, sI * 2 + 1));
}

int rangemax(int L, int R, int qL, int qR, int sI) {
	if (R < qL || qR < L) return 0;
	if (qL <= L && R <= qR) return seg[sI];
	return max(rangemax(L, (L + R) / 2, qL, qR, sI * 2), rangemax((L + R) / 2 + 1, R, qL, qR, sI * 2 + 1));
}

void solve() {
	memset(seg, 0, sizeof(seg));
	int N; cin >> N;
	int NN = N;
	while (NN--) {
		int x; cin >> x;
		int mx = rangemax(1, 1000, 1, x - 1, 1);
		upd(1, 1000, x, mx + 1, 1);
	}

	cout << N - seg[1] << '\n';
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	int T; cin >> T;
	for (int t = 1; t <= T; t++) {
		cout << "Case #" << t << ": ";
		solve();
	}
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 15564 // C++] Äventyr 2  (0) 2022.07.24
[BOJ 23080 // C++] 스키테일 암호  (0) 2022.07.24
[BOJ 12024 // C++] 사각형 찾기  (0) 2022.07.24
[BOJ 15806 // C++] 영우의 기숙사 청소  (0) 2022.07.24
[BOJ 15563 // C++] Äventyr 1  (0) 2022.07.24

+ Recent posts