5212번: 지구 온난화
첫째 줄에 지도의 크기 R과 C (1 ≤ R, C ≤ 10)가 주어진다. 다음 R개 줄에는 현재 지도가 주어진다.
www.acmicpc.net
문제
푸르고 아름다운 남해에는 많은 섬이 장관을 이루고 있다. 그림이 아니면 볼 수 없을 것 같은 아름다운 장관을 실제로 볼 수 있는 다도해로 상근이는 여행을 떠났다.
다도해에 도착한 상근이는 서울에서 보던 것과는 다른 풍경에 큰 충격을 받았다. 지구 온난화로 인해 해수면이 상승해 섬의 일부가 바다에 잠겨버렸다.
서울로 다시 돌아온 상근이는 이렇게 지구 온난화가 계속 될 경우 남해의 지도는 어떻게 바뀔지 궁금해졌다.
다도해의 지도는 R*C 크기의 그리드로 나타낼 수 있다. 'X'는 땅을 나타내고, '.'는 바다를 나타낸다.
50년이 지나면, 인접한 세 칸 또는 네 칸에 바다가 있는 땅은 모두 잠겨버린다는 사실을 알았다.
상근이는 50년 후 지도를 그려보기로 했다. 섬의 개수가 오늘날보다 적어질 것이기 때문에, 지도의 크기도 작아져야 한다. 지도의 크기는 모든 섬을 포함하는 가장 작은 직사각형이다. 50년이 지난 후에도 섬은 적어도 한 개 있다. 또, 지도에 없는 곳, 지도의 범위를 벗어나는 칸은 모두 바다이다.
입력
첫째 줄에 지도의 크기 R과 C (1 ≤ R, C ≤ 10)가 주어진다. 다음 R개 줄에는 현재 지도가 주어진다.
출력
50년 후의 지도를 출력한다.
코드
r, c = map(int, input().split())
map_data = []
for _ in range(r):
map_data.append(list(input()))
# 섬이 사라질지 말지?
def island_remove(x, y):
cnt = 0
for dx, dy in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
nx = x + dx
ny = y + dy
# 바다인지
if (nx < 0 or nx >= r or ny < 0 or ny >= c) or map_data[nx][ny] == '.':
cnt += 1
if cnt >= 3:
return True
else:
return False
# 사라진 섬들 처리
def map_change(arr):
for x, y in arr:
map_data[x][y] = '.'
# 맵 데이터 출력
def print_map():
sr, er = 0, r-1 # 시작행, 끝나는행
sc, ec = 0, c-1 # 시작열, 끝나는열
sr_find, er_find = False, False
sc_find, ec_find = False, False
# 지도 시작하는 행, 끝나는 행 찾기
for i in range(r//2+1):
if sr_find and er_find:
break
for j in range(c):
# 시작행
if map_data[i][j] == 'X' and not sr_find:
sr = i
sr_find = True
# 끝나는 행
if map_data[r-1-i][j] == 'X' and not er_find:
er = r-1-i
er_find = True
# 지도 시작하는 열, 끝나는 열 찾기
for i in range(c//2+1):
if sc_find and ec_find:
break
for j in range(r):
# 시작열
if map_data[j][i] == 'X' and not sc_find:
sc = i
sc_find = True
# 끝나는 열
if map_data[j][c-1-i] == 'X' and not ec_find:
ec = c-1-i
ec_find = True
# 맵 출력
for i in range(sr, er+1):
for j in range(sc, ec+1):
print(map_data[i][j], end='')
print()
remove_islands = []
for i in range(r):
for j in range(c):
if map_data[i][j] == 'X':
if island_remove(i, j):
remove_islands.append((i, j))
map_change(remove_islands)
print_map()
'문제풀이 > 구현' 카테고리의 다른 글
[Python/파이썬] 백준 12933번 오리 (0) | 2023.04.22 |
---|---|
[Python/파이썬] 백준 1713번 후보 추천하기 (0) | 2023.04.21 |
[Python/파이썬] 백준 20436번 ZOAC 3 (0) | 2023.04.20 |
[Python/파이썬] 백준 10994번 별 찍기 - 19 (0) | 2023.04.19 |
[Python/파이썬] 백준 1244번 스위치 켜고 끄기 (0) | 2023.04.19 |
5212번: 지구 온난화
첫째 줄에 지도의 크기 R과 C (1 ≤ R, C ≤ 10)가 주어진다. 다음 R개 줄에는 현재 지도가 주어진다.
www.acmicpc.net
문제
푸르고 아름다운 남해에는 많은 섬이 장관을 이루고 있다. 그림이 아니면 볼 수 없을 것 같은 아름다운 장관을 실제로 볼 수 있는 다도해로 상근이는 여행을 떠났다.
다도해에 도착한 상근이는 서울에서 보던 것과는 다른 풍경에 큰 충격을 받았다. 지구 온난화로 인해 해수면이 상승해 섬의 일부가 바다에 잠겨버렸다.
서울로 다시 돌아온 상근이는 이렇게 지구 온난화가 계속 될 경우 남해의 지도는 어떻게 바뀔지 궁금해졌다.
다도해의 지도는 R*C 크기의 그리드로 나타낼 수 있다. 'X'는 땅을 나타내고, '.'는 바다를 나타낸다.
50년이 지나면, 인접한 세 칸 또는 네 칸에 바다가 있는 땅은 모두 잠겨버린다는 사실을 알았다.
상근이는 50년 후 지도를 그려보기로 했다. 섬의 개수가 오늘날보다 적어질 것이기 때문에, 지도의 크기도 작아져야 한다. 지도의 크기는 모든 섬을 포함하는 가장 작은 직사각형이다. 50년이 지난 후에도 섬은 적어도 한 개 있다. 또, 지도에 없는 곳, 지도의 범위를 벗어나는 칸은 모두 바다이다.
입력
첫째 줄에 지도의 크기 R과 C (1 ≤ R, C ≤ 10)가 주어진다. 다음 R개 줄에는 현재 지도가 주어진다.
출력
50년 후의 지도를 출력한다.
코드
r, c = map(int, input().split()) map_data = [] for _ in range(r): map_data.append(list(input())) # 섬이 사라질지 말지? def island_remove(x, y): cnt = 0 for dx, dy in [(0, 1), (0, -1), (1, 0), (-1, 0)]: nx = x + dx ny = y + dy # 바다인지 if (nx < 0 or nx >= r or ny < 0 or ny >= c) or map_data[nx][ny] == '.': cnt += 1 if cnt >= 3: return True else: return False # 사라진 섬들 처리 def map_change(arr): for x, y in arr: map_data[x][y] = '.' # 맵 데이터 출력 def print_map(): sr, er = 0, r-1 # 시작행, 끝나는행 sc, ec = 0, c-1 # 시작열, 끝나는열 sr_find, er_find = False, False sc_find, ec_find = False, False # 지도 시작하는 행, 끝나는 행 찾기 for i in range(r//2+1): if sr_find and er_find: break for j in range(c): # 시작행 if map_data[i][j] == 'X' and not sr_find: sr = i sr_find = True # 끝나는 행 if map_data[r-1-i][j] == 'X' and not er_find: er = r-1-i er_find = True # 지도 시작하는 열, 끝나는 열 찾기 for i in range(c//2+1): if sc_find and ec_find: break for j in range(r): # 시작열 if map_data[j][i] == 'X' and not sc_find: sc = i sc_find = True # 끝나는 열 if map_data[j][c-1-i] == 'X' and not ec_find: ec = c-1-i ec_find = True # 맵 출력 for i in range(sr, er+1): for j in range(sc, ec+1): print(map_data[i][j], end='') print() remove_islands = [] for i in range(r): for j in range(c): if map_data[i][j] == 'X': if island_remove(i, j): remove_islands.append((i, j)) map_change(remove_islands) print_map()
'문제풀이 > 구현' 카테고리의 다른 글
[Python/파이썬] 백준 12933번 오리 (0) | 2023.04.22 |
---|---|
[Python/파이썬] 백준 1713번 후보 추천하기 (0) | 2023.04.21 |
[Python/파이썬] 백준 20436번 ZOAC 3 (0) | 2023.04.20 |
[Python/파이썬] 백준 10994번 별 찍기 - 19 (0) | 2023.04.19 |
[Python/파이썬] 백준 1244번 스위치 켜고 끄기 (0) | 2023.04.19 |