Algorithm (PS)

[백준] 5212 지구온난화 Python 풀이

minjiwoo 2022. 10. 5. 18:00
728x90

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

 

5212번: 지구 온난화

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

www.acmicpc.net

 

문제 아이디어 

1. 이중 for문을 순회하면서 땅을 찾으면 상하좌우를 확인하여 인접 세칸 이상이 바다인지 확인한다 
단!!!! 여기서 지도의 의미는 섬을 포함한 최소 직사각형이므로, 지도 범위인 (r, c)를 초과하면 바다이다 

for i in range(r):
    for j in range(c):
        if array[i][j] == 'X': # 땅이면 인접 세칸 이상이 바다인지 확인하기
            count = 0
            for k in range(4):
                nx = i + dx[k]
                ny = j + dy[k]
                if 0 <= nx < r and 0 <= ny < c:
                    if array[nx][ny] == '.':
                        count += 1 # 인접한 칸 중 바다 개수 세주기
                else: # 지도 영역을 초과하면 바다이다 
                    count += 1
                    continue


잠기는 시점은 동시에 잠기는 것이므로, 인접한 칸 3칸 이상이 바다인 경우인 땅의 좌표를 sink 에 저장한 후 , 
sink 배열에 있는 좌표들만 땅에서 바다로 바꿔준다 

# 바다로 바꾸기
if len(sink) > 0:
    for x, y in sink:
        array[x][y] = '.'

 

# 5212 지구온난화

r, c = map(int, input().split())
array = [] # 지도
for _ in range(r):
    array.append(list(input()))

# 상하좌우 확인하기
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

sink = [] # 잠기게 되는 좌표들의 배열
for i in range(r):
    for j in range(c):
        if array[i][j] == 'X': # 땅이면 인접 세칸 이상이 바다인지 확인하기
            count = 0
            for k in range(4):
                nx = i + dx[k]
                ny = j + dy[k]
                if 0 <= nx < r and 0 <= ny < c:
                    if array[nx][ny] == '.':
                        count += 1 # 인접한 칸 중 바다 개수 세주기
                else:
                    count += 1
                    continue
            if count >= 3:
                sink.append((i, j))

# 바다로 바꾸기
if len(sink) > 0:
    for x, y in sink:
        array[x][y] = '.'


x1 = 0
y1 = c-1
x2 = 0
y2 = 0
# 지도 범위 구하기
for i in range(0, r):
    if 'X' in array[i]:
        x1 = i
        break
for i in range(r-1, -1, -1):
    if 'X' in array[i]:
        x2 = i
        break

for i in range(x1, x2+1):
    for j in range(c):
        if array[i][j] == 'X':
            y1 = min(y1, j)
            y2 = max(y2, j)

# 정답 출력하기
for i in range(x1, x2+1):
    for j in range(y1, y2+1):
        print(array[i][j], end='')
    print()

 

728x90