일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Union Find
- 괄호의값 스택
- Spring Security
- 백준 1806 자바
- 프로그래머스
- 1062번 가르침
- 자바 1193
- 백준 최소비용구하기 자바
- 팀프로젝트
- 인사관리사이트
- 다익스트라 최소비용구하기
- 2504 괄호의값 자바
- 백준 괄호의값 자바
- 백준 2252 자바
- 라이브커머스
- 기업분석
- 이커머스
- 백준 1193
- 유니온 파인드
- 온라인쇼핑
- 백준 1700 자바
- 개발일지
- 커머스기사
- 줄세우기 위상정렬
- 데이터베이스 기초지식
- 자바 2869
- 백준 멀티탭스케줄링 자바
- 조인종류
- 웹 기술면접
- 백준 줄세우기 자바
- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Union Find
- 괄호의값 스택
- Spring Security
- 백준 1806 자바
- 프로그래머스
- 1062번 가르침
- 자바 1193
- 백준 최소비용구하기 자바
- 팀프로젝트
- 인사관리사이트
- 다익스트라 최소비용구하기
- 2504 괄호의값 자바
- 백준 괄호의값 자바
- 백준 2252 자바
- 라이브커머스
- 기업분석
- 이커머스
- 백준 1193
- 유니온 파인드
- 온라인쇼핑
- 백준 1700 자바
- 개발일지
- 커머스기사
- 줄세우기 위상정렬
- 데이터베이스 기초지식
- 자바 2869
- 백준 멀티탭스케줄링 자바
- 조인종류
- 웹 기술면접
- 백준 줄세우기 자바
- Today
- Total
JumpUp
백준 [N1697 - 숨바꼭질] 본문
이 문제를 보자마자 BFS로 풀어야겠다고 생각했다. 메모리초과, 시간초과로 몇 번 헤매었는데 그 이유가
"수빈이가 이미 간 경로를 또 확인했다."는 것이다. 이미 방문한 경로는 다시 확인할 필요가 없는 것이 "갈 수 있는 경로 중 가장 빠른 시간"을 구하는 것이기 때문이다. 한번더 확인하게 되면 이전보다 시간이 당연히 늦춰지게 된다.
그래서, 1차원 배열로 방문여부를 확인하고 값은 흐른 시간을 저장하도록 했다.
또한, 수빈이와 동생의 위치가 같을 경우, 수빈이의 위치가 동생의 위치보다 클 경우는 빠르게 결과를 찾을 수 있다.
위치가 같다면 0초, 수빈이 위치가 동생위치보다 클 경우 N-K초 만큼 흐르게 된다.
STEP1. 1차원 배열 visited를 초기화해주고 수빈이의 위치 N을 큐에 add해준다.
STEP2. 큐의 poll값(now)이 동생 위치(K)와 같아질 때까지 while문을 돈다.
STEP3. 현재 위치(now)에서 갈 수 있는 위치(now+1, now-1, now*2)가 (1<N,K<100000)의 범위를 벗어나지 않고 visited값이 0일 경우 방문하지 않았던 위치라는 것을 의미한다.
그렇다면, 큐에 갈 수 있는 위치를 저장하고 visited값 또한 visited[now]에서+1해준다.
예) N=5 (0초) -> 갈 수 있는 위치 4, 6, 10 (1초)
visited[4] = visited[5] +1;
visited[6] = visited[5] +1;
visited[10] = visited[5] +1;
visited값은 이전 위치의 값에서 +1하여 흐른 시간을 저장하게 된다.
소스코드
import java.util.*;
import java.io.*;
public class Main{
private static int N;
private static int K;
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 if(N>K) System.out.println(N-K);
else {
System.out.println(bfs());
}
}
private static int bfs() {
Queue<Integer> queue = new LinkedList<>();
int[] visited = new int[100001];
queue.add(N);
while(!queue.isEmpty()){
int now = queue.poll();
if(now==K) break;
if(now+1<=100000 && visited[now+1]==0){
queue.add(now+1);
visited[now+1] = visited[now]+1;
}
if(now-1>=0 && visited[now-1]==0){
queue.add(now-1);
visited[now-1] = visited[now]+1;
}
if(now*2<=100000 && visited[now*2]==0){
queue.add(now*2);
visited[now*2] = visited[now]+1;
}
}
return visited[K];
}
}
'알고리즘' 카테고리의 다른 글
백준 [N14888 - 연산자끼워넣기] (0) | 2021.12.04 |
---|---|
프로그래머스 [여행경로] (0) | 2021.11.20 |
백준 [N2696 - 중앙값구하기] (0) | 2021.11.06 |
백준 [N2438 - 별찍기1], [N2442 - 별찍기5] (0) | 2021.11.02 |
프로그래머스 [타겟넘버] (0) | 2021.10.18 |