[백준] 1766번 문제집 (C++)

2025. 8. 13. 13:19·Algorithm
728x90

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

 

 

이 문제는 그래프의 선행 관계가 주어졌을때 3가지 조건을 고려하여 문제푸는 순서를 출력하는 문제이다.

 

1. N개의 문제를 다 풀어야 함

2. 먼저 푸는 것이 좋은 문제가 있으면, 먼저 푸는 것이 좋은 문제를 반드시 먼저 풀어야 함

(4 2)와 같은 관계가 주어졌을 때 4먼저 풀고 2를 풀어야함

3. 가능하면 쉬운 문제부터 풀어야한다.(가장 낮은 값 먼저 풀어야함)

 

 

따라서 방향 비순환그래프가 성립이 되기 때문에 위상정렬을 사용하여 순서들을 뽑아낸다 

이때 위상정렬을 수행할때 자료구조를 보통 큐를 사용하여 선입 선출구조를 만들어 내는데

 

이 문제에서는 가장 낮은 숫자를 먼저 푸는것이 이득이므로 최소힙을 사용하여 낮은 순서부터 푸는 관계를 만든다.

 

정답 코드

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

struct coordinate {
    int x;
    string s;
    vector<int> v;
};

int dx[] = {-1, 0, 1, 0, 1, -1, -1, 1};
int dy[] = {0, 1, 0, -1, -1, 1, -1, 1};
int N, M;
int isDegree[32001];
bool visited[32001];
vector<vector<int>> v(32001);

void solve() {
    priority_queue<int, vector<int>, greater<int>> pq;
    vector<int> tmp;

    for(int i = 1; i <= N; i++) {
        if(isDegree[i] == 0) {
            pq.push(i);
        }
    }

    while(!pq.empty()) {
        int x = pq.top();
        tmp.push_back(x);
        pq.pop();

        for(auto it : v[x]) {
            if(--isDegree[it] == 0) {
                pq.push(it);
            }
        }
    }

    for(auto it : tmp) {
        cout << it << " ";
    }
}

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

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

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

    input();
    solve();
}

 

 

회고록

처음엔 방문배열을 사용하여 구현을 했는데 4퍼에서 틀리고 질문 게시판을 보니 최소힙 관련 내용이 있어서

바로 감을 잡고 풀었다...

가장 낮은 문제를 푸는것의 문구를 보고 최소힙을 생각해낸다면 쉽게 풀 수 있는 문제라고 생각이든다.

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

'Algorithm' 카테고리의 다른 글

[백준] 22865번 가장 먼 곳 (C++)  (0) 2025.08.15
[백준] 16940번 BFS 스페셜 저지 (C++)  (0) 2025.08.14
[백준] 20955번 민서의 응급 수술 (C++)  (0) 2025.08.12
[백준] 15900번 나무탈출 (C++)  (0) 2025.08.11
[백준] 1726번 로봇 (C++)  (0) 2025.08.10
'Algorithm' 카테고리의 다른 글
  • [백준] 22865번 가장 먼 곳 (C++)
  • [백준] 16940번 BFS 스페셜 저지 (C++)
  • [백준] 20955번 민서의 응급 수술 (C++)
  • [백준] 15900번 나무탈출 (C++)
쿨쿨.
쿨쿨.
  • 쿨쿨.
    All of the life
    쿨쿨.
  • 전체
    오늘
    어제
    • 분류 전체보기 (287) N
      • Programming (54) N
        • C, C++ (18)
        • Python (6)
        • Java (1)
        • HTML,CSS,JS (3)
        • SQL(DB) (13)
        • SpringBoot (10) N
        • 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 (2)
      • Dev Book Review (3)
        • Clean Code (1)
        • Effective Java (0)
        • Real MySQL (2)
      • SWM (1)
      • Review (6)
      • AWS (2)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.6
쿨쿨.
[백준] 1766번 문제집 (C++)
상단으로

티스토리툴바