[백준] 문제 16173번 : 점프왕 쩰리 - JAVA
2024. 12. 5. 17:34 - DoosanBaek
[링크] : https://www.acmicpc.net/problem/16173
💎 문제 분석 & 제약 조건
문제 분석 :
주어진 게임 구역에서 끝 점(오른쪽 맨 아래 칸)까지 도달할 수 있는지 계산하는 프로그램을 작성하고
쩰리가 끝 점에 도달할 수 있으면 “HaruHaru”(인용부호 없이), 도달할 수 없으면 “Hing” (인용부호 없이)을 한 줄에 출력
제약 조건 :
입력의 첫 번째 줄에는 게임 구역의 크기 N (2 ≤ N ≤ 3)이 주어진다.
입력의 두 번째 줄부터 마지막 줄까지 게임판의 구역(맵)이 주어진다.
게임판의 승리 지점(오른쪽 맨 아래 칸)에는 -1이 쓰여있고, 나머지 칸에는 0 이상 100 이하의 정수가 쓰여있다.
🚀 의사 결정
1.BufferedReader로 입력 받고
2.게임 구역의 맵을 저장할 2차원 배열 초기화 , 방문 여부를 확인할 배열 초기화
3.for문을 통해 StringTokenizer를 사용해 토큰화한 값을 게임 구역의 맵 입력
4.너비우선탐색(BFS) 사용, 출발점에서 도착점으로 갈 수 있는지 확인
5.도착점에 도달할 수 있으면 "HaruHaru" 출력, 도착점에 도달할 수 없으면 "Hing" 출력
📜 소스코드(Java)
import java.io.*;
import java.util.*;
public class Main {
static int N; // 게임 구역의 크기 N
static int[][] map; // 게임 구역의 맵을 저장할 2차원 배열
static boolean[][] visited; // 방문한 위치를 저장할 배열
static int[] directionX = {1, 0}; // 오른쪽으로 이동
static int[] directionY = {0, 1}; // 아래쪽으로 이동
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine()); // 게임 구역의 크기 N 입력
map = new int[N][N]; // N x N 크기의 게임 구역 배열 초기화
visited = new boolean[N][N]; // 방문 여부를 확인할 배열 초기화
// 게임 구역의 맵 입력
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
// BFS를 사용하여 출발점에서 도착점으로 갈 수 있는지 확인
if (bfs(0, 0)) {
System.out.println("HaruHaru"); // 도착점에 도달할 수 있으면 "HaruHaru" 출력
} else {
System.out.println("Hing"); // 도착점에 도달할 수 없으면 "Hing" 출력
}
}
private static boolean bfs(int x, int y) {
Queue<int[]> queue = new LinkedList<>(); // 큐 초기화
queue.offer(new int[]{x, y}); // 출발점 큐에 추가
visited[x][y] = true; // 출발점 방문 처리
while (!queue.isEmpty()) { // 큐가 비어있지 않으면 반복
int[] current = queue.poll(); // 현재 위치를 큐에서 가져옴
int currentX = current[0]; // 현재 x 좌표
int currentY = current[1]; // 현재 y 좌표
int jump = map[currentX][currentY]; // 현재 위치에서의 점프 크기
if (jump == -1) { // 도착점에 도달한 경우
return true;
}
// 오른쪽과 아래쪽으로 점프
for (int i = 0; i < 2; i++) {
int jumpX = currentX + directionX[i] * jump; // 점프하여 도착할 x 좌표
int jumpY = currentY + directionY[i] * jump; // 점프하여 도착할 y 좌표
// 점프가 유효한 범위 내에 있고 방문하지 않은 위치인 경우
if (jumpX >= 0 && jumpY >= 0 && jumpX < N && jumpY < N && !visited[jumpX][jumpY]) {
queue.offer(new int[]{jumpX, jumpY}); // 큐에 새로운 위치 추가
visited[jumpX][jumpY] = true; // 방문 처리
}
}
}
return false; // 도착점에 도달할 수 없는 경우
}
}
'알고리즘' 카테고리의 다른 글
[백준] 문제 2210번 : 숫자판 점프 - JAVA (0) | 2024.12.06 |
---|---|
[백준] 문제 13116 : 30번 - JAVA (0) | 2024.12.06 |
[백준] 문제 9934번 : 완전이진트리 - JAVA (0) | 2024.12.06 |
[백준] 문제 9372번 : 상근이의 여행 - JAVA (1) | 2024.12.05 |
[백준] 문제 2309번 : 일곱난쟁이 - JAVA (0) | 2024.12.05 |
[백준] 문제 1946번 : 신입 사원 - JAVA (0) | 2024.12.04 |
[백준] 문제 28114번 : 팀명 정하기 - JAVA (1) | 2024.12.02 |
[백준] 문제 1026번 : 보물 - JAVA (1) | 2024.12.01 |