사회망 서비스(SNS)(백준_2533)

2023. 2. 19. 12:54·BackEnd/알고리즘 공부

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

 

2533번: 사회망 서비스(SNS)

첫 번째 줄에는 친구 관계 트리의 정점 개수 N이 주어진다. 단, 2 ≤ N ≤ 1,000,000이며, 각 정점은 1부터 N까지 일련번호로 표현된다. 두 번째 줄부터 N-1개의 줄에는 각 줄마다 친구 관계 트리의 에

www.acmicpc.net

 

문제 설명

  • 새로운 아이디어를 먼저 받아들인 사람을 얼리아답터라고 한다.
  • 사회망 서비스에 속한 사람은 얼리 아답터 일수도 있고 아닐 수 도 있다.
  • 얼리 아답터가 아닌 사람은 자신과 친구 즉 연결되어 있는 사람한테 정보를 받을 수 있다.
  • 최소한 수의 얼리 아답터를 확보하여 모든 사람이 아이디어를 받아들이게 하자!!
  • 이때, 친구 관계 그래프는 트리이다.

문제의 예시처럼 2,3,4 가 얼리 어답터라면 1,5,6,7,8은 모두 정보를 얻을 수 있다.

 

문제에 대한 설명

이 문제를 제일 처음 봤을 때는 parent를 이용해서 풀어보자라고 생각했다.

왜냐하면 parent가 얼리 아답터인 경우 자신의 자식과 부모는 모두 정보를 얻을 수 있기 때문이다.

  • BFS로 자신의 부모 찾기
  • 부모의 수 count 
  • 만약 부모가 1인 경우는 자신의 자식이 얼리 아답터인지 체크하고 빼준다. 
  • 자식 중에 얼리 아답터가 여러명 이면 얼리 아답터가 아니어도 정보 전달이 가능한 경우는 빼줘야 한다. 

결과는 틀렸다 ㅜㅜ

 

문제점 살펴보기

왜 틀렸는지 고민을 해보니 1번이 얼리 아답터인 경우도 존재한다. 최소의 얼리 아답터의 경우의 수가 하나가 아니라는 것이다. 이런 문제는 DP를 사용해야 한다. 점화식을 사용해 모든 가능한 요소들을 조사해 보고 그중 최소를 선택해야 한다,

 

DP를 이용해서 풀기

DP는 언제나 점화식을 잘 짜야 한다!!

여기서는 DP 배열을 얼리 아답터가 아닌 경우와 얼리 아답터인 경우로 생각한다.

예를 들어 dp[][]이런 배열이 있을 때, dp[1][0]은 1이 얼리 아답터가 아닌 경우 dp[1][1]은 얼리 아답터인 경우이다.

그 후 조건을 생각해 본다.

  • dp[n][0] : 자신이 얼리 아답터가 아닌 경우는 그 의 자식이 얼리 아답터여야 한다.
dp[parent][0] += dp[child][1]
  • dp[n][1] : 자신이 얼리 아답터인 경우는 자식이 얼리 아답터 여도 되고 아니어도 된다.
dp[parent][1] += Math.min(dp[child][0], dp[child][1])

이렇게 점화식을 세워 볼 수 있다.

 

구현

static ArrayList<Integer> ar[]; // 트리를 저장할 ArrayList
static int dp[][]; // dp 배열
static boolean visited[]; // visited 배열
  • Main
public static void main(String []args) throws IOException {
    BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
    int n = Integer.parseInt(buf.readLine());
    StringTokenizer st;
    ar = new ArrayList[n + 1];
    dp = new int[n+1][2];
    visited = new boolean[n + 1];
    for (int i = 1; i <= n; ++i) {
        ar[i] = new ArrayList<>();
    }
    //트리 만들기
    for (int i = 0; i < n - 1; ++i) {
        st = new StringTokenizer(buf.readLine());
        int u = Integer.parseInt(st.nextToken());
        int v = Integer.parseInt(st.nextToken());
        ar[u].add(v);
        ar[v].add(u);
    }
    DFS(1);
    //둘중 최소를 출력한다.
    System.out.println(Math.min(dp[1][0],dp[1][1]));
}
  • DFS
public static void DFS(int start){
    visited[start] = true;
    dp[start][0] = 0; //처음은 0
    dp[start][1] = 1; //처음이 얼리 아답터라면 1
    for(int i =0; i<ar[start].size(); ++i){
        int next = ar[start].get(i); //자식
        if(visited[next]) continue; 
        DFS(next); // 자식으로 먼저 내려가기 즉 리프 노드부터 처리하면서 올라온다.
        dp[start][0] += dp[next][1]; //얼리 아답터인 경우
        dp[start][1] += Math.min(dp[next][0],dp[next][1]); // 얼리 아답터가 아닌 경우
    }
}

https://github.com/Heron-Woong/CodingTest_Practice/commit/d7751ef0caa1db4d42489d721fe41a4846b2b33c

 

백준_2533, 사회망 서비스(SNS) · Heron-Woong/CodingTest_Practice@d7751ef

Showing 1 changed file with 43 additions and 0 deletions.

github.com

 

'BackEnd > 알고리즘 공부' 카테고리의 다른 글

등산코스 정하기(프로그래머스) JAVA  (0) 2023.02.22
운동(백준_1956)  (0) 2023.02.22
선분 교차 2(백준_17387)  (0) 2023.02.18
가장 긴 증가하는 부분 수열 5(백준_14003)  (0) 2023.02.15
욕심쟁이 판다(백준_1937)  (0) 2023.02.14
'BackEnd/알고리즘 공부' 카테고리의 다른 글
  • 등산코스 정하기(프로그래머스) JAVA
  • 운동(백준_1956)
  • 선분 교차 2(백준_17387)
  • 가장 긴 증가하는 부분 수열 5(백준_14003)
인프라 감자
인프라 감자
  • 인프라 감자
    삶은 인프라
    인프라 감자
  • 전체
    오늘
    어제
    • 분류 전체보기 (243)
      • 클라우드&인프라 (28)
        • 인프라 공부 (4)
        • AWS 구조와 서비스 (18)
        • 클라우드 공부 (4)
        • Terraform (2)
      • AWS Cloud School (13)
        • project (5)
        • Linux, Network (6)
        • Docker (2)
      • BackEnd (162)
        • JAVA 공부 (15)
        • 알고리즘 공부 (71)
        • MySQL 문제 풀기 (8)
        • 스프링 핵심 원리 - 기본편 (18)
        • 스프링 MVC 1편 (4)
        • 자바 ORM 표준 JPA 프로그래밍 (21)
        • 실전! 스프링 부트와 JPA 활용1 (8)
        • 실전! 스프링 부트와 JPA 활용2 (5)
        • 스프링 데이터 JPA (8)
        • Querydsl (4)
      • 혼자하는 프로젝트 (32)
        • 배달의 민족 클론코딩 (7)
        • 나만의 프로젝트 (10)
        • 스프링 부트로 구현한 웹 (15)
  • 블로그 메뉴

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

    • Email
    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    완전탐색
    정렬
    쿼드 압축
    자동 배포
    linux
    dp
    백트래킹
    조합
    VPN
    스프링 핵심 원리-기본편
    중첩 선언
    프로그래머스
    네트워크 기본 용어
    디팬스 게임
    자바
    이것이 자바다
    상속
    querydsl
    유니온 파인드
    다이나믹 프로그래밍
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
인프라 감자
사회망 서비스(SNS)(백준_2533)
상단으로

티스토리툴바