dohun.log

[알고리즘] 22352 -항체인식 : Python 본문

Study/알고리즘

[알고리즘] 22352 -항체인식 : Python

dohun31 2021. 10. 5. 11:22

문제

VUNO는 빅데이터와 딥러닝 기술을 통해 학습한 인공지능을 이용해 의학 전문가들의 판단에 도움을 주는 Medical AI 솔루션을 개발하는 전문 기업이다.

VUNO는 최근 SP라는 강력한 새로운 촬영 기법을 개발했다. 이 기법을 사용하면 인체 조직이 격자 형태로 표현되고, 격자의 각 칸에는 해당 부분의 각종 분석 결과를 압축한 하나의 데이터 값이 부여된다. VUNO는 이 SP 촬영 기법을 사용해 CPCU-1202라는 새로운 항체를 연구하려고 한다.

조직에 CPCU-1202 백신을 놓으면, 격자의 칸 중 하나에 항체가 생성된다. 이 항체는 현재 속해 있는 칸과 같은 데이터 값을 가지면서 상하좌우로 인접한 칸이 있을 경우 그 칸으로 퍼져나간다. 이 과정을 계속 반복하다가 항체가 더 이상 퍼져나갈 수 없게 되면, 항체는 조직에 완전히 스며든다. 그 결과로, 항체가 퍼졌던 칸들의 데이터 값은 모두 어떤 동일한 값으로 새로 업데이트된다. 이때, 우연히 원래의 데이터 값과 업데이트된 데이터 값이 동일할 수도 있다.

VUNO의 연구 데이터는 하나의 조직에 백신을 놓기 전의 촬영 결과와 백신을 놓은 뒤의 촬영 결과가 한 쌍으로 이루어져 있다. 두 장의 촬영 결과가 주어질 때, 이 조직에 놓은 백신이 CPCU-1202 백신일 가능성이 있는지 판단하는 프로그램을 작성하라.

 


문제 풀이

그냥 보통의 dfs와 비슷하게 풀면 되는 문제이다.

 

일단 그래프를 탐색한다.

for i in range(row):
    for j in range(col):
    # 탐색 ...

탐색중에 백신전 그래프와, 백신후 그래프가 다르다면 접종 가능성이 있으므로 dfs함수를 호출해서 확인한다.

if nv_graph[i][j] != v_graph[i][j] and not visited[i][j]:
	dfs(i, j)
    # 아무 탈 없이 dfs함수를 빠져나왔다면 백신 맞았어@! count++
	count += 1

dfs는 보통 짜던 함수에서 조건이 하나 더 추가되었다.

if v_graph[nx][ny] != v_graph[x][y]:

같은 덩어리 친구들끼리는 백신 맞고도 같아야 하기 떄문에 위의 조건이 필요하다.

 

전체 코드

더보기
import sys
sys.setrecursionlimit(10**6)
row, col = map(int, sys.stdin.readline().split())
nv_graph = [list(map(int, sys.stdin.readline().split())) for _ in range(row)]
v_graph = [list(map(int, sys.stdin.readline().split())) for _ in range(row)]
visited = [[False for _ in range(col)] for _ in range(row)]

def dfs(x, y):
    dx = [-1, 0, 1, 0]
    dy = [0, -1, 0, 1]
    visited[x][y] = True
    for i in range(4):
        nx = dx[i] + x
        ny = dy[i] + y
        if 0 <= nx < row and 0 <= ny < col:
            if nv_graph[nx][ny] == nv_graph[x][y] and not visited[nx][ny]:
                if v_graph[nx][ny] != v_graph[x][y]:
                    print('NO')
                    quit()
                dfs(nx, ny)

count = 0
for i in range(row):
    for j in range(col):
        if count > 1:
            print('NO')
            quit()
        if nv_graph[i][j] != v_graph[i][j] and not visited[i][j]:
            dfs(i, j)
            count += 1

print('YES')

알고리즘 중에 젤 좋아하는 알고리즘을 고르라면 단연 그래프 탐색.. I love you.. 이러면서 완전탐색은 못하는 아이러니함..

'Study > 알고리즘' 카테고리의 다른 글

[알고리즘] 7568-덩치 : Python  (0) 2021.10.01
[알고리즘] 1051-숫자 정사각형 : Python  (0) 2021.09.30
Comments