일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 페이지 대치
- 트랩
- fork()
- 동기화
- 추상화
- concurrency
- 컴퓨터구조
- 알고리즘
- PYTHON
- 가상 메모리
- 인터럽트
- 페이지 부재율
- mutex
- 우선순위
- 부동소수점
- 페이징
- 세마포어
- 백준
- Algorithm
- 프로세스
- 교착상태
- BOJ
- 운영체제
- 단편화
- mips
- 스케줄링
- 기아 상태
- Oracle
- ALU
- 스레드
- Today
- Total
봉황대 in CS
[BOJ5212 - Python] 지구 온난화 본문
문제
지도를 입력받아 인접한 세 칸 이상이 바다인 땅을 없애서 지도를 출력하면 되는 문제이다.
땅은 '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)
'Problem Solvings > BOJ' 카테고리의 다른 글
[BOJ20055 - Python] 컨베이어 벨트 위의 로봇 (0) | 2022.07.02 |
---|---|
[BOJ20058 - Python] 마법사 상어와 파이어스톰 (0) | 2022.07.01 |
[BOJ20057 - Python] 마법사 상어와 토네이도 (0) | 2022.06.28 |
[BOJ14719 - Python] 빗물 (0) | 2022.06.27 |
[BOJ15685 - Python] 드래곤 커브 (0) | 2022.06.27 |