[백준] 1697 숨바꼭질 java

2022. 3. 9. 14:13· Dev/PS

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

class Node {
    int num;
    int cnt;
    Node(int num, int cnt) {
        this.num = num;
        this.cnt = cnt;
    }
}

public class HideAndSeek {
    static BufferedReader br;
    static StringTokenizer st;
    static int N, K;
    static int ans;
    static boolean[] checked;


    public static void main(String[] args) throws IOException{
        input();
        solve();
        System.out.println(ans);
    }

    public static void input() throws IOException {
        br = new BufferedReader(new InputStreamReader(System.in));
        st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        K = Integer.parseInt(st.nextToken());
        ans = Integer.MAX_VALUE;
        checked = new boolean[100001];
    }

    public static void solve() {
        Queue<Node> q = new LinkedList<>();
        //큐에 시작 숫자인 N을 넣고 방문처리를 해준다.
        q.add(new Node(N, 0));
        checked[q.peek().num] = true;

        //bfs로 돌면서 수를 찾는다.
        while (true) {
            int num = q.peek().num;
            int numCnt = q.poll().cnt;
            if(num == K) {
                ans = numCnt;
                break;
            }

            //인덱스 에러가 나기 때문에 경계값 처리를 해준다.
            if(num-1 >= 0){
                if(!checked[num-1]) {
                    q.add(new Node(num-1, numCnt+1));
                    checked[num-1] = true;
                }
            }
            if(num+1 <= 100000){
                if(!checked[num+1]) {
                    q.add(new Node(num+1, numCnt+1));
                    checked[num+1] = true;
                }
            }

            if(num*2 <= 100000) {
                if(!checked[num*2]) {
                    q.add(new Node(num*2, numCnt+1));
                    checked[num*2] = true;
                }
            }
        }
    }
}

BFS 문제이다. 처음에는 DFS를 사용해 재귀적으로 탐색하는 것을 시도했으나 StackoverflowError가 일어나서 생각해보니 무척 비효율적이란걸 깨달았다. 그래서 이건 bfs로 돌아야겠구나 생각하고 코드를 수정했다. 하지만 경계값인 N = 100000, K = 0이 주어졌을 때, 2초 이상이 걸리는걸 보고 최적화를 해야겠다고 생각했다.

 

우선 트리로 그려서 경우의 수를 봤더니 -, +, * 과정에서 이미 방문했던 수를 다시 방문해서 중복되는 경우의 수를 계속해서 돌고있는게 무척 비효율적이였다. 그래서 방문처리를 해서 한번 방문했던 수는 다시 안해도 되게끔 해줬다.

 

그리고 마지막으로 경계값 처리를 해서 인데싱에러가 나지 않도록 해주었다.

 

 

저작자표시 (새창열림)

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

[백준] 2251 물통 java  (0) 2022.03.19
[백준] 1525 퍼즐 java  (0) 2022.03.18
[백준] 10971 외판원 순회 2 java  (0) 2022.03.05
[백준] 1451 직사각형으로 나누기 java  (0) 2022.03.04
[백준] 1107 리모컨 java  (0) 2022.02.22
'Dev/PS' 카테고리의 다른 글
  • [백준] 2251 물통 java
  • [백준] 1525 퍼즐 java
  • [백준] 10971 외판원 순회 2 java
  • [백준] 1451 직사각형으로 나누기 java
풋데브
풋데브
지속가능한 삶
풋데브
지루함에 익숙해지자
풋데브
전체
오늘
어제
  • 분류 전체보기 (90)
    • 일상 (4)
    • 후기 (2)
    • 운동 (0)
    • Dev (84)
      • PS (72)
      • CS (0)
      • Java (1)
      • Spring (0)
      • DB (4)
      • Test (2)
      • Web (0)
      • 트러블 슈팅 (2)
      • Etc (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • algorithm
  • 자료구조
  • graph
  • Implement
  • 구현
  • 그래프
  • codingtest
  • 조합
  • 백준
  • 너비우선탐색
  • 투포인터
  • bruteforce
  • 다이나믹프로그래밍
  • 개발자
  • programming
  • DFS
  • BOJ
  • combination
  • 백엔드
  • 깊이우선탐색
  • 코테
  • Developer
  • 백트래킹
  • 코딩테스트
  • BFS
  • 완전탐색
  • 알고리즘
  • 자바
  • DP
  • java

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
풋데브
[백준] 1697 숨바꼭질 java
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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