@Eeap
velog
@Eeap
전체 방문자
오늘
어제
  • 전체 (168)
    • osam (1)
    • Cloud (21)
      • Docker (2)
      • AWS (13)
    • AI & Data (7)
    • Algorithm (76)
      • Baekjoon (75)
      • Codeforces (1)
    • Language (18)
      • Java (18)
    • Back-end (17)
      • Spring (3)
      • JSP & Servlet (12)
      • Go (2)
    • 일상 (4)
    • 기타 (8)
    • git (1)
    • Infra (9)
      • Apache Kafka (5)
      • Kubernetes (4)
      • 기타 (0)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • AWS CodeStar
  • 심폴릭링크
  • knowledge bases
  • sagemaker unified studio
  • bedrock agent
  • CLASS
  • flink
  • SageMaker
  • bedrock
  • converse api
  • AWS CodeCatalyst
  • 인터페이스
  • bedrock api
  • java
  • Agent
  • 오블완
  • 티스토리챌린지
  • invokemodel api
  • AWS CodeArtifact
  • Python

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
@Eeap

velog

Algorithm/Baekjoon

Python 15686번 치킨 배달

2022. 9. 9. 23:37
반응형

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

 

문제에서는 최대 m개의 치킨집이 있을 경우 치킨 거리의 최소합을 구하라고 했다.

먼저 치킨집이랑 사람집을 따로 리스트를 만들어서 보관했고 그 이후 dfs 방식을 이용해서 문제에 접근했다.

cnt 즉 고른 치킨집의 개수가 최대 치킨집의 개수와 일치하면 계산을 시작했고 계산한 결과값을 result라는 리스트에 넣어줬다.

(처음에 result에 5001이라는 값을 넣어준 이유는 아래 resMin 처음 실행될때 빈 리스트일 경우 에러가 날 수도 있기 때문에 100*100을 확실하게 넣어주는게 맞긴 한데 최대가 5001을 초과할 일이 없어서 잘됐네요 ㅎ,,)

처음에 m개의 치킨집 개수를 loc라는 list에 append나 pop을 이용하려 했는데 여러 개를 넣고 빼다 보니 연산이 오래걸려서 index 방식으로 바꾸게 되었다.

돌려보니 index 방식은 제한 시간안에 통과했다!!!

import sys

input = sys.stdin.readline

n,m = map(int,input().split())
ary = [list(map(int,input().split())) for _ in range(n)]
chick=[]
result=[5001]
house = []
for i in range(n):
    for j in range(n):
        if ary[i][j]==2:
            chick.append([i,j])
        elif ary[i][j]==1:
            house.append([i,j])
def dfs(idx,cnt,loc):
    if cnt == m:
        calc(loc)
        return
    for i in range(idx,len(chick)):
        if not loc[i]:
            loc[i]=1
            dfs(i,cnt+1,loc)
            loc[i]=0
def calc(loc):
    sum = 0
    resMin = min(result)
    for i,j in house:
        value = 101
        for k in range(len(chick)):
            if loc[k]:
                x,y=chick[k]
                value = min(value,abs(i-x)+abs(j-y))
        sum+=value
        if sum > resMin:
            return
    result.append(sum)

dfs(0,0,[0 for _ in range(len(chick))])
print(min(result))
반응형
저작자표시 (새창열림)

'Algorithm > Baekjoon' 카테고리의 다른 글

Python 1541번 잃어버린 괄호  (0) 2022.08.07
Python 16234번 인구 이동  (0) 2022.08.06
Python 16929번 Two Dots  (0) 2022.08.05
Python 16928번 뱀과 사다리 게임  (0) 2022.08.05
Python 11048번 이동하기  (0) 2022.08.03
    'Algorithm/Baekjoon' 카테고리의 다른 글
    • Python 1541번 잃어버린 괄호
    • Python 16234번 인구 이동
    • Python 16929번 Two Dots
    • Python 16928번 뱀과 사다리 게임
    @Eeap
    @Eeap

    티스토리툴바