Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- C++ 1918
- 백트래킹
- 조합론
- 투포인터
- 문자열
- C++ 1937
- 알고리즘
- 조합
- C++1167
- 순열
- C++1967
- LIS
- 다익스트라
- DP
- c언어
- BFS
- 백준 숨바꼭질5
- 인덱스 트리
- 소트 게임
- DFS
- C++ 17071
- 위상정렬
- 프로그래머스
- C++
- 16933
- 백준
- Backtracking
- 가장 긴 증가하는 부분 수열
- 백준 17071
- strtok
Archives
- Today
- Total
블로그
[C++] 2170 : 선 긋기 본문
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의 요소를 어쩌구 저쩌구 해주는)
알고리즘을 사용했으므로 스위핑 알고리즘을 사용했다고 할 수 있겠다
알겠나??ㅎㅎ
나중에 이 문제도 풀어보자
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