백준 문풀

백준 2656 전깃줄

조강학 2024. 11. 5. 22:01

문제를 있는 그대로 받아들여서 교차점이 제일 많은 전깃줄부터 제거하여 문제를 풀려 했지만 교차점이 같은 전깃줄에서 어느 것을 먼제 제거할지 결정하기가 어려웠다..

결국 서치하여 알아낸 것은

문제 풀이 방법이 증가하는 가장 긴 부분 수열을 구하는 문제라는 것!

 

 

왼쪽 전봇대와 오른쪽 전봇대를 볼 때, 왼쪽에서 출발하는 전깃줄이 도착하는 오른쪽 전봇대의 인덱스를 나열하여, 그중에서 제일 긴 증가하는 부분수열을 구하면 되는 문제였다..

 

가장 긴 증가하는 부분 수열을 구하는 방법은?

dp 배열을 이용한다.

dp[a]=b의 의미는 a번째 값이 가지는 가장 긴 증가하는 부분 수열의 길이는 b이다. 라는 의미임

 

 

정렬되지 않은 순서로 입력이 주어질 수 있으므로 저장한 값을 먼저 정렬해주고, dp 배열에 값을 할당한다. 

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<pair<int, int>>line;
vector<int>dp(501);

int main() {
	cin.tie(0);
	ios::sync_with_stdio(0);
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		int from, to;
		cin >> from >> to;
		line.push_back(make_pair(from, to));
	}

	sort(line.begin(), line.end());


	int answer = 1;
	for (int i = 0; i < n; i++) {
		dp[i] = 1;
	}
	for (int i = 1; i < n; i++) {
		for (int j = i-1; j >=0; j--) {
			if (line[j].second < line[i].second) {
				dp[i] = dp[i] > dp[j] + 1 ? dp[i] : dp[j] + 1;
			}
		}
		answer = dp[i] > answer ? dp[i] : answer;
	}

	cout << n - answer;

	return 0;
}

 

 

'백준 문풀' 카테고리의 다른 글

백준 9084  (0) 2024.11.10
배낭 알고리즘  (0) 2024.11.09
백준 1920 수 찾기  (0) 2024.09.30
백준 2295 세 수의 합  (0) 2024.09.30
백준 2110 공유기 설치  (1) 2024.09.30