일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 미세먼지 안녕!
- 프로그래머스
- SW ExpertAcademy
- 14499번
- 19238번
- HTML 기초
- QueryDSL 기초
- 파이썬
- 어른 상어
- 보석 쇼핑
- 17144번
- 16234번
- python
- 15686번
- 스타트 택시
- 감소하는 수
- SW Expert Academy
- 키패드 누르기
- 1789번
- 12865번
- 2020 카카오 인턴십
- 수식 최대화
- 빛의 경로 사이클
- 백준 알고리즘
- 경주로 건설
- 1038번
- 베스트엘범
- 거울 설치
- 9095번
- 12869번
Archives
- Today
- Total
보물창고 블로그
백준 알고리즘 14502번 연구소 풀이 with Python 본문
728x90
문제 링크: https://www.acmicpc.net/problem/14502
문제는 다음과 같습니다.
처음에 연구소를 바이러스에 감염시켰다가 다시 복원하는 작업을 하였는데, 시간 초과가 발생하였다.
그래서 복원하는 것을 하지 않고, python의 copy 모듈을 사용하여 깊은 복사를 이용하여 이를 해결하였다.
그리고 기둥을 3개 세우는 경우의 수를 계산하기 위해서 python itertools 모듈의 combinations를 사용하였다.
#문제 해결에 필요한 모듈들을 불러옵니다.
import copy
from itertools import combinations
"""문제를 해결하기위한 함수인 infect2함수입니다.
바이러스의 처음위치 x,y가 주어졌을 때, 계속 퍼져나가는 함수입니다."""
def infect2(x,y,map1):
n=len(map1)
m=len(map1[0])
dx=[-1,0,1,0]
dy=[0,-1,0,1]
for i in range(4):
if -1<x+dx[i]<n and -1<y+dy[i]<m:
if map1[x+dx[i]][y+dy[i]]==0:
map1[x+dx[i]][y+dy[i]]=2
infect2(x+dx[i],y+dy[i],map1)
else:
continue
else:
continue
#문제 해결을 위한 핵심 함수입니다. 바이러스 개수만큼 바이러스를 퍼트립니다.
def infect(virus,map1,c):
n=len(virus)
global answer
#바이러스 개수만큼 퍼트렸다면, 안전구역의 구역을 카운트하여 answer값과 비교합니다.
if c==n:
sub=counter(map1)
if answer<sub:
answer=sub
return
else:
x,y=virus[c]
infect2(x,y,map1)
infect(virus,map1,c+1)
#안전구역을 카운트하기위한 함수입니다.
def counter(map1):
n=len(map1)
m=len(map1[0])
count=0
for i in range(n):
for j in range(m):
if map1[i][j]==0:
count+=1
return count
# n,m을 입력받습니다.
n,m=map(int,input().split())
#answer의 초기값을 -1로 초기화합니다.
answer=-1
lab=[]
virus=[]
zeros=[]
#lab변수에 연구소 필드값을 받습니다.
for _ in range(n):
lab.append(list(map(int,input().split())))
# virus와 zeros에 각각 바이러스 위치와 0의 위치들을 넣습니다.
for i in range(n):
for j in range(m):
if lab[i][j]==2:
virus.append([i,j])
elif lab[i][j]==0:
zeros.append([i,j])
# 0값인 것들중에 3개씩 묶인 조합을 통해서 기둥을 세우고, 바이러스를 퍼트립니다.
zeros=list(combinations(zeros,3))
for i in zeros:
lab2=copy.deepcopy(lab)
for j in range(3):
lab2[i[j][0]][i[j][1]]=1
infect(virus,lab2,0)
for j in range(3):
lab2[i[j][0]][i[j][1]]=0
print(answer)
'알고리즘 풀이 > 백준 알고리즘' 카테고리의 다른 글
백준 알고리즘 12100번 2048 풀이 with Python (0) | 2020.02.01 |
---|---|
백준 알고리즘 13458번 시험감독 풀이 with Python (0) | 2020.02.01 |
백준 알고리즘 13460번 구슬탈출 풀이 with Python (0) | 2020.01.16 |
백준 알고리즘 17779번 게리맨더링 2 풀이 with Python (0) | 2020.01.08 |
백준 알고리즘 14503번 로봇청소기 풀이 with Python (0) | 2020.01.01 |
Comments