[Java] Boj 14496: 그대, 그머가 되어

2025. 7. 11. 18:46·PS/Solve

문제

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

 

풀이

 주어진 문자를 얼마나 적은 횟수로 변환시켜서 원하는 문자로 변환할 수 있는지 최소 변환 횟수를 구하는 문제이다. 문제 이해가 조금 난해할 뿐이지 실제로는 굉장히 간단한 BFS 문제이다. 입력은 모두 숫자로 주어지므로 단순 정수 기본 아이디어는 다음과 같다.

 

1. 변환 횟수를 저장할 int 타입의 dis 배열, 방문 여부를 저장할 boolean 타입의 visit 배열 선언

2. 연결 리스트 형태로 그래프를 저장하기 위해 list 선언

3. BFS는 a에서 시작 (문자 변환을 a부터 시작하기 때문)

4. BFS 종료 후, b를 방문하였다면 dis[b]를 출력. 방문하지 않았다면 -1을 출력

 

추가로, 입력되는 a와 b가 같다면 변환할 필요가 없으므로 그래프 정보를 모두 입력받고 0을 출력하고 종료하면 된다. 이외에 놓칠뻔한 점으로는 문제만 읽어보면 단방향 그래프라 느낄 수 있는데, 예제를 모두 확인하고 보니 이 문제는 양방향 그래프에서의 BFS 문제였다. 문제 본문에서는 양방향 그래프인 점이 잘 드러나지 않는 점이 조금 그렇다.

 

여담으로 PS를 한동안 안하니 이런 기본적인 BFS 문제 푸는것도 살짝 시간이 걸려버렸다. PS는 진짜 길게 쉬면 안되는듯..

 

코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
 
 
public class Main {
    public static ArrayList<Integer>[] list;
    public static boolean[] visit;
    public static int[] dis;
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(bf.readLine());
        int a = Integer.parseInt(st.nextToken());
        int b = Integer.parseInt(st.nextToken());
        st = new StringTokenizer(bf.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        list = new ArrayList[n+1];
        visit = new boolean[n+1];
        dis = new int [n+1];
        for (int i = 1; i<=n; i++) {
            list[i] = new ArrayList<>();
        }
        for (int i=0; i<m; i++) {
            st = new StringTokenizer(bf.readLine());
            int u = Integer.parseInt(st.nextToken());
            int v = Integer.parseInt(st.nextToken());
            list[u].add(v);
            list[v].add(u);
        }
        if (a == b) {
            System.out.println(0);
            return;
        }
        dis[a] = 0;
        bfs(a);
        if (visit[b]) System.out.println(dis[b]);
        else System.out.println(-1);
    }
    public static void bfs(int n) {
        Queue<Integer> q = new LinkedList<>();
        visit[n] = true;
        q.add(n);
        while(! q.isEmpty()) {
            int poll = q.poll();
            for (int i: list[poll]) {
                if (! visit[i]) {
                    visit[i] = true;
                    dis[i] = dis[poll] + 1;
                    q.add(i);
                }
            }
        }
    }
}
 
Colored by Color Scripter
cs

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

[Java] Boj 1049: 기타줄  (0) 2025.07.14
[Java] Boj 1343: 폴리오미노  (0) 2025.07.14
[Java] Boj 25418: 정수 a를 k로 만들기  (1) 2025.07.07
[Java] Boj 6528: 106 miles to Chicago  (0) 2025.03.13
[Java] Boj 24052: 알고리즘 수업 - 삽입 정렬 2  (0) 2025.03.11
'PS/Solve' 카테고리의 다른 글
  • [Java] Boj 1049: 기타줄
  • [Java] Boj 1343: 폴리오미노
  • [Java] Boj 25418: 정수 a를 k로 만들기
  • [Java] Boj 6528: 106 miles to Chicago
hyeon0117
hyeon0117
컴공으로 살아남기
  • hyeon0117
    컴공 생활기
    hyeon0117
  • 전체
    오늘
    어제
    • 분류 전체보기 (65) N
      • Algorithm (2)
      • PS (22) N
        • Solve (22) N
      • CS (41) N
        • 객체지향설계 & 패턴 (12)
        • COLMAP (2)
        • 머신러닝 (1)
        • 프로그래밍 언어론 (19)
        • 형식언어 (6) N
        • 운영체제 (1)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    디자인패턴
    프로그래밍 언어론
    boj 1343
    Formal Language
    형식언어
    자료구조
    촘스키 계층
    객체지향언어
    PLT
    PS
    java
    선택 정렬
    CS
    정규 문법
    최단 경로
    알고리즘
    객체지향
    구현
    정규 언어
    형식언어론
    컴파일러
    유한 오토마타
    객체지향설계
    함수
    BOJ
    디자인 패턴
    자료형
    백준
    의미론
    그리디 알고리즘
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
hyeon0117
[Java] Boj 14496: 그대, 그머가 되어
상단으로

티스토리툴바