CS/알고리즘 문제 풀이

[백준] 14502 - 연구소 [Python(파이썬)]

2021. 1. 6. 02:20
목차
  1. 문제
  2. 풀이
  3. 코드

문제

www.acmicpc.net/problem/14502

 

14502번: 연구소

인체에 치명적인 바이러스를 연구하던 연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고, 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다. 연구소는 크

www.acmicpc.net

 

풀이

이 문제는 두 가지의 작은 문제로 분할하여 생각해볼 수 있다.

1) 벽을 어떻게 세울 것인가?

2) 어떻게 탐색을 할 것인가?

 

BFS/DFS문제를 어느 정도 접해본 사람이라면 2)는 문제가 되지 않을 것이다.

그러나 문제는 바로 1)이다.

이 문제의 경우엔 n, m의 범위가 작기 때문에 브루트 포스를 이용하면 된다.

 

재귀를 이용하는 방법도 있지만, 시간을 줄이기 위해 처음 입력을 받을 때부터 빈 칸(0)의 좌표를 리스트에 저장해둔다.

 

그 다음 삼중 for문을 통해 3개의 벽을 세운다. 벽을 세운 후엔 바이러스를 퍼트리고(BFS 탐색), 세운 벽을 곧바로 허문다.

 

BFS탐색은 간단하다. 입력받을 때 체크해뒀던 바이러스의 좌표를 하나씩 큐에 담아준 후, 탐색을 시작하면 된다.

모든 탐색이 끝나면 빈 칸의 개수를 체크해서 기존의 최댓값보다 크다면 교체한다.

 

코드

import sys, copy, collections

n, m = map(int, sys.stdin.readline().split())
max_num = 0

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

EMPTY = 0
WALL = 1
VIRUS = 2

# 입력
g = [[0]*m for _ in range(n)]

for y in range(n):
    raw = [int(x) for x in sys.stdin.readline().split()]

    for x in range(m):
        g[y][x] = raw[x]
        if g[y][x] == EMPTY:
            empty_list.append([y, x])
        if g[y][x] == VIRUS:
            virus_list.append([y, x])

# bfs 탐색
def bfs(ng):
    q = collections.deque([])
    visited = [[False]*m for _ in range(n)]
    cnt = 0
    global max_num

    for virus in virus_list:
        q.append(virus)

    while q:
        cy, cx = q.popleft()

        for i in range(4):
            ny = cy + dy[i]
            nx = cx + dx[i]

            if ny < 0 or ny >= n or nx < 0 or nx >= m:
                continue
            if ng[ny][nx] == EMPTY and visited[ny][nx] == False:
                q.append([ny, nx])
                ng[ny][nx] = VIRUS
                visited[ny][nx] = True
    
    for i in range(n):
        cnt += ng[i].count(EMPTY)
    
    if max_num < cnt:
        max_num = cnt

# 벽 세우기
for i in range(len(empty_list)):
    for j in range(i):
        for k in range(j):
            y1, x1 = empty_list[i]
            y2, x2 = empty_list[j]
            y3, x3 = empty_list[k]

            g[y1][x1] = WALL
            g[y2][x2] = WALL
            g[y3][x3] = WALL

            ng = copy.deepcopy(g)
            bfs(ng)

            g[y1][x1] = EMPTY
            g[y2][x2] = EMPTY
            g[y3][x3] = EMPTY

print(max_num)
저작자표시 비영리 (새창열림)

'CS > 알고리즘 문제 풀이' 카테고리의 다른 글

[백준] 4963 - 섬의 개수 [Python(파이썬)]  (0) 2021.01.10
[백준] 6603 - 로또 [Python(파이썬)]  (0) 2021.01.07
[백준] 11052 - 카드 구매하기 [Python(파이썬)]  (0) 2021.01.06
[백준] 10844 - 쉬운 계단 수 [Python(파이썬)]  (3) 2021.01.06
[백준] 1149 - RGB거리 [Python(파이썬)]  (0) 2021.01.06
  1. 문제
  2. 풀이
  3. 코드
'CS/알고리즘 문제 풀이' 카테고리의 다른 글
  • [백준] 4963 - 섬의 개수 [Python(파이썬)]
  • [백준] 6603 - 로또 [Python(파이썬)]
  • [백준] 11052 - 카드 구매하기 [Python(파이썬)]
  • [백준] 10844 - 쉬운 계단 수 [Python(파이썬)]
코택
코택
코택
TaxFree
코택
전체
오늘
어제
  • 분류 전체보기 (369)
    • Spring (29)
      • Spring (18)
      • 스프링 핵심 원리 - 고급편 (11)
    • Spring Batch (4)
    • JPA (4)
    • CS (89)
      • 자료구조 (2)
      • 네트워크 (5)
      • 운영체제 (1)
      • 데이터베이스 (4)
      • SQL (7)
      • 알고리즘 이론 (4)
      • 알고리즘 문제 풀이 (66)
    • 웹 (28)
      • React.js (4)
      • Next.js (1)
      • Node.js (14)
      • FastAPI (4)
      • Django (5)
    • 프로그래밍 언어 (45)
      • Python (5)
      • Java + Kotlin (29)
      • JavaScript + TypeScript (11)
    • 테스트코드 (26)
      • ATDD, 클린 코드 with Spring (4)
      • 이규원의 현실 세상의 TDD: 안정감을 주는 코드.. (20)
    • 인프라 (6)
      • AWS (2)
      • Kubernetes (4)
    • 트러블슈팅 (25)
    • 책 (89)
      • Effective Java (54)
      • Effective Kotlin (14)
      • 도메인 주도 개발 시작하기: DDD 핵심 개념 정.. (11)
      • 웹 프로그래머를 위한 데이터베이스를 지탱하는 기술 (6)
      • 도메인 주도 설계 첫걸음 (4)
    • Git (10)
    • 회고 (5)
    • etc (8)

블로그 메뉴

  • 홈
  • 방명록
  • 관리
  • GitHub
  • LinkedIn

공지사항

  • 스킨 관련

인기 글

태그

  • mysql
  • 장고
  • 깊이 우선 탐색
  • 파이썬
  • 그래프 탐색
  • Git
  • atdd
  • fastapi
  • BOJ
  • 브루트포스
  • dp
  • http
  • 백준
  • Shortest Path
  • 그래프

최근 댓글

최근 글

hELLO · Designed By 정상우.
코택
[백준] 14502 - 연구소 [Python(파이썬)]
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.