봉황대 in CS

[BOJ5212 - Python] 지구 온난화 본문

Problem Solvings/BOJ

[BOJ5212 - Python] 지구 온난화

등 긁는 봉황대 2022. 6. 29. 12:29

문제


 

5212번: 지구 온난화

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

www.acmicpc.net

 

지도를 입력받아 인접한 세 칸 이상이 바다인 땅을 없애서 지도를 출력하면 되는 문제이다.

 

땅은 'X', 바다는 '.'으로 표시하며, 지도의 범위를 벗어나는 칸은 모두 바다이다.

땅이 적어지기 때문에 지도의 크기도 함께 작아져야 하는 것을 유의해야 한다.

 

 

풀이


풀이를 위해 생각해야 하는 것은 2가지, 없어져야 하는 땅을 찾는 방법과 지도의 크기를 줄이는 방법이었다.

 

1. 없어져야 할 땅 찾기

지도 한 칸마다 탐색, 현재 보는 칸이 땅('X')일 경우 상하좌우로 확인한다.

만약 지도의 범위를 벗어나는 곳이라면 count + 1, 벗어나지 않는다면 바다인지 땅인지 확인 후 바다일 경우 count + 1

→ count >= 3인 부분이 없어져야 하는 땅의 위치이다.

 

2. 지도 크기 줄이기

새로 생성된 지도에서 삭제되어도 좋은 부분은 지도의 끄트머리(0번 행, -1번 행, 0번 열, -1번 열)가 전부 바다인 경우이다.

 

하지만 이를 한번씩만 확인해서는 안된다.

예를 들어 0번 행 뿐만 아니라 그 다음 1번 행도 전부 바다라서 둘 다 삭제 가능할 수 있기 때문이다.

 

따라서 해당 위치의 행 또는 열을 확인하여 만약 하나라도 땅이 있다면 확인을 종료,

전부 바다라면 지도에서 해당 부분을 삭제한 후 또다시 지도의 끄트머리를 확인하는 방향으로 while문을 작성하였다.

 

 

코드


import copy
import sys

R, C = map(int, sys.stdin.readline().split())

m = []
for _ in range(R):
    m.append(list(sys.stdin.readline().strip()))

d_r = (-1, 0, 1, 0)
d_c = (0, 1, 0, -1)

m_new = copy.deepcopy(m)
for r in range(R):
    for c in range(C):
        count = 0
        if m[r][c] == 'X':
            for i in range(4):
                cur_r = r + d_r[i]
                cur_c = c + d_c[i]

                if 0 <= cur_r < R and 0 <= cur_c < C:
                    if m[cur_r][cur_c] == '.':
                        count += 1
                else:
                    count += 1

        if count >= 3:
            m_new[r][c] = '.'

# 지도 크기 조정
while True:  # 행 [0]
    if 'X' not in m_new[0]:
        m_new.pop(0)
    else:
        break

while True:  # 행 [-1]
    if 'X' not in m_new[-1]:
        m_new.pop(-1)
    else:
        break

row_len = len(m_new)
while True:  # 열 [0]
    count = 0
    for r in range(row_len):
        if m_new[r][0] == 'X':
            break
        else:
            count += 1
    if count == row_len:
        for r in range(row_len):
            m_new[r].pop(0)
    else:
        break

while True:  # 열 [-1]
    count = 0
    for r in range(row_len):
        if m_new[r][-1] == 'X':
            break
        else:
            count += 1
    if count == row_len:
        for r in range(row_len):
            m_new[r].pop(-1)
    else:
        break

for r in m_new:
    print(''.join(r))

 

지도를 문자열 'X'와 '.'으로 입력받고 저장하였기 때문에 리스트와 문자열 처리에 관해서 까먹은 부분들이 있었다..

정리정리.

 

1. 문자열을 한 글자씩 끊어서 리스트로 변경

list(str)

 

2. 문자열 리스트를 하나의 문자열로 변환

''.join(lst)

 

 

반응형
Comments