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)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

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

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
e.den

eden.dev.log

[BOJ] 백준 1697 숨바꼭질
Coding Test/Baekjoon

[BOJ] 백준 1697 숨바꼭질

2021. 3. 22. 22:07

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

 

1697번: 숨바꼭질

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일

www.acmicpc.net

 


 

풀이 과정

  1. 총 3가지의 경우를 탐색해야 한다. 위치가 X일 때, X-1과 X+1, X*2 이렇게 세 가지.
  2. int형 checked라는 배열을 만들어서 거쳐온 거리(도착하기까지 걸린 시간)를 기록한다.
  3. bfs를 사용해서 시작점인 n부터 큐에 넣고, 만들어둔 배열 인덱스 n에 대한 값으로 방문했다는 의미로 1이라는 값을 넣는다.
  4. 반복문을 돌려서 세 가지 경우를 모두 탐색하고 탐색한 결과 값과 k가 같아지는 순간, checked[큐에서 꺼낸 값]을 출력하는 동시에 리턴한다.

풀이 과정을 토대로 그림을 그려 봤다. start(수빈이의 위치)가 5, end(동생의 위치)를 11로 가정하고 진행한다.

시작점을 거리에서 제외하기 위해 이전 값인 2를 출력해야 한다. 

 

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

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
    private static int n, k;
    private static final int [] checked = new int[100001];

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

        n = Integer.parseInt(st.nextToken());
        k = Integer.parseInt(st.nextToken());

        if (n == k) {
            System.out.println(0);
        } else {
            bfs();
        }
    }

    private static void bfs() {
        Queue<Integer> q = new LinkedList<>();
        q.add(n);
        checked[n] = 1;

        while (!q.isEmpty()) {
            int temp = q.poll();

            for (int i = 0; i < 3; i++) {
                int next;

                if (i == 0) {
                    next = temp + 1;
                } else if (i == 1) {
                    next = temp - 1;
                } else {
                    next = temp * 2;
                }

                if (next == k) {
                    System.out.println(checked[temp]);
                    return;
                }

                if (next >= 0 && next < checked.length && checked[next] == 0) {
                    q.add(next);
                    checked[next] = checked[temp] + 1;
                }
            }
        }
    }
}
저작자표시 (새창열림)

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

[BOJ] 백준 5567 결혼식  (0) 2021.03.22
[BOJ] 백준 11725 트리의 부모 찾기  (0) 2021.03.21
[BOJ] 백준 2343 기타 레슨  (1) 2021.03.15
[BOJ] 백준 7569 토마토  (2) 2021.03.15
[BOJ] 백준 2644 촌수계산  (2) 2021.03.09
    'Coding Test/Baekjoon' 카테고리의 다른 글
    • [BOJ] 백준 5567 결혼식
    • [BOJ] 백준 11725 트리의 부모 찾기
    • [BOJ] 백준 2343 기타 레슨
    • [BOJ] 백준 7569 토마토
    e.den
    e.den
    문제를 본질적으로 접근하자

    티스토리툴바