본문 바로가기
백준

백준 5212번 : 지구 온난화

by Huiyeong 2021. 7. 20.

 문제

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

 

5212번: 지구 온난화

첫째 줄에 지도의 크기 R과 C (1 ≤ R, C ≤ 10)가 주어진다. 다음 R개 줄에는 현재 지도가 주어진다.

www.acmicpc.net

5212 지구 온난화

 

 구현 방법

구현 방법이 간단하기 때문에 순서로 나타내보았습니다.

  1. 입력 시 섬을 모두 리스트에 저장한다.
  2. 하나씩 꺼내서 4방을 탐색하며 주변 바다 개수를 카운팅 한다.
  3. 카운팅한 값이 3이상이면 잠기는 섬이므로 새로운 맵에 .으로 값을 저장해준다.
  4. 가장 위 왼쪽에서부터 출발 행, 출발 열을 구하고 가장 아래 오른쪽에서부터 도착 행, 도착 열 값을 구해준다.
  5. 출발 행부터 도착 행까지 출발 열부터 도착 열까지의 값만 출력해준다.

 

 구현 코드

package BOJ.Silver;

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

public class BOJ5212_지구온난화 {
	static int R, C, cnt, fR, eR, fC, eC;
	static int[][] dir = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}};
	static char[][] map, afterMap;
	static List<int[]> list;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		R = Integer.parseInt(st.nextToken());
		C = Integer.parseInt(st.nextToken());
		map = new char[R][C];
		afterMap = new char[R][C];
		list = new ArrayList<>();
		for (int r=0;r<R;r++) {
			String input = br.readLine();
			for (int c=0;c<C;c++) {
				map[r][c] = input.charAt(c);
				afterMap[r][c] = input.charAt(c);
				// 섬은 리스트에 전부 저장
				if (map[r][c]=='X') list.add(new int[] {r, c}); 
			}
		}
		afterYear();
		// 출력하기 위한 범위 구하기
		print(); 
		
		for (int r=fR;r<=eR;r++) {
			for (int c=fC;c<=eC;c++) {
				System.out.print(afterMap[r][c]);
			}
			System.out.println();
		}
	}
	
	static void afterYear() {
		for (int i=0;i<list.size();i++) {
			cnt = 0;
			int[] now = list.get(i);
			for (int d=0;d<4;d++) {
				int nr = now[0]+dir[d][0];
				int nc = now[1]+dir[d][1];
				// 주변 바다 개수 세기
				if (!isIn(nr, nc) || (isIn(nr, nc) && map[nr][nc]=='.')) cnt++; 
			}
			// 주변 바다가 3개 이상일 때 섬은 사라짐
			if (cnt>=3) afterMap[now[0]][now[1]] = '.'; 
		}
	}	
	
	static void print() {
		// fR : 출발 행, eR : 도착 행, fC : 출발 열, eC :도착 열
		fR = R; eR = -1; fC = C; eC = -1; 
		
		// 출발 행, 출발 열 구하기
		for (int r=0;r<R;r++) { // 가장 위
			for (int c=0;c<C;c++) { // 왼쪽에서 부터
				if (afterMap[r][c]=='X') {
					// 가장 먼저 섬을 발견하는 행이 출발 행
					if (fR==R) fR = r;
					// 가장 왼쪽에 있는 섬 구하기
					if (fC>c) fC = c; 
					break;
				}
			}
		}
		// 도착 행, 도착 열 구하기
		for (int r=R-1;r>=0;r--) { // 가장 밑 
			for (int c=C-1;c>=0;c--) { // 오른쪽에서 부터
				if (afterMap[r][c]=='X') { 
					// 밑에서부터 시작하여 가장 먼저 발견하는 행이 도착 행
					if (eR==-1) eR = r;
					// 가장 오른쪽에 있는 섬 구하기
					if (eC<c) eC = c; 
					break;
				}
			}
		}
	}
	
	static boolean isIn(int nr, int nc) {
		return nr>=0 && nr<R && nc>=0 && nc<C;
	}
}

 

정답!

'백준' 카테고리의 다른 글

백준 1113번 : 수영장 만들기  (0) 2021.07.23
백준 20057번 : 마법사 상어와 토네이도  (0) 2021.07.21
백준 14719번 : 빗물  (0) 2021.07.20
백준 5558번 : 치즈  (0) 2021.07.18
백준 18404번 : 현명한 나이트  (0) 2021.07.11