[백준/Python] 5212번 - 지구 온난화

Sujin Lee·2022년 9월 20일
0

코딩테스트

목록 보기
114/172
post-thumbnail

문제

백준 5212번 - 지구 온난화

Python 문법

1. 리스트 복사

2. continue

3. for ~ else

해결 과정

  • 이중포문으로 섬일 때 상하좌우가 바다인지 확인한다.
    • 섬이 없다면 밑에 조건에 의해 1개라도 있어야하니까 섬의 갯수를 확인하면서 반복문을 돈다. land_cnt += 1
    • 모서리에 섬이 있을 경우
      • 상하좌우는 지도 범위 밖으로 넘어가며 해당 칸은 바다로 취급하여 카운트한다.
    • 모서리가 아닌 부분에 섬이 있을 경우
      • 상하좌우가 바다인 경우를 카운트한다.
    • 카운트한 값이 3이상일 때 해당 섬을 바다로 바꿔서 새로운 리스트(result)에 넣는다.
    • 섬을 바다로 바꿨으므로 land_cnt -= 1
  • 모든 섬을 포함하는 가장 작은 직사각형의 지도 크기를 만들어야한다.
    • 우선 섬이 한개도 없다면 X를 출력
    • 섬이 있다면
      • 'X'가 있는 첫 행 (startR)
      • 'X'가 있는 마지막 행 (endR)
    • 첫 행부터 마지막 행까지 번갈아가면서 열을 확인한다.
      • 해당 행과 열이 'X'라면 해당 열을 idx에 넣는다.
      • idx는 'X'가 있는 열의 인덱스

시행착오

  • 잠긴다는 건 바다로 변한다는 건가? -> 바다로 변하는 건데 바다로 변한 섬을 카운트 하면 안됨
  • 파이썬 리스트 복사..
  • 왜 틀린거지 예시는 맞는데요
import sys
import copy
R, C = map(int,sys.stdin.readline().split())
graph = []

for _ in range(R):
  graph.append(list(sys.stdin.readline().strip()))

result = copy.deepcopy(graph)

dx = [0,0,-1,1]
dy = [-1,1,0,0]

for i in range(R):
  for j in range(C):
    cnt = 0
    if graph[i][j] =='X':
      for z in range(4):
        nx = i + dx[z]
        ny = j + dy[z]
        # 모서리에 섬이 있을 때
        # 인접한 칸은 범위 밖으로 넘어가며 바다라고 취급하여 카운트한다.
        if 0 > nx or nx >= R or 0 > ny or ny >= C:
          cnt += 1
        # 모서리가 아닌 부분에 섬이 있을 때
        # 0 <= nx < R and 0 <= ny <= C
        elif graph[nx][ny] == '.':
          cnt += 1
      if cnt >= 3:
        result[i][j] = '.'

# 모든 섬을 포함하는 가장 작은 직사각형으로 지도의 크기 자르기
answer = []
for i in result:
  if 'X' in i:
    answer.append(i)  

start = 0
end = len(result[0]) - 1

# 플래그 이용
# 50년 후 지도 시작 부분
flag = True
while flag:
  for i in answer:
    if i[start] == 'X':
      flag = False
      break
  else:
    start += 1
      
# 50년 후 지도 끝나는 부분
flag = True  
while flag:
  for i in answer:
    if i[end] == 'X':
      flag = False
      break 
  else:  
    end  -= 1

for i in answer:
  print(''.join(i[start:end+1]))

풀이

import sys
import copy

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

for _ in range(R):
  graph.append(list(sys.stdin.readline().strip()))

result = copy.deepcopy(graph)
land_cnt = 0
dx = [0,0,-1,1]
dy = [-1,1,0,0]

for i in range(R):
  for j in range(C):
    if graph[i][j] =='X':
      cnt = 0
      land_cnt += 1
      for z in range(4):
        nx = i + dx[z]
        ny = j + dy[z]
        # 모서리에 섬이 있을 때
        # 인접한 칸은 범위 밖으로 넘어가며 바다라고 취급하여 카운트한다.
        if 0 > nx or nx >= R or 0 > ny or ny >= C:
          cnt += 1
        # 모서리가 아닌 부분에 섬이 있을 때
        # 0 <= nx < R and 0 <= ny <= C
        elif graph[nx][ny] == '.':
          cnt += 1
      if cnt >= 3:
        result[i][j] = '.'
        land_cnt -= 1
        
if land_cnt == 0:
  print('X')
else:
  startR = 0
  endR = 0
  for i in range(R):
    if 'X' in result[i]:
      startR = i
      break
  for i in range(R-1,-1,-1):
    if 'X' in result[i]:
      endR = i
      break
  
  idx = []
  for j in range(C):
    for i in range(startR, endR + 1):
      if 'X' == result[i][j]:
        idx.append(j)
        break

  for i in result[startR:endR+1]:
    print(''.join(i[idx[0]:idx[-1]+1]))
  
profile
공부한 내용을 기록하는 공간입니다. 📝

0개의 댓글