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 | 31 |
Tags
- LeetCode #릿코드 #좋은 하루 되세요 #Have a nice day
- 텐션 업 10기!
- SSAFY 테스트
- 모르고리즘
- I am Korean
- amazon
- SSAFY IM/A
- DFS
- 자료구조
- 수학
- 아자아자 화이팅
- Hamming weight
- 우유아야
- SSAFY 10기 화이팅
- 우유가 옆으로 넘어지면 아야
- 코로나 싫어요
- 자고 싶다
- 네트워크
- have a nice day
- Have a good day :)
- SeongSeobDang
- DP
- BFS
- SSAFY 화이팅
- 텐션 업 10기 화이팅
- Have a nice day.
- HAVE A GOOD DAY
- 우유가옆으로넘어지면아야
- Java 환경 설정
Archives
- Today
- Total
Hope Everyone Is Happy
[실버2] 11060. 점프 점프 (Java) 본문
728x90
반응형
https://www.acmicpc.net/problem/11060
11060번: 점프 점프
재환이가 1×N 크기의 미로에 갇혀있다. 미로는 1×1 크기의 칸으로 이루어져 있고, 각 칸에는 정수가 하나 쓰여 있다. i번째 칸에 쓰여 있는 수를 Ai라고 했을 때, 재환이는 Ai이하만큼 오른쪽으로
www.acmicpc.net
점프점프,,
※ 문제를 요약하면 아래와 같습니다.
▶ 1 X N 크기의 미로에 재환이가 갇혀서 N-1번째 포인트까지 도달해야함
▶ 각 미로 칸에는 이동 가능한 거리가 적혀있으며 N-1번까지 최소 경우로 도달
▶ N-1번에 도착 불가시 -1 출력
▶ Input : 첫째줄에 미로의 크기 N, 둘째줄에는 공백을 기준으로 각 미로칸의 값이 입력
▶ Output : 최소 경우의 수 출력, 불가능할 경우 -1 출력
◈ Input - 1
10
1 2 0 1 3 2 1 5 4 2
◈ Output - 1
5
◎ 코드 작성 전, 아래와 같이 솔루션을 정리하였습니다.
▶ 인덱스를 노드 번호로, 해당 칸에서 가는 곳이 가능한 곳을 간선으로 연결 가능
ex) Input-1
▶ 각 노드의 정보를 Jumper 클래스로 Point와 Count를 저장
▶ BFS 활용하여 최소 경로 탐색
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
class Jumper {
int nPoint;
int nCount;
public Jumper(int nPoint, int nCount) {
super();
this.nPoint = nPoint;
this.nCount = nCount;
}
}
public class Main {
static int[] narrMaze;
static int[] narrDP;
static boolean[] barrVisited;
static int nMin;
public static void main(String[] args) throws IOException {
BufferedWriter bWriter = new BufferedWriter(new OutputStreamWriter(System.out));
BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(bReader.readLine()); // 정점의 개수
StringTokenizer st = new StringTokenizer(bReader.readLine());
narrMaze = new int[N];
narrDP = new int[N];
barrVisited = new boolean[N];
Arrays.fill(narrDP, Integer.MAX_VALUE);
nMin = Integer.MAX_VALUE;
for(int i = 0 ; i < N; i++)
narrMaze[i] = Integer.parseInt(st.nextToken());
if(N== 1)
bWriter.write("0");
else
bWriter.write(String.valueOf(BFS()));
bWriter.flush();
bWriter.close();
}
private static int BFS() {
// TODO Auto-generated method stub
Queue<Jumper> queueBFS = new LinkedList<Jumper>();
queueBFS.add(new Jumper(0, 0));
while(!queueBFS.isEmpty()) {
Jumper jumper = queueBFS.poll();
if(jumper.nPoint > narrMaze.length-1)
continue;
for(int i = 1 ; i <= narrMaze[jumper.nPoint]; i++) {
// 배열 크기 예외처리
if(jumper.nPoint + i > narrMaze.length-1)
continue;
int nNextPoint = jumper.nPoint + i;
if(nNextPoint == narrMaze.length-1) {
if(nMin > jumper.nCount+1)
nMin = jumper.nCount+1;
}
//
if(nNextPoint > narrMaze.length-1)
continue;
// // DP 최소 경로만
// if(narrDP[nNextPoint] >= jumper.nCount+1)
// narrDP[nNextPoint] = jumper.nCount+1;
// else
// continue;
// 방문처리
if(barrVisited[nNextPoint])
continue;
else
barrVisited[nNextPoint] = true;
queueBFS.add(new Jumper(nNextPoint, jumper.nCount+1));
}
}
if(nMin == Integer.MAX_VALUE)
nMin = -1;
return nMin;
}
}
Good Luck! (피드백 감사합니다!)
'※ 백준 (Baekjoon) > [Java] 문제 풀이 ( Solve the problems)' 카테고리의 다른 글
[실버1] 7562. 나이트의 이동 (Java) (0) | 2023.09.25 |
---|---|
[골드4] 4485. 녹색 옷 입은 애가 젤다지? (Java) (2) | 2023.09.25 |
[실버3] 15654. N과M(5) (Java) (0) | 2023.09.25 |
[골드4] 1197. 최소 스패닝 트리 (Java) (0) | 2023.09.20 |
[실버1] 1697. 숨바꼭질(Java) (0) | 2023.09.19 |