[알고리즘]백준 2644번 촌수계산(DFS와 BFS알고리즘)

2023. 10. 21. 20:35· 알고리즘&자료구조/Algorithm
목차
  1.  
  2. 1. DFS 풀이법 (깊이 우선 탐색)
  3. 2. BFS 풀이법 ( 너비 우선 탐색 )
728x90

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

2644번: 촌수계산

사람들은 1, 2, 3, …, n (1 ≤ n ≤ 100)의 연속된 번호로 각각 표시된다. 입력 파일의 첫째 줄에는 전체 사람의 수 n이 주어지고, 둘째 줄에는 촌수를 계산해야 하는 서로 다른 두 사람의 번호가 주어

www.acmicpc.net

 

테스트 케이스결과
6
1 5
5
1 2
2 3
2 4
4 5
4 6
3

 

1. DFS 풀이법 (깊이 우선 탐색)

포인트
depth를 카운트 해야한다.
 

처음에 모든 노드의 수를 count하는 코드를 짜서 틀렸었다.
dfs[idx]에 count 정보가 함께 들어가도록 코드를 짜야한다.
dfs함수를 타는 횟수에 따라 count가 매번 증가하는 게 아니라서
다른 dfs함수가 먼저 돌았든 말든 상관없다!

import java.io.*;
import java.util.*;
public class Test2644 {
static int N,M,start,end;
static int answer = -1; //초기값 설정
static boolean[][] graph;
static boolean[] visited;

    public static void dfs(int idx, int count){
        visited[idx] = true; //dfs함수를 타는 순간 해당 idx는 방문했다는 것을 표시함.


        if(idx == end){ 
            answer = count;
        }

        for(int i = 1; i <= N; i++){
            if(visited[i]==false&&graph[idx][i]==true) {
            //조건 만족하면 dfs함수를 타고 count +1 해줌.
                    dfs(i,count+1);
            }
        }

    }
    
    public static void main(String[] args) throws IOException{
    //입출력 및 초기화
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        N = Integer.parseInt(br.readLine());

        StringTokenizer st = new StringTokenizer(br.readLine());
        start = Integer.parseInt(st.nextToken());
        end = Integer.parseInt(st.nextToken());

        M = Integer.parseInt(br.readLine());

        //정보 채우기
        graph = new boolean[N+1][N+1];
        visited = new boolean[N+1];

        for(int i = 0; i < M; i++){
            st = new StringTokenizer(br.readLine());

            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());
            graph[x][y] = true;
            graph[y][x] = true;
        }

        //함수 호출
        dfs(start,0);

        //출력
        bw.write(String.valueOf(answer));

        br.close();
        bw.close();
    }
}

 
 

2. BFS 풀이법 ( 너비 우선 탐색 )

이 문제는 촌수(최단 거리)를 구하는 문제다.
BFS는 주어진 노드에서 시작하여 가장 가까운 이웃부터 방문하기 때문에 DFS보다 더 직관적이다.
 
포인트
- 큐는 FIFO(First In, First Out) 특징을 갖고있다.
poll()로 맨앞 요소를 뽑아내서 촌수 확인을 해야한다.
- 큐는 ArrayList보다 LinkedList를 사용해줘야한다. (시간복잡도 때문)

import java.io.*;
import java.util.*;

public class Test2644_bfs {
    // 전역 변수로 사람 수, 관계 수, 시작점, 종료점을 선언.
    static int N, M, start, end;
    static boolean[][] graph; // 2차원 배열을 통한 관계 표현.
    static boolean[] visited; // 재방문 방지

    public static int bfs() {
        Queue<Pair> queue = new LinkedList<>();
        // LinkedList를 사용해야 ArrayList사용할때보다 시간복잡도 줄일 수 있다.
        // L은 O(1) A는 O(n)
        queue.add(new Pair(start, 0)); // 시작점과 초기 촌수(0)을 큐에 삽입

        while (!queue.isEmpty()) {
            Pair current = queue.poll(); //맨앞요소 제거하고 current에 담아줌.

            if (current.idx == end) return current.count; // 종료점에 도달하면 촌수 반환

            for (int i = 1; i <= N; i++) {
                if (!visited[i] && graph[current.idx][i]) {
                    visited[i] = true;
                    queue.add(new Pair(i, current.count + 1)); // 방문한적 없고 연결되어있는 노드를 큐에 추가
                }
            }
        }

        return -1; // 경로가 없을 경우 -1 반환
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        N = Integer.parseInt(br.readLine());

        StringTokenizer st = new StringTokenizer(br.readLine());
        start = Integer.parseInt(st.nextToken());
        end = Integer.parseInt(st.nextToken());

        M = Integer.parseInt(br.readLine());
        graph = new boolean[N + 1][N + 1];
        visited = new boolean[N + 1];

        for (int i = 0; i < M; i++) {
            st = new StringTokenizer(br.readLine());
            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());
            graph[x][y] = graph[y][x] = true;
        }

        int answer = bfs();
        bw.write(String.valueOf(answer));
        bw.flush();
        bw.close();
    }

    // BFS에 사용될 Pair 클래스 (노드의 index와 해당 노드까지의 촌수를 저장)
    static class Pair {
        int idx, count;

        Pair(int idx, int count) {
            this.idx = idx;
            this.count = count;
        }
    }
}
728x90

'알고리즘&자료구조 > Algorithm' 카테고리의 다른 글

[백트래킹] LeetCode 17. 전화번호 문자 조합  (1) 2024.01.15
[DFS]LeetCode 200번. 섬의 개수  (1) 2024.01.11
코딩 테스트를 준비한다면 알아야 할 '시간 복잡도' 이해하기  (1) 2024.01.03
대소문자 변환  (1) 2023.12.17
문자찾기  (1) 2023.12.17
  1.  
  2. 1. DFS 풀이법 (깊이 우선 탐색)
  3. 2. BFS 풀이법 ( 너비 우선 탐색 )
'알고리즘&자료구조/Algorithm' 카테고리의 다른 글
  • [DFS]LeetCode 200번. 섬의 개수
  • 코딩 테스트를 준비한다면 알아야 할 '시간 복잡도' 이해하기
  • 대소문자 변환
  • 문자찾기
백엔드 개발자 - 젤리곰
백엔드 개발자 - 젤리곰
오늘도 배움이 있는 하루가 되길 바라는 개발자
백엔드 개발자 - 젤리곰
backend-gummyBear
백엔드 개발자 - 젤리곰
전체
오늘
어제
  • 분류 전체보기 (144)
    • 인프런 김영한 강의 정리 (60)
      • 스프링 핵심원리 기본편 (12)
      • 모든 개발자를 위한 HTTP 웹 기본 지식 (10)
      • 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 (3)
      • 자바 ORM 표준 JPA 프로그래밍 기본편 (28)
      • 실전! Querydsl (6)
    • Spring (2)
    • 프로젝트일지 (6)
    • 프로그래밍 언어 (20)
      • Java (17)
      • JavaScript (3)
      • Python (0)
    • 데이터베이스 (4)
      • Oracle (2)
      • ORM (1)
      • SQL 튜닝 (1)
    • 형상관리 (1)
      • Git (0)
    • 알고리즘&자료구조 (34)
      • Algorithm (31)
      • Data Structure (1)
    • CS지식 (4)
    • Cloud (5)
    • 일기 (7)
      • 공부 일기 (3)
      • 독서 일기 (2)
      • 마음 일기 (2)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • 프론트엔드역사
  • dfs알고리즘
  • LeetCode17번
  • #{}와${}의차이
  • 객체지향방법론
  • 다운캐스팅
  • LeetCode200번
  • 업캐스팅
  • 객체지향의사실과오해
  • 커스텀annotation
  • 프론트엔드개발자업무
  • ORM프레임워크
  • 데이터베이스정규화
  • SublimeText단축키
  • 스프링컨텍스트
  • 클라이언트서버통신
  • 힙자료구조
  • jquery와javascript
  • 인터페이스
  • 인프콘

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
백엔드 개발자 - 젤리곰
[알고리즘]백준 2644번 촌수계산(DFS와 BFS알고리즘)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.