백준 1697 숨바꼭질 - JAVA

2025. 2. 6. 16:33·알고리즘/백준

1697 문제 링크


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

 

문제 설명


 

입출력


 

코드


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
import java.io.*;
import java.util.*;
 
public class Main {
    static int N,K;
    static boolean[] visit;
    static int[] move = {1, -1, 2};
    static int MAX = 100001;
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        StringTokenizer st = new StringTokenizer(br.readLine());
        
        N = Integer.parseInt(st.nextToken());
        K = Integer.parseInt(st.nextToken());
        
        visit = new boolean[MAX];
        
        bw.write(String.valueOf(bfs()));
        bw.flush();
    }
    
    private static int bfs() {
        visit[N] = true;
        int count = 0;
        Queue<Integer> queue = new LinkedList<>();
        queue.offer(N);
        
        while (!queue.isEmpty()) {
            int size = queue.size();
            
            
            for (int i = 0; i < size; i++) {
                int current = queue.poll();
                
                if (current == K) {
                    return count;
                }
                for (int j = 0; j < 3; j++) {
                    int nN = (j == 2) ? current * move[j] : current + move[j];
                    if (nN >= 0 && nN < MAX && !visit[nN]) {
                        visit[nN] = true;
                        queue.offer(nN);
                    }
                }
            } 
            count++;
        }
        return -1;
    }
}
Colored by Color Scripter
cs

 

 

알고리즘 설명


BFS 알고리즘의 기본은 큐의 형태를 띄고 있습니다. 1초를 간격으로 poll()된 맨 앞의 원소가 갈 수 있는 세 가지의 경우를 레벨화 해놓고 생각하면 쉽게 풀 수 있습니다. 초를 count로 설정하고, 반복문이 어떻게 들어가는지 그림으로 보시겠습니다.

그림처럼 해당 숫자의 -1, +1, x2 각 세가지의 조건으로 중복되지 않는 숫자가 큐에 들어옵니다. 예를 들면 count=1 에서는 [4,6,10]
count=2에서는 [3,8,7,12,9,11,20]처럼 말이죠. 이렇게 count를 늘려가면서 처음 K를 찾는다면 해당 count가 K를 찾을 수 있는 최단 시간이라는 것을 알 수 있습니다. 어렵게 설명하기보다는 직관적으로 그래프를 그리는 것이 이해에 도움이 될것이라고 생각했습니다 :)

 

코드 해석


visit[] 배열을 사용해 방문 여부를 체크하고, N에서 시작해 큐에 넣습니다. 큐에서 하나씩 꺼내어 +1, -1, *2를 시도하며, K에 도달하면 바로 탐색을 종료하고 그때까지의 횟수를 출력합니다. 각 레벨마다 큐의 크기만큼 반복문을 돌며 가능한 모든 위치로 이동합니다. K에 도달하면 그때까지의 이동 횟수를 반환합니다.
 
삼항연산자에 주의하여 코드를 확인하시면 좋을것  같습니다. 이번 문제는 삼항연산자로 코드의 길이가 대폭 줄어들었습니다.

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

백준 16928 뱀과 사다리 게임 - JAVA  (1) 2025.02.14
백준 1927 최소 힙 - JAVA  (1) 2025.02.13
백준 1012 유기농 배추 - JAVA  (1) 2025.02.05
백준 1920 수 찾기 - JAVA  (1) 2025.02.04
백준 2667 단지번호붙이기 - JAVA  (1) 2025.02.03
'알고리즘/백준' 카테고리의 다른 글
  • 백준 16928 뱀과 사다리 게임 - JAVA
  • 백준 1927 최소 힙 - JAVA
  • 백준 1012 유기농 배추 - JAVA
  • 백준 1920 수 찾기 - JAVA
BIS's tech Blog
BIS's tech Blog
Welcome to Kanghyun's tech blog :)
  • BIS's tech Blog
    벼익숙의 기술 블로그
    BIS's tech Blog
  • 전체
    오늘
    어제
    • 분류 전체보기 (68)
      • 알고리즘 (54)
        • 백준 (45)
        • 프로그래머스 (9)
      • CS 스터디 (14)
        • CS - JAVA (11)
        • CS - DB (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    백트래킹
    BFS
    자료구조
    재귀
    Top-Down
    Lv2
    너비 우선 탐색
    DFS
    프로그래머스
    깊이 우선 탐색
    Baekjoon
    브루트포스
    알고리즘 고득점 kit
    CS
    동적 계획
    백준
    기술질문
    완전탐색
    java
    dp
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
BIS's tech Blog
백준 1697 숨바꼭질 - JAVA
상단으로

티스토리툴바