[BOJ] 백준 3005. 탈출

2024. 2. 18. 15:49· Java/BOJ

문제

https://www.acmicpc.net/problem/3055

 

3055번: 탈출

사악한 암흑의 군주 이민혁은 드디어 마법 구슬을 손에 넣었고, 그 능력을 실험해보기 위해 근처의 티떱숲에 홍수를 일으키려고 한다. 이 숲에는 고슴도치가 한 마리 살고 있다. 고슴도치는 제

www.acmicpc.net


풀이

 하나의 지도 배열에 BFS가 두 번 쓰이는 문제입니다. 전형적인 BFS 문제에 물이 퍼지는 것을 고려해야하는 문제입니다. 

 

 특정 좌표에 몇 초 후에 물이 도달하는 지는 BFS를 통해 미리 구할 수 있습니다. time[][] 이라는 배열을 선언하여, 물이 미래에 도착할 시간을 저장하고, 고슴도치의 시간(depth)와 물이 도착하는 시간(time[][])을 비교해 문제를 해결했습니다.


소스코드

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main {
    static int N,M;
    static char[][] map;
    static int[][] time;
    static boolean[][] visited;
    static boolean[][] visited1;
    static int[] dr = {-1,1,0,0};
    static int[] dc = {0,0,-1,1};
    static  Queue<int[]> queue = new LinkedList<>();
    static  Queue<int[]> waters = new LinkedList<>();

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        N = sc.nextInt();
        M = sc.nextInt();
        map = new char[N][M];
        visited = new boolean[N][M];
        visited1 = new boolean[N][M];
        time = new int[N][M];

        for(int r=0;r<N;r++){
            String str = sc.next();
            for(int c=0;c<M;c++){
                time[r][c] = 2500;
                map[r][c] = str.charAt(c);
                if(map[r][c] == 'S'){
                    queue.add(new int[]{r,c,1});
                    visited[r][c] = true;
                }
                if(map[r][c]=='*'){
                    waters.add(new int[]{r,c,1});
                    time[r][c] = -1;
                }
            }
        }
        waterCheck();
        int ans = bfs();

        if(ans==-1) System.out.println("KAKTUS");
        else System.out.println(ans-1);
    }
    static int bfs(){
        while(!queue.isEmpty()){
            int[] info = queue.poll();
            int r = info[0];
            int c = info[1];
            int depth = info[2];

            if(map[r][c]=='D'){
                return depth;
            }
            for(int i = 0; i<4;i++){
                int idr = r+dr[i];
                int idc = c+dc[i];
                if(idr<0||idc<0||idr>=N||idc>=M) continue;
                if(visited[idr][idc]) continue;
                if(map[idr][idc]=='*'||map[idr][idc]=='X') continue;
                if(depth<time[idr][idc]) {
                   visited[idr][idc] = true;
                    queue.add(new int[]{idr, idc, depth + 1});
                }
            }
        }
        return -1;
    }
    static void waterCheck(){
        while(!waters.isEmpty()){
            int[] info = waters.poll();
            int r = info[0];
            int c = info[1];
            int depth = info[2];
            for(int i = 0; i<4;i++){
                int idr = r+dr[i];
                int idc = c+dc[i];
                if(idr<0||idc<0||idr>=N||idc>=M) continue;
                if(visited1[idr][idc]) continue;
                if(map[idr][idc]=='D'||map[idr][idc]=='X') continue;
                if(map[idr][idc]=='.'||map[idr][idc]=='S'){
                    visited1[idr][idc] = true;
                    time[idr][idc] = depth;
                    waters.add(new int[]{idr,idc,depth+1});
                }
            }
        }
    }
}

'Java > BOJ' 카테고리의 다른 글

[BOJ] 백준 25195. Yes or yes  (0) 2024.02.26
[BOJ] 백준 2573. 빙산  (0) 2024.02.22
[BOJ] 백준 11054. 가장 긴 바이토닉 부분 수열  (0) 2024.02.21
[BOJ] 백준 10610. 30  (0) 2024.02.20
[BOJ] 백준 1238. 파티  (0) 2024.01.20
'Java/BOJ' 카테고리의 다른 글
  • [BOJ] 백준 2573. 빙산
  • [BOJ] 백준 11054. 가장 긴 바이토닉 부분 수열
  • [BOJ] 백준 10610. 30
  • [BOJ] 백준 1238. 파티
동구름이
동구름이
동구름이
동구름
동구름이
전체
오늘
어제
  • 분류 전체보기 (178)
    • Java (63)
      • Java 를 파헤쳐보자 (13)
      • BOJ (45)
      • 프로그래머스 (3)
      • SWEA (1)
      • Java GUI (1)
    • JavaScript (17)
      • JS를 파헤쳐보자 (7)
      • 프로그래머스 (7)
      • JS 학습 정리 (1)
    • Backend (33)
      • Spring (3)
      • HTTP (7)
      • 프로젝트 (10)
      • MySQL (6)
      • Redis (3)
      • Elastic Search (1)
      • 인증, 인가 (3)
    • CS (57)
      • 운영체제 (35)
      • Network (22)
    • Git (2)
    • 개발 관련 이것저것 (2)
    • etc (1)
    • 독서 (0)
    • 사설 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 네트워크
  • 운영체제
  • 한양대
  • 백준
  • 큐
  • JCF
  • 반효경
  • BOJ
  • 모든 개발자를 위한 HTTP 웹 기본 지식
  • 인프런
  • 김영한
  • 구현
  • 자바스크립트
  • Java
  • 프로그래머스
  • 이석복
  • 스택
  • 자바
  • OS
  • 레디스

최근 글

hELLO · Designed By 정상우.v4.2.2
동구름이
[BOJ] 백준 3005. 탈출
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.