코딍코딍
코딩기록
코딍코딍
전체 방문자
오늘
어제
  • 분류 전체보기 (271)
    • 개발 (2)
    • Java (1)
    • 스프링 (28)
    • JPA (11)
    • Git (3)
    • 알고리즘 (160)
      • 백준 (132)
      • 프로그래머스 (8)
      • SWEA (20)
    • 토이 프로젝트 (14)
      • 간단한 Springboot CRUD (1)
      • 게시판 프로젝트 (13)
    • 알고리즘 개념정리 (8)
    • 오류 해결 (13)
    • 보류 (0)
    • AWS (5)
    • 트러블 슈팅 (0)
    • 회고 (3)
    • CS (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

최근 글

티스토리

hELLO · Designed By 정상우.
코딍코딍

코딩기록

알고리즘/백준

5567번 : 결혼식

2023. 8. 11. 16:03

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

 

5567번: 결혼식

예제 1의 경우 2와 3은 상근이의 친구이다. 또, 3과 4는 친구이기 때문에, 4는 상근이의 친구의 친구이다. 5와 6은 친구도 아니고, 친구의 친구도 아니다. 따라서 2, 3, 4 3명의 친구를 결혼식에 초대

www.acmicpc.net

 

문제

상근이는 자신의 결혼식에 학교 동기 중 자신의 친구와 친구의 친구를 초대하기로 했다. 상근이의 동기는 모두 N명이고, 이 학생들의 학번은 모두 1부터 N까지이다. 상근이의 학번은 1이다.

상근이는 동기들의 친구 관계를 모두 조사한 리스트를 가지고 있다. 이 리스트를 바탕으로 결혼식에 초대할 사람의 수를 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 상근이의 동기의 수 n (2 ≤ n ≤ 500)이 주어진다. 둘째 줄에는 리스트의 길이 m (1 ≤ m ≤ 10000)이 주어진다. 다음 줄부터 m개 줄에는 친구 관계 ai bi가 주어진다. (1 ≤ ai < bi ≤ n) ai와 bi가 친구라는 뜻이며, bi와 ai도 친구관계이다. 

 

출력

첫째 줄에 상근이의 결혼식에 초대하는 동기의 수를 출력한다.

 


소스코드

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

public class Main {
    static boolean[] visited;
    static ArrayList<ArrayList<Integer>> g = new ArrayList<>();

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        int n = Integer.parseInt(br.readLine());
        int m = Integer.parseInt(br.readLine());

        visited = new boolean[n + 1];
        for (int i = 0; i < n + 1; i++) {
            g.add(new ArrayList<>());
        }

        for (int i = 0; i < m; i++) {
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            g.get(a).add(b);
            g.get(b).add(a);
        }

        dfs(1, 0);
        System.out.println(result);
    }

    static int result = -1;
    static void dfs(int x, int depth) {
        if(depth >= 3) return;
        if(!visited[x]) {
            result += 1;
            visited[x] = true;
        }
        for (int i = 0; i < g.get(x).size(); i++) {
            Integer v = g.get(x).get(i);
            dfs(v, depth + 1);
        }
    }
}

 

해결방법

결혼식에 상근이의 친구 혹은 상근이의 친구의 친구를 초대할 수 있다. 이때 초대 가능한 사람의 수를 출력하는 문제이다.

상근이는 친구관계의 값 1에 해당한다.

 

예제1의 경우 (1,2), (1,3), (3,4) => 2, 3, 4 => 총 3명을 초대할 수 있다.

6
5
1 2
1 3
3 4
2 3
4 5

 

DFS를 사용하면 쉽게 풀 수 있다. 인자로 depth(깊이)를 두어 상근이 친구의 친구까지만 DFS() 호출이 이뤄지도록 구현하면 된다.

 

주의할 점은 한 번 방문한 정점을 다시 방문가능하게 해야한다. 

 

이유는 (1, 2) -> (2, 3) -> (1, 3) -> (3, 4) 순으로 진행이 될텐데, (2, 3) 시점에서 2, 3의 visted는 true일 것이다. 그러면 그 이후인 (1, 3)는 3을 방문했기에 실행되지 않아 초대할 수 있는 사람이 총 2명이 나온다.

 

고로 방문한 정점을 다시 방문해야 한다.

'알고리즘 > 백준' 카테고리의 다른 글

1931번 : 회의실 배정  (0) 2023.08.23
20365번 : 블로그2  (0) 2023.08.22
1374번 : 강의실  (0) 2023.08.04
10775번 : 공항  (0) 2023.08.03
13904번 : 과제  (0) 2023.08.03
    '알고리즘/백준' 카테고리의 다른 글
    • 1931번 : 회의실 배정
    • 20365번 : 블로그2
    • 1374번 : 강의실
    • 10775번 : 공항
    코딍코딍
    코딍코딍
    ㅎ2

    티스토리툴바