jm_p_op

백준 연구소 - 완전탐색 & 설계 본문

수학/알고리즘

백준 연구소 - 완전탐색 & 설계

jm_p_op 2024. 3. 21. 22:01

https://www.acmicpc.net/problem/14502

  1. 지도를 어떻게 저장할것인가? =>dictionary : key=tuple
  2. dictionaty.copy()를 사용하여 값 변동시 원래값 남도록 함
  3. all_case() : 막는 모든 경우의 수 : 중복 없이
    1. 3번으로 한정되어있어 재귀형식을 안씀=> 코테니까 빠르게 풀자
  4. palce_value() : 바이러스가 퍼질 공간과 아닌 공간 찾기
    1. 확인할 공간(_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