길민호(ethan.mino)
코딩수첩
길민호(ethan.mino)
전체 방문자
오늘
어제
  • 분류 전체보기 (215)
    • Computer Science (0)
    • Web (6)
      • CSS (0)
      • HTML (0)
    • Node.js (0)
    • Javascript (2)
    • Java (46)
      • Spring (27)
      • Jsp (0)
    • C\C++ (2)
    • Programming (0)
    • AI (0)
    • Database (7)
    • Git (5)
    • Algorithm (119)
      • Stack (0)
      • Queue (0)
      • Linked List (0)
      • Sort (0)
      • Simulation (27)
      • Recursion (0)
      • Backtracking (4)
      • Two Pointer (3)
      • Dynamic Programming (19)
      • Greedy (10)
      • Graph (3)
      • Dijkstra (1)
      • BFS\DFS (8)
      • Floyd (1)
      • MST (4)
      • Tree (4)
      • Binary Search (8)
      • Binary Search Tree (4)
    • IntelliJ (4)
    • Vscode (0)
    • Operating System (0)
    • 후기 (3)
    • 성장일지 (13)
    • 스터디 (7)
    • 설치 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • ㅡ

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
길민호(ethan.mino)

코딩수첩

[백준 2617번] 구슬 찾기 (C++)
Algorithm/Graph

[백준 2617번] 구슬 찾기 (C++)

2022. 6. 3. 17:10

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

 

2617번: 구슬 찾기

모양은 같으나, 무게가 모두 다른 N개의 구슬이 있다. N은 홀수이며, 구슬에는 번호가 1,2,...,N으로 붙어 있다. 이 구슬 중에서 무게가 전체의 중간인 (무게 순서로 (N+1)/2번째) 구슬을 찾기 위해서

www.acmicpc.net


구슬 찾기 문제는 그래프로 해결할 수 있습니다. 

 

무게가 중앙값이 될 수 없는 구슬을 찾는 문제입니다. 

따라서, 무게가 중앙값인 구슬은 본인보다 가벼운 구슬이 (n - 1) / 2개, 무거운 구슬이 (n - 1) / 2개 있어야 합니다.

따라서, 가벼운 구슬이 (n - 1) / 2개보다 많거나, 무거운 구슬이 (n - 1) / 2개보다 많은 구슬은 무게가 중앙값이 될 수 없습니다.

무게의 대소 비교는 그래프로 표현할 수 있습니다.

아래 그래프에서, (u, v)를 연결하는 엣지는 무게가 u < v임을 나타냅니다.

각 정점에서 BFS를 수행하면, 해당 구슬보다 무게가 무거운 구슬의 개수를 구할 수 있습니다.

아래 그래프에서, (u, v)를 연결하는 엣지는 무게가 u > v임을 나타냅니다.

각 정점에서 BFS를 수행하면, 해당 구슬보다 무게가 가벼운 구슬의 개수를 구할 수 있습니다.

아래는 전체 코드입니다.

#include <bits/stdc++.h>
using namespace std;

#define MAX 100
int vis[MAX];

int bfs(vector<vector<int>> linked, int st){    // st 정점에서 출발했을 때, 방문 가능한 정점의 개수를 반환하는 함수 
    fill(vis, vis + MAX, 0);
    queue<int> q;
    vis[st] = 1;
    q.push(st);

    int cnt = 0;
    while(!q.empty()){
        int cur = q.front(); q.pop();
        for(auto nxt : linked[cur]){
            if(vis[nxt] != 0) continue;
            q.push(nxt);
            vis[nxt] = 1;
            cnt++;
        }
    }
    return cnt;
}

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

    int n, m; cin >> n >> m;
    
    vector<vector<int>> in(n + 1);  // (u, v)를 연결하는 엣지는 무게가 u > v임을 나타내는 그래프
    vector<vector<int>> out(n + 1); // (u, v)를 연결하는 엣지는 무게가 u < v임을 나타내는 그래프

    while(m--){
        int u, v; cin >> u >> v;
        in[u].push_back(v);
        out[v].push_back(u);
    }

    int ans = 0;
    
    for(int st = 1; st <= n; st++){ // 각 구슬에 대해 무거운 구슬과 가벼운 구슬의 개수를 구함
        int big = bfs(out, st); // 무거운 구슬의 개수
        int small = bfs(in, st);    // 가벼운 구슬의 개수

        // 무거운 구슬 또는 가벼운 구슬의 개수가 (n - 1)/2보다 많다면 무게가 중앙값인 구슬이 될 수 없음
        if(big > ((n - 1)/2) || small > ((n - 1)/2)) ans++; 
    }

    cout << ans << "\n";
}

 

아래는 문제 풀이에 사용된 테스트케이스입니다.

5 4
1 2
2 3
3 4
4 5
-> 4

4 3
1 2
2 3
3 4
-> 4

'Algorithm > Graph' 카테고리의 다른 글

[백준 1043번] 거짓말 (C++)  (0) 2022.06.03
[백준 1707번] 이분 그래프 (C++)  (0) 2022.06.03
    'Algorithm/Graph' 카테고리의 다른 글
    • [백준 1043번] 거짓말 (C++)
    • [백준 1707번] 이분 그래프 (C++)
    길민호(ethan.mino)
    길민호(ethan.mino)
    💻 호기심 많은 서버 개발자 길민호입니다.

    티스토리툴바