광규니
광규니네
광규니
전체 방문자
오늘
어제
  • 분류 전체보기 (154)
    • 알고리즘 (100)
      • 알고리즘 개념 (2)
      • 문제 풀이 (96)
    • 주절주절 (19)
      • 자격증, 활동 후기 (4)
      • 전시회 후기 (3)
      • 이모저모 (2)
      • 회고 (3)
      • 뜨럼 (7)
    • 운영체제 (9)
    • 개발 지식 (9)
      • Apple Watch (4)
      • MySQL (2)
      • Eclipse (1)
      • XCode (1)
    • 네트워크 공부 (1)
    • 데이터베이스 공부 (5)
    • Java 공부 (7)
    • TMP (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 구현
  • 프로그래머스
  • 자바
  • 애플워치 앱 만들기
  • 애플워치 앱
  • 파이썬
  • 합주
  • 개념
  • DP
  • 다이나믹 프로그래밍
  • 컴퓨터 사이언스
  • 드린이
  • BOJ
  • 티스토리챌린지
  • 운영체제
  • 오블완
  • 백준
  • OS
  • 알고리즘
  • BFS

최근 댓글

최근 글

티스토리

250x250
hELLO · Designed By 정상우.
광규니

광규니네

알고리즘/문제 풀이

[Java/자바 백준 2589] 보물섬

2022. 1. 3. 21:31
반응형

풀이

bfs로 해결 가능한 문제

 

'L' 육지인 상황마다 가장 먼 육지와의 거리를 계산해주는 문제입니다.

visited 를 -1로 모두 초기화해서 현재 위치와 가장 먼 육지를 계산하고

bfs가 진행될 때마다 현재 가장 먼 거리를 가지고 있는 answer와 비교

import java.io.*;
import java.util.*;

public class Main {
	static int N, M, answer;
	static char[][] map;
	static Queue<int[]> queue = new LinkedList<int[]>();
	static int[] dx = {-1,0,1,0};
	static int[] dy = {0,1,0,-1};
	
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		map = new char[N][M];
		for(int i = 0 ; i < N ; i++) {
			String tmp = br.readLine();
			for(int j = 0 ; j < M ; j++) {
				map[i][j] = tmp.charAt(j);
			}
		}
		
		for(int i = 0 ; i < N ; i++) {
			for(int j = 0 ; j < M ; j++) {
				if(map[i][j] == 'L') {
					bfs(i,j);
				}
			}
		}
		System.out.println(answer);
	}
	
	private static void bfs(int x, int y) {
		int[][] visited = new int[N][M];
		for(int i = 0 ; i< N ; i++) {
			for(int j=0 ; j < M ; j++) {
				visited[i][j] = -1;
			}
		}
		
		visited[x][y] = 0;
		queue.offer(new int[] {x, y});
		
		while(! queue.isEmpty()) {
			int[] cur = queue.poll();
			int curX = cur[0];
			int curY = cur[1];
			
			for(int i = 0 ; i < 4 ; i++) {
				int nx = curX + dx[i];
				int ny = curY + dy[i];
				
				if(nx < 0 || nx >= N || ny < 0 || ny >= M) continue;
				
				if(map[nx][ny] == 'L' && visited[nx][ny] == -1) {
					visited[nx][ny] = visited[curX][curY] + 1;
					queue.offer(new int[] {nx, ny});
					answer = Math.max(answer, visited[nx][ny]);
				}
			}
		}
	}
}
반응형
저작자표시 (새창열림)

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

[Java/자바 20055 백준] 컨베이어 벨트 위의 로봇  (0) 2022.01.05
[Java/자바 백준 19238] 스타트 택시  (0) 2022.01.04
[Java/자바 백준 14503] 로봇 청소기  (0) 2022.01.03
[Java/자바 백준 23288] 주사위굴리기2  (0) 2021.11.16
[Java/자바 백준 17143] 낚시왕  (0) 2021.11.11
    '알고리즘/문제 풀이' 카테고리의 다른 글
    • [Java/자바 20055 백준] 컨베이어 벨트 위의 로봇
    • [Java/자바 백준 19238] 스타트 택시
    • [Java/자바 백준 14503] 로봇 청소기
    • [Java/자바 백준 23288] 주사위굴리기2
    광규니
    광규니
    공부 및 일상 올리기~

    티스토리툴바