이 영역을 누르면 첫 페이지로 이동
Arc 블로그의 첫 페이지로 이동

Arc

페이지 맨 위로 올라가기

Arc

[Baekjoon] 2533: 사회망 서비스(SNS)

  • 2023.03.02 17:22
  • Algorithm/PS
글 작성자: SeoArc

문제

문제가 조금 복잡하다.

간단히 설명하자면, 주변의 모든 친구가 얼리어답터이면 자신은 얼리어답터가 될 필요가 없는데, 이때 최소 얼리어답터의 수를 구하는 것이다.

 

풀이

대표 풀이

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

public class Q2533 {

    private static List<List<Integer>> graph;
    private static int[][] dp;
    private static boolean[] visited;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        graph = new ArrayList<>();
        int n = Integer.parseInt(br.readLine());
        dp = new int[1000001][2];
        visited = new boolean[1000001];

        for (int i = 0; i <= n; i++) {
            graph.add(new ArrayList<>());
        }

        for (int i = 1; i < n; i++) {
            String[] uv = br.readLine().split(" ");
            int u = Integer.parseInt(uv[0]);
            int v = Integer.parseInt(uv[1]);
            graph.get(u).add(v);
            graph.get(v).add(u);
        }

        search(1);
        System.out.println(Math.min(dp[1][0], dp[1][1]));
    }

    public static void search(int curIndex) {
        visited[curIndex] = true;
        dp[curIndex][0] = 1;
        List<Integer> cur = graph.get(curIndex);

        for (int child : cur) {
            if (visited[child]) {
                continue;
            }

            search(child);

            dp[curIndex][1] += dp[child][0];
            dp[curIndex][0] += Math.min(dp[child][1], dp[child][0]);
        }
    }
}

계속 고민해도 답이 나오지 않아서, 다른 풀이의 힘을 빌렸다.

아이디어는 서브트리부터, 즉 리프노드부터 시작하여, 해당 노드가 얼리어답터인 경우와 얼리어답터가 아닌 경우를 나누어 주변 얼리 어답터의 최소 개수를 dp에 계속 메모이제이션 해나가는 것이다.

 

회고

역시 dp문제는 접근법을 생각해내지 못하면 풀이가 너무 어려운 것 같다.

dp문제에 익숙해지기 위해 좀 더 많은 풀이를 해봐야 될 것 같다.

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

[Baekjoon] 1167: 트리의 지름  (0) 2023.03.08
[Baekjoon] 7662: 이중 우선순위 큐  (0) 2023.03.08
[Baekjoon] 1655: 가운데를 말해요  (0) 2023.03.02
[Baekjoon] 2170: 선 긋기  (0) 2023.03.02
[Baekjoon] 9935: 문자열 폭발  (2) 2023.03.02

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [Baekjoon] 1167: 트리의 지름

    [Baekjoon] 1167: 트리의 지름

    2023.03.08
  • [Baekjoon] 7662: 이중 우선순위 큐

    [Baekjoon] 7662: 이중 우선순위 큐

    2023.03.08
  • [Baekjoon] 1655: 가운데를 말해요

    [Baekjoon] 1655: 가운데를 말해요

    2023.03.02
  • [Baekjoon] 2170: 선 긋기

    [Baekjoon] 2170: 선 긋기

    2023.03.02
다른 글 더 둘러보기

정보

Arc 블로그의 첫 페이지로 이동

Arc

  • Arc의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록

카테고리

  • 분류 전체보기 (106)
    • Language (28)
      • C++ (0)
      • C# (0)
      • Java (28)
    • Algorithm (47)
      • Algorithm (15)
      • Data Structure (6)
      • PS (26)
    • Computer Science (22)
      • Design Pattern (1)
      • Network (14)
      • OS (7)
    • Game (0)
      • Unity (0)
    • Backend (3)
      • Spring (1)
      • JPA (2)
    • DB (0)
      • SQL (0)
    • DevOps (2)
      • AWS (0)
      • Docker (2)
      • Jenkins (0)
      • Nginx (0)
    • Software Engineering (4)
      • OOP (4)
    • AI (0)
      • Machine Learning (0)
    • Others (0)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • 그래프
  • java
  • algorithm
  • 네트워크
  • 알고리즘
  • network
  • 자바
  • graph

나의 외부 링크

정보

SeoArc의 Arc

Arc

SeoArc

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © SeoArc. Designed by Fraccino.

티스토리툴바