[백준] 14595번 동방 프로젝트 (Large) (C++)

2025. 12. 23. 19:30·Algorithm
728x90

https://www.acmicpc.net/problem/14595

 

 

이 문제는 N개의 방이 일렬로 나열되어 있을때 M개의 방의 관계가 주어지면

그 방은 하나의 방으로 간주할때 남은 방의 개수를 구하는 문제이다.

 

문제만 보면 굉장히 쉽게 유니온 파인드 알고리즘을 사용하여 M만큼 반복하여 마지막에 개수를 판별하면 되지 않을까 생각해서 구현을 했지만

 

시간초과를 받은 문제였다.

 

따라서 이미 합쳤던 방은 다시 반복하지 않은 방식을 사용하여 방을 바꿨던 곳의 최댓값을 갱신하여 반복하는 식으로 하였다.

 

 

M의 배열을 입력받고 이 배열을 정렬시켜 유니온파인드를 사용하여 반복하였다.

 

이때 정렬한 이유는 시작값을 오름차순으로 정렬하기 위해 정렬하였고

 

이후 lo라는 변수를 사용하여 최댓값을 갱신하여 반복하였다.

 

정답코드

 

#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
#define endl "\n"

const int INF = 1e9;
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
int N, M;
int unf[1000001];
vector<pii> v;

int Find(int a) {
    if(a == unf[a]) return a;
    return unf[a] = Find(unf[a]);
}

void Union(int a, int b) {
    a = Find(a);
    b = Find(b);

    if(a > b) unf[a] = b;
    else unf[b] = a;
}

bool isUnion(int a, int b) {
    a = Find(a);
    b = Find(b);

    if(a == b) return true;
    else return false;
}

void Init() {
    for(int i = 1; i <= N; i++) {
        unf[i] = i;
    }
}

void solve() {
    sort(v.begin(), v.end());

    int lo = 0;

    for(auto it : v) {
        int left = it.first;
        int right = it.second;

        lo = max(lo, left);

        for(int i = lo; i <= right; i++) {
            if(!isUnion(lo, i)) {
                Union(lo, i);
            }
        }

        lo = max(lo, right);
    }

    set<int> st;

    for(int i = 1; i <= N; i++) {
        st.insert(Find(i));
    }

    cout << st.size();
}

void input() {
    cin >> N >> M;

    for(int i = 0; i < M; i++) {
        int a, b;
        cin >> a >> b;
        v.push_back({a, b});
    }

    Init();
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

    input();
    solve();
}

 

728x90
저작자표시 (새창열림)

'Algorithm' 카테고리의 다른 글

[백준] 18513번 샘터 (C++)  (0) 2025.12.25
[백준] 1520번 내리막 길 (C++)  (0) 2025.12.24
[백준] 14925번 목장 건설하기 (C++)  (0) 2025.12.22
[백준] 20303번 할로윈의 양아치 (C++)  (0) 2025.12.21
[백준] 1826번 연료 채우기 (C++)  (0) 2025.12.03
'Algorithm' 카테고리의 다른 글
  • [백준] 18513번 샘터 (C++)
  • [백준] 1520번 내리막 길 (C++)
  • [백준] 14925번 목장 건설하기 (C++)
  • [백준] 20303번 할로윈의 양아치 (C++)
쿨쿨.
쿨쿨.
  • 쿨쿨.
    All of the life
    쿨쿨.
  • 전체
    오늘
    어제
    • 분류 전체보기 (279) N
      • Programming (47)
        • C, C++ (18)
        • Python (6)
        • Java (1)
        • HTML,CSS,JS (3)
        • SQL(DB) (13)
        • SpringBoot (3)
        • Android (2)
        • CI,CD (1)
      • Algorithm (173)
        • Review (4)
      • Security (14)
        • WebHacking (3)
        • Websecurity (11)
      • OS (19)
        • Linux (12)
        • Mac os (2)
      • 머신러닝 (1)
      • CS(Computer Science) (12)
        • 컴퓨터 네트워크 (3)
        • 컴퓨터 구조 (1)
        • 인공지능 (8)
      • Docker (1)
      • Dev Book Review (3)
        • Clean Code (1)
        • Effective Java (0)
        • Real MySQL (2)
      • SWM (1)
      • Review (6) N
      • AWS (2)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    c언어
    Leviathan
    정렬
    재귀
    누적합
    Bandit
    wargame
    DFS
    다익스트라
    우선순위 큐
    구현
    DP
    백트래킹
    브루트포스
    깊이우선탐색
    백준
    트리
    우선순위큐
    투포인터
    비트마스킹
    그래프 이론
    BFS
    linux
    에라토스테네스의 체
    WebSecurity
    이분탐색
    다이나믹 프로그래밍
    시뮬레이션
    그리디
    코딩
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.6
쿨쿨.
[백준] 14595번 동방 프로젝트 (Large) (C++)
상단으로

티스토리툴바