jm_p_op
백준 연구소 - 완전탐색 & 설계 본문
https://www.acmicpc.net/problem/14502
- 지도를 어떻게 저장할것인가? =>dictionary : key=tuple
- dictionaty.copy()를 사용하여 값 변동시 원래값 남도록 함
- all_case() : 막는 모든 경우의 수 : 중복 없이
- 3번으로 한정되어있어 재귀형식을 안씀=> 코테니까 빠르게 풀자
- palce_value() : 바이러스가 퍼질 공간과 아닌 공간 찾기
- 확인할 공간(_maps)이 없어질때까지 pop함, place는 확인한 공간갯수, not_va을 통하여 바이러스 퍼지면 0을 만들고 곱해서 확인할 갯수 체크
import sys
def places_value(maps):
answer=0
_maps=maps.copy()
while _maps:
start,value=_maps.popitem()
not_va=1
place=1
if value==1:
place=0
else:
if value==2:
not_va=0
checks=[start]
moves=[[0,1],[0,-1],[1,0],[-1,0]]
for x,y in checks:
for m_x,m_y in moves:
x_,y_=x+m_x,y+m_y
if _maps.get((x_,y_))==0:
_maps.pop((x_,y_))
checks.append((x_,y_))
place+=1
elif _maps.get((x_,y_))==2:
_maps.pop((x_,y_))
checks.append((x_,y_))
place+=1
not_va=0
answer+=place*not_va
return answer
def all_case(maps:dict):
places=list(maps.items())
l=len(places)
cases=[]
for i in range(l):
if places[i][1]==0:
for j in range(i+1,l):
if places[j][1]==0:
for k in range(j+1,l):
if places[k][1]==0:
cases.append((places[i][0],places[j][0],places[k][0]))
return cases
[n,m]=[int(i) for i in sys.stdin.readline().split()]
maps={}
for i in range(n):
for j,num in enumerate(sys.stdin.readline().split()):
maps[(i,j)]=int(num)
block_cases=all_case(maps)
answer=0
for block_case in block_cases:
_maps=maps.copy()
for block in block_case:
_maps.pop(block)
answers=places_value(_maps)
answer=max(answer,answers)
print(answer)
'수학 > 알고리즘' 카테고리의 다른 글
list.append to list (1) | 2024.03.25 |
---|---|
itertools 만들기,재귀, 경우의수 (0) | 2024.03.22 |
수치해석 - 피벗 (0) | 2024.03.20 |
A*알고리즘 - 최단경로 알고리즘 (0) | 2024.01.29 |
python a,b 값 바꾸기 (0) | 2023.08.25 |