Per ardua ad astra !
I'm On My Way
Per ardua ad astra !
전체 방문자
오늘
어제
  • 분류 전체보기 (126)
    • Algorithm (50)
      • 백준 (30)
      • SWEA (3)
      • JUNGOL (3)
      • Programmers (5)
      • LeetCode (2)
    • 안드로이드 개발 (6)
      • Java로 개발 (0)
      • Kotlin으로 개발 (3)
    • Spring (41)
      • Spring기본 (17)
      • JPA기본 (15)
      • JPA활용 SpringBoot 기본 (9)
      • API 개발 기본 (0)
    • 네트워크 (3)
    • 운영체제 (0)
    • Life (3)
      • 책 (0)
      • 자기계발 (1)
      • 일상 (2)
    • 노마드코더 (3)
      • python으로 웹 스크래퍼 만들기 (3)
    • 프로그래밍 언어 (17)
      • Java 기본 (2)
      • 코틀린 기본 (15)

블로그 메뉴

  • 홈
  • 방명록

인기 글

hELLO · Designed By 정상우.
Per ardua ad astra !

I'm On My Way

Algorithm/백준

[Java] BaekJoon 2533. 사회망 서비스(골드3) (DFS, DP)

2021. 9. 24. 00:33

문제출처: https://www.acmicpc.net/problem/2533

 

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

페이스북, 트위터, 카카오톡과 같은 사회망 서비스(SNS)가 널리 사용됨에 따라, 사회망을 통하여 사람들이 어떻게 새로운 아이디어를 받아들이게 되는가를 이해하는 문제가 중요해졌다. 사회망

www.acmicpc.net

 

문제이해

목표

N개의 친구관계로 이루어진 그래프 (1~N)
이 그래프는 최소 스패닝 트리(MST)로 모두 양방향 연결되어 있다.
조건: 얼리 아답터가 아닌 사람들은 자신의 모든 친구들이 얼리 아답터일 때만 이 아이디어를 받아들인다. 

이를 만족하면서 모든 개인이 새로운 아이디어를 수용할 수 있도록 필요한 최소 얼리어답터의 수 도출하여라

 

풀이

연결된 상태를 나태내는 인접리스트(adjList),

필요한 최소 얼리어답터의 수를 저장할 배열(dp[][])를 만든다.

 

dp의 정보는 다음과 같다.

dp[현재친구 번호][현재친구 얼리어답터 여부]  

 dfs로 탐색을 진행 할 건데, 조건을 먼저 확인해 보자.

 

먼저 우선적으로 

dp[now][1] = 1   => 현재 친구가 얼리어답터이기 때문에 얼리어답터 수 1로 초기화해준다.

dp[now][0] = 0   => 현재 친구가 얼리어답터가 아니기 때문에 얼리어답터 수 0으로 초기화해준다.

 

조건1에 따라, 

  • dp[now][0] 인경우 연결된 친구들이 모두 얼리어답터여야 한다. 
    dp[now][0] += for ( sum(dp[next][1]) )
  • dp[now][1] 인 경우 연결된 친구들이 얼리어답터여도 되고 아니어도 되기 때문에, 둘중 작은 값을 + 해준다.
    dp[now][1] += for ( Min(dp[next][0], dp[next][1]); )

소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class 사회망서비스 {
    private static int N;
    private static int[][] dp;
    private static ArrayList<Integer>[] adjList;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        // 본인이 얼리어답터이다. dp[][1]  => 주변친구가 얼리어답터이거나 아니다. 둘중에 더 작은값 채택
        // 본인이 얼리어답터가 아니다. dp[][0] => 주변모든 친구가 얼리어답터이다.
        N = Integer.parseInt(br.readLine());
        String[] strArr;
        dp = new int[N+1][2];
        // 인접리스트 만들기
        adjList = new ArrayList[N + 1];
        for (int i = 1; i <= N ; i++) {
            adjList[i] = new ArrayList<>();
        }
        for (int i = 0; i < N - 1; i++) {
            strArr = br.readLine().split(" ");
            int num1 = Integer.parseInt(strArr[0]);
            int num2 = Integer.parseInt(strArr[1]);
            adjList[num1].add(num2);
            adjList[num2].add(num1);
        }

        // 1부터 시작하여 최소 얼리어답터를 구하는 dfs구현
        getMinAdapter(1, 0);
        int answer = Math.min(dp[1][0], dp[1][1]);
        System.out.println(answer);
    }

    private static void getMinAdapter(int now, int parent) {
        dp[now][0] = 0;
        dp[now][1] = 1;

        for (Integer next : adjList[now]) {
            if(parent == next){
                continue;
            }
            getMinAdapter(next, now);
            dp[now][0] += dp[next][1];
            dp[now][1] += Math.min(dp[next][0], dp[next][1]);
        }
    }
}
    'Algorithm/백준' 카테고리의 다른 글
    • [Java] BaekJoon 14938. 서강그라운드 (골드4) (Dijkstra)
    • [Java] BaekJoon 1719. 택배(골드4) (dijkstra)
    • [Java] BaekJoon 1949. 우수마을(골드1) (DFS, DP)
    • [Java] BaekJoon 2176. 합리적인 이동경로(골드2) (Dijkstra,DP)
    Per ardua ad astra !
    Per ardua ad astra !
    개발자 지망생이며 열심히 공부하고 기억하기 위한 블로그입니다.

    티스토리툴바