반응형
리뷰
https://www.acmicpc.net/problem/2170
일 직선상으로 선을 긋고, 그려진 선(들)의 총 길이를 구하는 문제
우선순위 큐 혹은 정렬을 통해 구현할 수 있는 아주 간단한 문제이다.
전역 변수
- n : 선을 그은 횟수를 입력 받을 정수형 변수
- x, y : 그은 선의 시작점 x와 도착점 y를 표시하기 위한 정수형 변수
- Line : 각 선의 정보를 저장하기 위한 구조체, 우선 순위 큐 활용을 위해 내부에 cmp함수를 작성한다.
함수
없음
문제풀이
- 구조체 Line타입의 우선순위 큐 pq를 초기화 해준다.
- n값을 입력 받고, n개의 선의 정보를 입력 받아 pq에 push해준다.
- 끝 선의 위치를 저장할 변수 l을 -10억으로 초기화 해주고, 선의 길이를 저장할 변수 len을 0으로 초기화 한다.
- n개의 선을 순회하며 만약 현재 선의 x가 l보다 클 경우 l을 현재 선의 시작점으로 맞추어 준다.
- 현재 선의 y가 l보다 클 경우 그 차이만큼 len을 더해주고 l을 현재 선의 y로 맞추어 준다.
- 모든 탐색이 끝난 후 len에 저장되어 있는 값을 출력해 준다.
참고 사항
구조체로 정의하지 않고 pair<int, int>로 해도 된다.
큐에 선 정보를 모두 넣었으니 pq가 빌때까지 반복문을 실행해도 된다.
정답 코드
#include<iostream>
#include<queue>
using namespace std;
int n, x, y;
struct Line {
int x, y;
bool operator<(const Line& other) const {
if (x == other.x) return y < other.y;
return x > other.x;
}
};
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
priority_queue<Line> pq;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> x >> y;
pq.push({ x, y });
}
int l = -1000000000;
int len = 0;
for (int i = 0; i < n; i++) {
Line line = pq.top(); pq.pop();
if (l < line.x) l = line.x;
if (l < line.y) {
len += line.y - l;
l = line.y;
}
}
cout << len;
}
728x90
반응형
'알고리즘 공부 > C++' 카테고리의 다른 글
[S1] 백준 17615번 볼 모으기 C++ 그리디 알고리즘 (1) | 2024.10.28 |
---|---|
[S1] 백준 1446번 지름길 C++ 다익스트라, 최단 경로 (0) | 2024.10.28 |
[D5] 백준 18185번 라면 사기(Small) C++ 그리디 알고리즘 (0) | 2024.10.26 |
[L3] 프로그래머스 단어 변환 C++ 백트래킹, 완전 탐색 (0) | 2024.10.26 |
[L2] 프로그래머스 게임 맵 최단거리 C++ 너비 우선 탐색, BFS (0) | 2024.10.26 |