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
- 삼성
- D1
- 크로스핏
- BOJ
- 26008
- Flutter
- 그리디
- Python
- 재귀함수
- C++
- sw expert academy
- 브루트포스
- 서울에서경산까지
- 15662
- 스택
- Crossfit
- 백준
- 4811
- DP
- 회전하는큐
- BOJ14889
- 1781
- dart
- 14863
- 15353
- spring boot
- 재귀
- 해시해킹
- 동적프로그래밍
- 1로만들기2
Archives
- Today
- Total
곧죽어도 콛잉
[구현 / BOJ 2170 / C++] 선긋기 본문
https://www.acmicpc.net/problem/2170
2170번: 선 긋기
첫째 줄에 선을 그은 횟수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 다음 N개의 줄에는 선을 그을 때 선택한 두 점의 위치 x, y (-1,000,000,000 ≤ x < y ≤ 1,000,000,000)가 주어진다.
www.acmicpc.net
이 문제는 어렵게 접근하면 한도 끝도 없이 어려워진다..
단순하게 시각화해서 문제를 해결해보자!
우선 도화지에 선분을 그어보자.
최종적으로 겹치는 곳을 제외한 선분의 합만 구하면 끝이다!
즉, 우리가 주목해야할 것은 시작점과 끝점이다.
만약 새로 그은 선분의 시작점(ns)이 원래 그어져있는 시작점(bs)과 끝점(be) 사이에 있고,
새로 그은 선분의 끝점(ne)이 원래 그어져 있는 끝점(be)보다 멀리 있다면,
선분의 총 길이는 ne에서 bs를 뺀 값이 된다.
이것을 응용해서 해결해보자!
#include <bits/stdc++.h>
using namespace std;
long long n, x, y, res, bs, be;
vector<pair<long long, long long>> v;
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> n;
while(n--){
cin >> x >> y;
v.push_back({x, y});
}
sort(v.begin(), v.end());
bs = v[0].first;
be = v[0].second;
for(auto i : v){
long long ns = i.first;
long long ne = i.second;
if(bs <= ns && ns <= be && be <= ne){ // bs x be y 일때
be = ne; // 끝점 업데이트
}else if (be <= ns){ // bs be x y일때
res += (be-bs);
bs=ns;
be=ne;
}
}
res+=be-bs;
cout << res << "\n";
}
'Coding Test > C++' 카테고리의 다른 글
[구현 / BOJ 17822 / C++] 원판 돌리기 (0) | 2023.07.14 |
---|---|
[이분탐색 / BOJ 2343 / C++] 기타레슨 (0) | 2023.07.12 |
[구현 / BOJ 15683 / C++] 감시 (0) | 2023.07.11 |
[구현 / BOJ 16236 / C++] 아기상어 (0) | 2023.07.11 |
[구현 / BOJ 15662 / C++] 톱니바퀴 (2) (0) | 2023.06.29 |
Comments