티스토리 뷰

코딩테스트

연구소

ajaa 2024. 12. 2. 13:37

📌문제

연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다.

연구소는 크기가 NxM인 직사각형으로 나타낼 수 있으며 직사각형은 1x1 크기의 정사각형으로 나누어져 있다. 연구소는 빈칸, 벽으로 이루어져 있으며 벽은 칸 하나를 가득 차지한다.

일부 칸은 바이러스가 존재하며, 이 바이러스는 상하좌우로 인접한 빈칸으로 모두 퍼져나갈 수 있다. 새로 세울 수 있는 벽의 개수는 3개이며 꼭 3개를 세워야 한다.

벽을 3개 세운 뒤 바이러스가 퍼질 수 없는 곳을 안전 영역이라고 할 때 얻을 수 있는 안전 영역 크기의 최댓값을 구하는 프로그램을 작성하시오.

 

📌풀이

벽의 개수가 3개가 되는 모든 조합을 찾은 뒤에 조합에 대해 안전 영역의 크기를 계산

모든 조합을 계산할 때: 파이썬의 조합 라이브러리, DFS 혹은 BFS 이용

안전 영역의 크기 계산할 때: DFS 혹은 BFS 이용

 

비어 있는 모든 공간 중 3개를 골라 벽을 설치

매번 벽을 설치할 때마다 DFS/BFS로 안전 영역을 구해야 함

 

📌코드

n, m = map(int, input().split())
data = []  # 초기 맵 리스트
temp = [[0] * m for _ in range(n)]  # 벽을 설치한 뒤의 맵 리스트

for _ in range(n):
    data.append(list(map, int, input().split()))

# 4가지 이동 방향에 대한 리스트
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

result = 0


# 깊이우선탐색(DFS)을 이용해 각 바이러스가 사방으로 퍼지도록 함
def virus(x, y):
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        # 상,하,좌,우 중에서 바이러스가 퍼질 수 있는 경우
        if nx >= 0 and nx < n and ny >= 0 and ny < m:
            if temp[nx][ny] == 0:
                # 해당 위치에 바이러스 배치하고 다시 재귀적 수행
                temp[nx][ny] = 2
                virus(nx, ny)


# 현재 맵에서 안전 영역 크기 계산
def get_score():
    score = 0
    for i in range(n):
        for j in range(m):
            if temp[i][j] == 0:
                score += 1
    return score


# 깊이우선탐색(DFS)을 이용해 벽 설치하면서 매번 안전 영역 크기 계산
def dfs(count):
    global result
    # 벽 3개 설치된 경우
    if count == 3:
        for i in range(n):
            for j in range(m):
                temp[i][j] = data[i][j]
        # 각 바이러스 위치에서 전파 진행
        for i in range(n):
            for j in range(m):
                if temp[i][j] == 2:
                    virus(i, j)
        # 안전 영역의 최댓값 계산
        result = max(result, get_score())
        return
    # 빈 공간에 벽 설치
    for i in range(n):
        for j in range(m):
            if data[i][j] == 0:
                data[i][j] = 1
                count += 1
                dfs(count)
                data[i][j] = 0
                count -= 1


dfs(0)
print(result)

 

📌참고

https://g.co/kgs/eyd5SSd

 

이것이 취업을 위한 코딩 테스트다 with 파이썬

IT 취준생이라면 누구나 입사하고 싶은 카카오・삼성전자・네이버・라인!취업의 성공 열쇠는 알고리즘 인터뷰에 있다! IT 취준생이라면 누구나 가고 싶어 하는 카카오, 라인, 삼성전자의 2016년

www.google.com

 

 

'코딩테스트' 카테고리의 다른 글

괄호 변환  (0) 2024.12.05
경쟁적 전염  (0) 2024.12.04
특정 거리의 도시 찾기  (0) 2024.12.01
외벽 점검  (2) 2024.11.29
  (2) 2024.11.28
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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 31
글 보관함