https://www.acmicpc.net/problem/5212
문제
푸르고 아름다운 남해에는 많은 섬이 장관을 이루고 있다. 그림이 아니면 볼 수 없을 것 같은 아름다운 장관을 실제로 볼 수 있는 다도해로 상근이는 여행을 떠났다.
다도해에 도착한 상근이는 서울에서 보던 것과는 다른 풍경에 큰 충격을 받았다. 지구 온난화로 인해 해수면이 상승해 섬의 일부가 바다에 잠겨버렸다.
서울로 다시 돌아온 상근이는 이렇게 지구 온난화가 계속 될 경우 남해의 지도는 어떻게 바뀔지 궁금해졌다.
다도해의 지도는 R*C 크기의 그리드로 나타낼 수 있다. 'X'는 땅을 나타내고, '.'는 바다를 나타낸다.
50년이 지나면, 인접한 세 칸 또는 네 칸에 바다가 있는 땅은 모두 잠겨버린다는 사실을 알았다.
상근이는 50년 후 지도를 그려보기로 했다. 섬의 개수가 오늘날보다 적어질 것이기 때문에, 지도의 크기도 작아져야 한다. 지도의 크기는 모든 섬을 포함하는 가장 작은 직사각형이다. 50년이 지난 후에도 섬은 적어도 한 개 있다. 또, 지도에 없는 곳, 지도의 범위를 벗어나는 칸은 모두 바다이다.
입력
첫째 줄에 지도의 크기 R과 C (1 ≤ R, C ≤ 10)가 주어진다. 다음 R개 줄에는 현재 지도가 주어진다.
출력
50년 후의 지도를 출력한다.
예제 입력 1 복사
5 3
...
.X.
.X.
.X.
...
예제 출력 1 복사
X
예제 입력 2 복사
3 10
..........
..XXX.XXX.
XXX.......
예제 출력 2 복사
.XX...X
XX.....
1. 맵을 돌면서 시작점 X(섬)를 찾는다.
2. 해당 시작점으로부터 인접한 바다(.)를 찾는다
- 바다의 개수가, 3개 이상인 경우에는 해당 지점을 .(바다) 처리한다.
3. 출력 조건에 맞게 잘라줘야한다.
- 양 꼭지점만 알면된다.
- X가 있는 row의 최대점, 최소점을 찾는다, col의 최대점 최소점을 찾는다.
import sys
sys.stdin = open("3_1_20220822_백준_5212_지구온난화.txt", "r")
import copy
n, m = map(int, input().split())
board = []
for _ in range(n) :
line = input()
temp = []
for j in line :
temp.append(j)
board.append(temp)
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
newBoard = copy.deepcopy(board) #새롭게 바다 채워넣을 보드 생성
def checkPos(nowX, nowY) :
closeCount = 0
for d in range(4) :
nextX = nowX + dx[d]
nextY = nowY + dy[d]
#왼쪽-1, 위-1 벽인 경우에는 카운트만 증가
#오른m, 아래 n 벽인 경우에는 카운트만 증가
if nextX < 0 or nextY < 0 or n <= nextX or m <= nextY :
closeCount += 1
continue
#범위 내에 있고, 바다인 경우 카운트 증가
if board[nextX][nextY] == "." :
closeCount += 1
#인접카운트가 3개 이상인 경우 now 좌표에 있는 값을 바다(.)로 변경해주기
if 3 <= closeCount <= 4 :
newBoard[nowX][nowY] = "."
#1. X 찾기
for i in range(n) :
for j in range(m) :
if board[i][j] == "X" :
checkPos(i, j) #2. 시작점 섬(X) 찾고 4방향 체크
#3. 출력에 맞게 바다 잘라주기
minRow = n - 1
maxRow = -1
minCol = m - 1
maxCol = -1
#땅인 경우만 생각해서 x, y의 최소 최대값 위치만 찾아준다.
for rowIdx, rowValue in enumerate(newBoard) :
for colIdx in range(len(rowValue)) :
if newBoard[rowIdx][colIdx] == 'X' :
minRow = min(minRow, rowIdx)
maxRow = max(maxRow, rowIdx)
minCol = min(minCol, colIdx)
maxCol = max(maxCol, colIdx)
#4. 좌표에 맞게 50년뒤 섬 지도 잘라주기
for i in range(minRow, maxRow + 1) :
for j in range(minCol, maxCol + 1) :
print(newBoard[i][j], end="")
print()
#R*C 크기의 그리드
#'X'는 땅
#'.'는 바다
#50년이 지나면, 인접한 세 칸 또는 네 칸에 바다가 있는 땅은 모두 잠겨
#지도에 없는 곳, 지도의 범위를 벗어나는 칸은 모두 바다
'코테풀이 > 구현' 카테고리의 다른 글
[백준 | 실버3] 2108: 통계학(구현) (0) | 2022.08.30 |
---|---|
[백준 | 실버3] 프린터 큐(구현) (1) | 2022.08.30 |
[백준 | 실버2] 19583 : 싸이버개강총회(구현) (0) | 2022.08.17 |
[백준 | 실버3] 3474번 : 교수가된현우(수학) (0) | 2022.08.11 |
[백준 | 실버5] 4659번 : 비밀번호 발음하기(구현, 시뮬레이션) (0) | 2022.08.10 |