반응형
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 |
Tags
- 프로그래머스
- PCCP
- 24955
- 오블완
- 등산코스 정하기
- 산 모양 타일링
- 티스토리챌린지
- SQL
- 카카오
- 싸피
- softeer
- 해결
- 수료
- 설명
- MySQL
- 10기
- 조건에 부합하는 중고거래 상태 구하기
- 정기 코딩 인증평가
- 배열 돌리기 5
- 165672
- java
- 핵심
- 142085
- 소프티어
- 퍼즐 조각 채우기
- 숫자 이어 붙이기
- 14942
- 후기
- 백준
- SSAFY
Archives
- Today
- Total
개발 쥬스
[백준/Java] 13549 숨바꼭질 3 본문
반응형
🔗 문제 링크: https://www.acmicpc.net/problem/13549
🔍 해결 과정
일차원 배열을 활용한 BFS 유형의 문제로 다음과 같은 과정으로 문제를 해결하였습니다.
1️⃣ 각 좌표에 도달할 때 나올 수 있는 최소 시간의 정보를 저장할 정수형 배열 d를 정의한다.
2️⃣ d 테이블의 초기값을 무한으로 초기화해준다. (코드에서는 10억으로 설정)
3️⃣ BFS를 활용하여 왼쪽, 오른쪽, 순간이동 하는 경우에서의 시간을 계산해 준 다음 d 테이블에서 최소 시간을 계속 계산해준다.
4️⃣ BFS 완료후 d 테이블에서 동생이 위치한 d[k] 값을 반환해준다.
✏️ 코드
import java.io.*;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Queue;
import java.util.StringTokenizer;
class Node {
private final int index;
private final int time;
public Node(int index, int time) {
this.index = index;
this.time = time;
}
public int getIndex() {
return index;
}
public int getTime() {
return time;
}
}
public class Main {
private static final int INF = (int) 1e9;
private static final int MAX_POS = 100000;
private static int[] d = new int[200050];
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());
int n = Integer.parseInt(st.nextToken()); // n, k의 최댓값: 10만
int k = Integer.parseInt(st.nextToken());
bw.write(Integer.toString(findTarget(n, k)));
bw.flush();
}
private static int findTarget(int n, int k) {
Arrays.fill(d, INF);
d[n] = 0;
Queue<Node> q = new ArrayDeque<>();
q.offer(new Node(n, 0));
while (!q.isEmpty()) {
Node cur = q.poll();
int curIdx = cur.getIndex();
int curTime = cur.getTime();
if (d[curIdx] < curTime) {
continue;
}
int left = curIdx - 1;
int leftCost = d[curIdx] + 1;
int right = curIdx + 1;
int rightCost = d[curIdx] + 1;
int doublePos = curIdx * 2;
int doubleCost = d[curIdx];
if (left >= 0 && leftCost < d[left]) {
d[left] = leftCost;
q.offer(new Node(left, leftCost));
}
if (right <= MAX_POS && rightCost < d[right]) {
d[right] = rightCost;
q.offer(new Node(right, rightCost));
}
if (doublePos <= MAX_POS && doubleCost < d[doublePos]) {
d[doublePos] = doubleCost;
q.offer(new Node(doublePos, doubleCost));
}
}
return d[k];
}
}
반응형
'알고리즘' 카테고리의 다른 글
[백준/Java] 1038. 감소하는 수 (1) | 2025.01.28 |
---|---|
[프로그래머스/Java] [Kakao 블라인드 기출] 표 병합 (1) | 2025.01.27 |
[백준/Java] 24955 숫자 이어 붙이기 (0) | 2025.01.20 |
[프로그래머스/Java] [2022 카카오 인턴십 기출문제] 등산코스 정하기 (0) | 2025.01.17 |
[프로그래머스/MySQL] 상품 별 오프라인 매출 구하기 (1) | 2025.01.15 |