developer-ellen
인간 디버거의 로그 찍기
developer-ellen
전체 방문자
오늘
어제
  • 분류 전체보기 (217)
    • 회고록 (0)
    • 취뽀 및 커리어 여정의 Stack (2)
      • SSAFY 7기 (2)
    • 프로그래밍공부 (24)
      • c++ (0)
      • JAVA (3)
      • Spring (5)
      • design pattern (3)
      • BackDB (1)
      • Servlet&JSP (3)
      • Vue (4)
      • JPA (4)
      • Infra (1)
      • Linux (0)
    • AI (3)
      • papers (3)
      • trend (0)
    • 프로젝트진행 (0)
      • 데이터베이스 (0)
      • 서버개발 (0)
      • 인공지능 (0)
      • 하루정리 (0)
    • 포트폴리오 (0)
    • 알고리즘 (158)
      • 알고리즘문풀 (155)
      • 알고리즘공부 (3)
    • 통계공부 (15)
      • 시계열분석 (15)
      • 회귀분석 (0)
    • CS (14)
      • 컴퓨터네트워크 (4)
      • 운영체제 (8)
      • 데이터베이스 (2)
    • 주저리주저리 (0)
      • 필사 (0)
    • 취업관련정보 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • BOJ파이썬풀이
  • 백준파이썬풀이
  • c++ 빌더 패턴
  • 삼성코테기출자바풀이
  • c++디자인패턴
  • 시계열분석
  • 삼성코테자바풀이
  • 카카오코테java풀이
  • 삼성코테파이썬풀이
  • 데이터분석
  • 코테파이썬
  • 삼성코테파이썬
  • 카카오코테
  • ARIMA모형
  • 삼성코테구현풀이
  • SW역량테스트파이썬풀이
  • 시계열
  • 운영체제인터럽트
  • 삼성코테자바꿀팁
  • 삼성코테자바준비
  • MA모형
  • 삼성코테준비
  • 삼성코테구현문제추천
  • Arima
  • 통계학
  • 통계분석
  • AR모형
  • 삼성코테파이썬준비
  • SW역량테스트파이썬
  • 삼성코테기출

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
developer-ellen

인간 디버거의 로그 찍기

알고리즘/알고리즘문풀

BOJ - 불! 4179번 (JAVA)

2022. 5. 29. 22:48

❓ 문제 - 백준 불! 4179번 - JAVA 풀이법

 

출처 

(https://www.acmicpc.net/problem/4179)

 

4179번: 불!

입력의 첫째 줄에는 공백으로 구분된 두 정수 R과 C가 주어진다. 단, 1 ≤ R, C ≤ 1000 이다. R은 미로 행의 개수, C는 열의 개수이다. 다음 입력으로 R줄동안 각각의 미로 행이 주어진다.  각각의 문

www.acmicpc.net

 

 

📝 문제해결법

1. 이 문제는 BFS로 해결했다.

  • 불이 4방향 이동 -> 지훈이의 이동의 순서대로 진행되는 것이 이 문제의 포인트이다.
  • 방문처리는 따로 visited 배열로 하지 않고 map 2차원 배열에 F, J로 변경시켜줘서 방문을 체크했다.
  • 불이 4방향으로 이동할 때 범위 넘지 않고, 벽이 아닌 곳, 그리고 이미 불이 퍼진 곳을 제외하고 이동시켰다.
  • 지훈이도 4방향으로 이동할 때 그 위치에서 만약 범위를 넘는 곳이라면 가장자리이므로 탈출의 조건이므로 탈출 시간을 업데이트 후에 BFS를 빠져와서 정답을 출력하도록 했다.

 

2. 느낀점

  • 사실,, 테케 하나만 보고,, 이게 왜 3일까 계속 고민했던 문제! 하지만 찾아보니 불의 이동이 먼저라는 조건이 문제에 주어지지 않았지만 테케를 통해 예측해야했다..
  • 다음에 이런 경우가 생기면 순서를 다시 한번 생각해서 테케를 맞춰봐야겠다고 느꼈다.

 

💻 소스코드 (JAVA)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Time;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
	public static int n, m, ans;
	public static int[] dx = {-1, 1, 0, 0};
	public static int[] dy = {0, 0, -1, 1};
	public static char[][] map;
	public static class Node {
		int x;
		int y;
		int time;
		public Node(int x, int y, int time) {
			this.x = x;
			this.y = y;
			this.time = time;
		}
	}
	public static Queue<Node> jh, fire;
	
	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());
		m = Integer.parseInt(st.nextToken());
		jh = new LinkedList<>();
		fire = new LinkedList<>();
		
		
		map = new char[n][m];
		for(int i=0;i<n;i++) {
			map[i] = br.readLine().toCharArray();
			for(int j=0;j<m;j++) {
				if(map[i][j] == 'J') {
					jh.add(new Node(i, j, 0));
				}
				
				if(map[i][j] == 'F') {
					fire.add(new Node(i, j, 0));
				}
			}
		}
		
		ans = 0;
		
		if(bfs()) {
			System.out.println("IMPOSSIBLE");
		} else {
			System.out.println(ans);
		}
	
		
		
		
	}
	
	public static boolean bfs() {
		// 불 먼저
		while(!jh.isEmpty()) {
			int f_size = fire.size();
			for(int i=0;i<f_size;i++) {
				Node node = fire.poll();
				
				for(int d=0;d<4;d++) {
					int nx = node.x + dx[d];
					int ny = node.y + dy[d];
					if(0 <= nx && nx < n && 0 <= ny && ny < m) {
						if(map[nx][ny] != '#' && map[nx][ny] !='F') {
							map[nx][ny] = 'F';
							fire.add(new Node(nx, ny, node.time+1));
						}
					} 
				}
				
			}
			
			int j_size = jh.size();
			
			for(int i=0;i<j_size;i++) {
				Node node = jh.poll();
				
				for(int d=0;d<4;d++) {
					int nx = node.x + dx[d];
					int ny = node.y + dy[d];
					if(nx < 0 || nx >= n || ny < 0 || ny >= m) {
						ans = node.time+1;
						return false;
					}
					
					
					if(map[nx][ny] != '#' && map[nx][ny] !='F' && map[nx][ny] != 'J') {
							jh.add(new Node(nx, ny, node.time+1)); 
							map[nx][ny] = 'J';
					}
					
				}
				
			}
			
		}
		return true;

	}

}

'알고리즘 > 알고리즘문풀' 카테고리의 다른 글

2021 KAKAO BLIND RECRUITMENT - 합승 택시 요금 (JAVA)  (0) 2022.06.02
BOJ - 인내의 도미노 장인 호석 20165번 (JAVA)  (0) 2022.06.02
BOJ - 샘터 18513번 (JAVA)  (0) 2022.05.22
BOJ - 대기업 승범이네 17831번 (JAVA, Python)  (0) 2022.05.16
BOJ - 우수 마을 1949번 (JAVA, Python)  (0) 2022.05.11
    '알고리즘/알고리즘문풀' 카테고리의 다른 글
    • 2021 KAKAO BLIND RECRUITMENT - 합승 택시 요금 (JAVA)
    • BOJ - 인내의 도미노 장인 호석 20165번 (JAVA)
    • BOJ - 샘터 18513번 (JAVA)
    • BOJ - 대기업 승범이네 17831번 (JAVA, Python)
    developer-ellen
    developer-ellen

    티스토리툴바