IT recording...
[BOJ] 1062 가르침 - python 본문
15686번: 치킨 배달
크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태로 나타내고, r행 c열 또는 위에서부터 r번째 칸
www.acmicpc.net
풀이
|
import sys
from itertools import combinations
def input():
return sys.stdin.readline().rstrip()
N,M = map(int,input().split(" "))
maps = [list(map(int,input().split(" "))) for _ in range(N)]
house = [(a+1,b+1) for a in range(N) for b in range(N) if maps[a][b] == 1]
chicken = [(a+1,b+1) for a in range(N) for b in range(N) if maps[a][b] == 2]
#치킨거리 계산
def calculate(house,chicken):
return abs(house[0] - chicken[0]) + abs(house[1] - chicken[1])
#모든 경우의 수 다 해서 치킨거리의 합이 가장 작은걸 채택
sum_min = float('inf')
for cand in combinations(chicken,M): #치킨집 후보들을 골라서 치킨거리 최소 구하기
sum = 0
for h in house: #각 집에서 치킨집까지의 치킨거리 구하기
sum += min(calculate(h,c) for c in cand)
sum_min = min(sum,sum_min) #후보 중 치킨거리 최솟값
print(sum_min)
얻어가는 것
- combinations for문에 바로 쓰기
for cand in combinations(chicken,M):
pass
- 무한대
positive = float('inf')
negative = float('-inf')
- for문 + min사용하기
sum += min(calculate(1,cand) for cand in candidate)
#candidate에서 for문 돌린것들 calculate함수 결과 값 중 최소 값이 리턴됨
느낀점
"211115"
소요 시간 : 30min
- 생각보다 간단한 문제였는데 왜 골드인지 모르겠다
- 근데 for문 반복사용이 계속 헷갈린다. 조건 거는게 아직 익숙하지않다. 더 열심히 문제 풀자
'Algorithm' 카테고리의 다른 글
[BOJ] 2470 두 용액 - python (0) | 2021.12.02 |
---|---|
[BOJ] 2805 나무 자르기 - python (0) | 2021.12.02 |
[BOJ] 11660 구간 합 구하기 5 - python (0) | 2021.12.02 |
[BOJ] 1339 단어 수학 - python (0) | 2021.12.02 |
[BOJ] 11659 구간 합 구하기 4 - python (0) | 2021.12.02 |