e.den
eden.dev.log
e.den
전체 방문자
오늘
어제
  • 분류 전체보기 (57)
    • 슬기로운 취준 생활 (1)
    • Study (30)
      • Swift (7)
      • iOS (6)
      • Java (2)
      • Spring (6)
      • Algorithm (9)
    • Coding Test (8)
      • Swea (0)
      • Baekjoon (8)
      • Programmers (0)
    • 삽질기 (3)
    • 독서록 (15)
      • Clean Architecture (5)
      • Clean Code (10)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • UITextView
  • 프로퍼티
  • reduce
  • 자료구조
  • Map
  • 알고리즘
  • java
  • 고차함수
  • lombok
  • swift
  • Spring
  • lifecycle
  • RunLoop
  • CGLayer
  • 클린아키텍처
  • Filter
  • 부스트코스
  • property
  • CleanArchitecture
  • flatmap
  • compactMap
  • cleancode
  • 정렬
  • Algorithm
  • MySQL
  • 클린코드
  • ios
  • mybatis
  • initializer
  • CoreAnimation

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
e.den

eden.dev.log

[BOJ] 백준 2644 촌수계산
Coding Test/Baekjoon

[BOJ] 백준 2644 촌수계산

2021. 3. 9. 22:47

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

 

2644번: 촌수계산

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

www.acmicpc.net

 


 

풀이 방법

  1. 예제로 나온 그래프를 그리면 이런 형태가 되는데, 시작점을 7로 잡고 끝점을 3으로 잡으면 이러한 방향 그래프가 나온다.
  2. 정점 1번을 보면 들어오는 경우가 있고, 나가는 경우가 있으니 이것은 양방향 인접 리스트를 이용해서 풀 수 있다는 것을 알 수 있다.
  3. dfs를 사용해서 시작점을 계속 바꿔주고, 시작점이 바뀔 때마다 count를 한다. 
  4. 시작점과 끝점이 같아지는 경우에 count 를 리턴한다.

 

다음은 Java로 작성한 코드이다.

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

public class B2644 {
    private static ArrayList<ArrayList<Integer>> list;
    private static boolean [] visited;
    private static int answer = -1;

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

        int n = Integer.parseInt(br.readLine());

        String [] str = br.readLine().split(" ");
        int num1 = Integer.parseInt(str[0]);
        int num2 = Integer.parseInt(str[1]);

        int m = Integer.parseInt(br.readLine());

        list = new ArrayList<>();
        visited = new boolean[n+1];

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

        for (int i = 0; i < m; i++) { // 양방향 인접 리스트
            StringTokenizer st = new StringTokenizer(br.readLine());
            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());

            list.get(x).add(y);
            list.get(y).add(x);
        }

        dfs(num1, num2, 0);

        System.out.println(answer);
    }

    private static void dfs(int start, int end, int count) {
        visited[start] = true;

        for (int i: list.get(start)) {
            if (!visited[i]) {
                if (i == end) {
                    answer = count + 1;
                    return;
                }

                dfs(i, end, count+1);
            }
        }
    }
}
저작자표시 (새창열림)

'Coding Test > Baekjoon' 카테고리의 다른 글

[BOJ] 백준 11725 트리의 부모 찾기  (0) 2021.03.21
[BOJ] 백준 2343 기타 레슨  (1) 2021.03.15
[BOJ] 백준 7569 토마토  (2) 2021.03.15
[BOJ] 백준 14502 연구소  (2) 2021.03.09
[BOJ] 백준 2468 안전 영역  (2) 2021.03.09
    'Coding Test/Baekjoon' 카테고리의 다른 글
    • [BOJ] 백준 2343 기타 레슨
    • [BOJ] 백준 7569 토마토
    • [BOJ] 백준 14502 연구소
    • [BOJ] 백준 2468 안전 영역
    e.den
    e.den
    문제를 본질적으로 접근하자

    티스토리툴바