[백준] 2170번 선 긋기

2025. 2. 26. 18:33·백준 문제/그리디

문제: 2170번: 선 긋기

basic-algo-lecture/workbook/0x11.md at master · encrypted-def/basic-algo-lecture

 

basic-algo-lecture/workbook/0x11.md at master · encrypted-def/basic-algo-lecture

바킹독의 실전 알고리즘 강의 자료. Contribute to encrypted-def/basic-algo-lecture development by creating an account on GitHub.

github.com

 

#include <bits/stdc++.h>

using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int n;
    cin >> n;
    vector<pair<long long, long long>> lines(n);
    for (int i = 0; i < n; i++) {
        long long x1, x2;
        cin >> x1 >> x2;

        // first 가 항상 second 보다 작도록 설정
        if (x1 > x2)
            swap(x1, x2);

        lines[i] = { x1, x2 };
    }
    // 오름차순 정렬
    sort(lines.begin(), lines.end());

    long long sum = lines[0].second - lines[0].first; // 초기값 설정
    long long prevSec = lines[0].second;
    for (int i = 1; i < n; i++) {
        // 만약 이전 second 값이 현재 first 값보다 크다면 좌표를 (prevSec, curSecond) 로 생각하기
        if (prevSec > lines[i].first) {
            int dist = lines[i].second - prevSec;
            sum += dist > 0 ? dist : 0;
        }
        else {
            // 그게 아니면 좌표를 그냥 원래의 값으로 생각하기
            sum += lines[i].second - lines[i].first;
        }
        // 갱신
        if (prevSec < lines[i].second)
            prevSec = lines[i].second;
    }
    cout << sum;

    return 0;
}

 

입력으로 x1, x2 값이 들어온다. 항상 x1 의 값을 x2 의 값보다 작도록 설정해야 문제를 쉽게 해결할 수 있다. 그래서 만약 x1 의 값이 x2 보다 크다면 swap 하도록 했다.

 

이렇게 vector 에 값을 채운 후에는 first 값을 기준으로 오름차순 정렬한다. 나는 그리디 문제를 풀 때마다 어느 한 부분을 아예 고려 선상에서 제거해버리는 식이다. 이 문제에서는 first 값을 기준으로 오름차순 정렬하여 이를 고려 선상에서 제거해버리도록 했다. 현재의 first 값은 다음의 first 값보다 항상 작게 만든것이다.

 

그러면 이제 고려해야 하는 사항이 줄어들었다. 이제는 second 값을 기준으로 문제를 해결하면 된다. prevSec 이라는 변수를 하나 만들어서 이전 second 값을 저장하도록 한다. 근데 아무 second 값이나 저장할 수 있는 것은 아니고 지금까지 나온 second 값 중에 가장 큰 값이 저장되어야 한다.

 

만약 prevSec 값이 현재의 first 값보다 크다면 좌표를 (prevSec, curSecond) 라고 생각하면 편하다. curSecond - prevSec 한 값은 저절로 중복되는 부분의 길이를 제한것과 같다. 근데 이 값이 음수일 때는 더하면 안 되니까 삼항연산자로 걸러내었다.

 

prevSec 값이 현재의 first 값보다 크지 않다면 그냥 좌표를 원래의 좌표로 생각하면 된다. 그러면 해당 선분의 길이는 그냥 curSecond - curFirst 이다. 이렇게 sum 변수에 매 반복문마다 dist 를 더해주면 된다.

 

다음 for 문으로 넘어가기 전에 만약 현재의 second 값이 prevSec 값보다 크다면 갱신해주도록 했다.

 

마지막에 sum 을 출력해주면 문제 해결 ~_~!!

 

 

'백준 문제/그리디' 카테고리의 다른 글
  • [백준] 1461번 도서관
  • [백준] 1700번 멀티탭 스케줄링
  • [백준] 15903번 카드 합체 놀이
  • [백준] 2847번 게임을 만든 동준이
dubu0721
dubu0721
dubu0721 님의 블로그 입니다.
  • dubu0721
    dubu0721 님의 블로그
    dubu0721
  • 전체
    오늘
    어제
    • 분류 전체보기 (334)
      • 프로그래밍언어론 정리 (0)
      • 컴퓨터네트워크 정리 (5)
      • 알고리즘&자료구조 공부 (64)
        • it 취업을 위한 알고리즘 문제풀이 입문 강의 (60)
        • 학교 알고리즘 수업 (3)
        • 실전프로젝트I (0)
      • 백준 문제 (193)
        • 이분탐색 (7)
        • 투포인트 (10)
        • 그래프 (7)
        • 그리디 (24)
        • DP (25)
        • BFS (15)
        • MST (7)
        • KMP (4)
        • Dijkstra (3)
        • Disjoints Set (4)
        • Bellman-Ford (2)
        • 시뮬레이션 (3)
        • 백트래킹 (15)
        • 위상정렬 (5)
        • 자료구조 (25)
        • 기하학 (1)
        • 정렬 (11)
        • 구현 (8)
        • 재귀 (8)
        • 수학 (8)
      • 유니티 공부 (11)
        • 레트로의 유니티 게임 프로그래밍 에센스 (11)
        • 유니티 스터디 자료 (0)
        • C# 공부 (0)
      • 유니티 프로젝트 (48)
        • 케이크게임 (13)
        • 점토게임 (35)
      • 언리얼 공부 (10)
        • 이득우의 언리얼 프로그래밍 (10)
      • 진로 (1)
      • 논문 읽기 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    재귀
    해시
    언리얼
    정렬
    티스토리챌린지
    BFS
    백준
    스택
    유니티
    그리디
    맵
    그래프
    dp
    유니티 프로젝트
    이벤트 트리거
    레트로의 유니티 프로그래밍
    이분탐색
    이득우
    골드메탈
    바킹독
    백트래킹
    유니티 공부 정리
    큐
    자료구조
    오블완
    수학
    투포인터
    C#
    시뮬레이션
    우선순위큐
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
dubu0721
[백준] 2170번 선 긋기
상단으로

티스토리툴바