블로그

[C++] 2170 : 선 긋기 본문

PS

[C++] 2170 : 선 긋기

왕방토 2021. 2. 11. 23:43
728x90

골드 Ⅴ

 

처음의 배열로 푼 코드

 

#include <iostream>
#include <utility>
#include <algorithm>

using namespace std;

int n, x, y;

int main() {
	scanf("%d", &n);
	
	pair<int, int> line[1000000];
	
	for (int i = 0; i < n; i++) {
		scanf("%d%d", &x, &y);
		line[i] = make_pair(x, y);
	}
	
	sort(line, line + n);

	pair<int, int> len = line[0];
	int ans = 0;

	for (int i = 0; i < n - 1; i++) {
		if (len.second < line[i + 1].first) {
			ans += (len.second - len.first);
			len = line[i + 1];
		}
		else if (len.second < line[i + 1].second) {
			len.second = line[i + 1].second;
		}
	}
	ans += (len.second - len.first);
	printf("%d", ans);
}

배열을 벡터로 바꿔서 푼 코드

 

#include <iostream>
#include <utility>
#include <algorithm>
#include <vector>

using namespace std;

int n, x, y;

int main() {
	scanf("%d", &n);
	
	vector <pair<int, int>> line;

	for (int i = 0; i < n; i++) {
		scanf("%d%d", &x, &y);
		line.push_back(make_pair(x, y));
	}

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

	pair<int, int> len = line[0];
	int ans = 0;

	for (int i = 0; i < n - 1; i++) {
		if (len.second < line[i + 1].first) {
			ans += (len.second - len.first);
			len = line[i + 1];
		}
		else if (len.second < line[i + 1].second) {
			len.second = line[i + 1].second;
		}
	}
	ans += (len.second - len.first);
	printf("%d", ans);
}

결과를 보니까 벡터로 한 게 메모리는 두배 넘게(...) 잡아먹고 시간도 약간 더 걸렸는데

음... 일단 벡터로 바꾼 이유가

 

위의 배열로 짠 코드는 애초에 비주얼 스튜디오에서 돌아가지를 않는다!

int 배열의 경우 최대 크기가 25만인데 이 문제에서는 100만이 필요하므로..

문제 풀 때는 10만으로 줄여놓고 푼 다음에 제출만 100만으로 하긴 했는데

 

음 아무튼.. 근데 구글링해보니 의외로 벡터가 1억? 최대 크기가 길길래 벡터로 바꿔줬다

 

뭐 이것도 중요하긴 한데 가장 중요한건

이 문제에서 쓰인 알고리즘 스위핑 이다

구글링을 좀 해보니... 간단하게 말하면

"도형들을 일정 기준에 맞춰 정렬해 놓고 순서대로 훑는 것 (스캔하면서 마주치는 요소들에 대해 뭔가를 해준다)"

과 동치가 된다고 한다

 

이 문제에 대입해서 생각해 보면 이 문제는 2차원 도형(pair <int, int>) 를 first에 맞춰서 정렬해 놓고

순서대로 훑으며 (순서대로 벡터든 배열을 훑으며)

마주치는 요소들에 대해 뭔가를 해주는(len과 i+1의 요소를 어쩌구 저쩌구 해주는)

알고리즘을 사용했으므로 스위핑 알고리즘을 사용했다고 할 수 있겠다

 

알겠나??ㅎㅎ

 

나중에 이 문제도 풀어보자

www.acmicpc.net/problem/5419

 

5419번: 북서풍

각 테스트 케이스에 대해서, 북서풍을 타고 항해할 수 있는 섬의 쌍의 수를 출력한다.

www.acmicpc.net

 

이 문제는 세그먼트 트리에 대한 이해도 필요한 것으로 보임

'PS' 카테고리의 다른 글

[C++] 12015 : 가장 긴 증가하는 부분 수열 2  (0) 2021.02.12
[C++] 11053 : 가장 긴 증가하는 부분 수열  (0) 2021.02.12
[C++] 1764 : 듣보잡  (0) 2021.02.11
[C++] 1074 : Z  (0) 2021.02.11
[C++] 9663 : N-Queen  (0) 2021.02.06
Comments