Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 코딩테스트
- 가장 긴 증가하는 부분 수열2
- Adapater Pattern
- 프로그래머스
- 클린코드
- 백준
- 자바의 정석
- 코딩 테스트
- springboot
- 냄새와 휴리스틱
- programmers
- SerialDate 리펙터링
- Design Pattern
- java의 정석
- Dxerr.h
- 17장
- 2156번
- 2166번
- 11758번
- 10830번
- 11286번
- 1043번
- BOJ
- 9장
- java
- 2206번
- Design Patterns
- Spring
- DxTrace
- 1300번
Archives
- Today
- Total
Don't give up!
[백준] 1697번: 숨바꼭질 본문
어떻게 생각하고 문제를 풀었는가?
현재 위치가 X일때 목표지점 K로 이동할 수 있는 방법은 X-1, X+1, X*2로 3가지이지만 만약 X가 K보다 큰 값을 가지고 있을 경우 X+1, X*2는 최단시간을 구하는 데 큰 도움이 되지 않습니다.
BFS를 수행하고, 같은 위치에 반복 도달을 검사에서 제외함으로써 문제를 해결할 수 있다고 생각하였습니다.
코드
package com.boj;
import java.io.*;
import java.util.*;
class Main {
static int N, K;
static boolean[] visited;
static Queue<Subin> queue;
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());
queue = new LinkedList<>();
if(K<N){
System.out.println(N-K);
return;
}
visited = new boolean[K*2+1];
visited[N] = true;
queue.offer(new Subin(0,N));
while(!queue.isEmpty()){
Subin cur = queue.poll();
if(cur.pos==K){
System.out.println(cur.count);
break;
}
else{
if(cur.pos>0 && !visited[cur.pos-1]){
visited[cur.pos-1] = true;
queue.offer(new Subin(cur.count+1, cur.pos-1));
}
if(cur.pos<K){
if(!visited[cur.pos+1]){
visited[cur.pos+1] = true;
queue.offer(new Subin(cur.count+1, cur.pos+1));
}
if(!visited[cur.pos*2]){
visited[cur.pos*2] = true;
queue.offer(new Subin(cur.count+1, cur.pos*2));
}
}
}
}
br.close();
}
static class Subin{
int count;
int pos;
Subin(int count, int pos){
this.count = count;
this.pos = pos;
}
}
}
ㅂQueue로 BFS를 구현한 코드입니다.
현재 위치와 이동 횟수를 저장하기 위해 클래스를 정의하였으며, 위치에 따라 X-1, X+1, X*2의 이동을 수행하여 먼저 N위치에 도달한 이동 횟수를 결과로 출력합니다.
K보다 큰 값을 갖는 위치에서 +1, *2의 이동은 최소 이동을 구하는데 아무런 도움이 되지 않기 때문에 현재 위치가 K보다 작은 값을 가질 때에만 +1, *2의 이동을 수행할 수 있도록 하였으며 방문 체크 배열도 K*2+1까지만 선언하였습니다.
만약 N값이 K보다 크다면 -1의 이동만 반복하는 것이 최소 이동이므로 BFS를 수행하지 않고 N-K의 값으로 결과를 출력합니다.
'Coding Test > BOJ' 카테고리의 다른 글
[백준] 2580번 : 스도쿠 (java) (0) | 2021.07.12 |
---|---|
[백준] 1735번 : 최단경로 (java) (0) | 2021.07.10 |
[백준] 1106번 : 호텔 (java) (0) | 2021.07.08 |