개발자일걸요..?

2565번 전깃줄 본문

알고리즘코딩/Baekjoon Online Judge

2565번 전깃줄

Re_A 2021. 3. 18. 13:12
728x90
반응형

문제링크 : www.acmicpc.net/problem/2565

 

2565번: 전깃줄

첫째 줄에는 두 전봇대 사이의 전깃줄의 개수가 주어진다. 전깃줄의 개수는 100 이하의 자연수이다. 둘째 줄부터 한 줄에 하나씩 전깃줄이 A전봇대와 연결되는 위치의 번호와 B전봇대와 연결되는

www.acmicpc.net



<알고리즘>

 1) 전깃줄의 양쪽 포인트를 입력받고, A 전봇대의 point를 기준으로 정렬한다.(오름차순)

 2) 이렇게 정렬했을 때, 전깃줄 간의 교차가 없으려면 B전봇대의 point들은 A전봇대처럼 순차적으로 커져야 한다.

 3) LIS 알고리즘을 이용하여 자신포함, 자신 앞에 순차적으로 된 전기줄의 숫자를 세어 dq에 기록

 4) 전체 전깃줄 수 - dq의 최댓값(전깃줄이 교차없이 이어진 최대의 경우의 수) 를 출력(=제거해야하는 전깃줄 수)

 

 

 

예제를 표로 보는 풀이

A 1 2 3 4 6 7 9 10
B 8 2 9 1 4 6 7 10
dq 1 1 2 1 2 3 4 5
  (1,8) (2,2) (2,2)(3,9) (4,1) (2,2)(6,4) (2,2)(6,4)(7,6) (2,2)(6,4)(7,6)(9,7) (2,2)(6,4)(7,6)(9,7)(10,10)

 

 

 

메모리 : 2020KB    시간 : 0ms

#include <iostream>
#include <vector>
#include<algorithm>
using namespace std;

int main() {
	int T = 0;
	cin >> T;

	vector<vector<int>> point(T,vector<int>(2));
	int A = 0;	int B = 0;
	for (int i = 0; i < T; i++) {
		cin >> A >> B;
		point[i][0] = A;
		point[i][1] = B;
	}
	sort(point.begin(), point.end());
		
	// 이 벡터로 세는 값은 i번 포인트 앞에 올바르게
	// 있는 선들의 개수이다.(자신포함)
	vector<int> dq(T, 1);
	int maximum = 0;
	for (int i = 0; i < T; i++) {
		for (int j = 0; j < i; j++) {
			if (point[i][1] > point[j][1]) {
				dq[i] = max(dq[i], dq[j] + 1);
			}
		}
		maximum = ((dq[i] > maximum) ? dq[i] : maximum);
	}
	cout << T - maximum << "\n";
	return 0;
}

 

반응형

'알고리즘코딩 > Baekjoon Online Judge' 카테고리의 다른 글

12865번 평범한 배낭  (0) 2021.03.20
9251번 LCS  (0) 2021.03.19
11054번 가장 긴 바이토닉 부분 수열  (0) 2021.03.16
11053번 가장 긴 부분수열  (0) 2021.03.15
10844번 쉬운 계단 수  (0) 2021.03.11
Comments