당니이
다은이의 컴퓨터 공부
당니이
전체 방문자
오늘
어제
  • 분류 전체보기 (140)
    • Achieved 👩🏻 (14)
      • 생각들 (2)
      • TIL (6)
      • Trial and Error (1)
      • Inspiration ✨ (0)
      • 미국 박사 준비 🎓 (1)
    • Computer Vision💖 (39)
      • Basic (9)
      • Video (5)
      • Continual Learning (7)
      • Generative model (2)
      • Domain (DA & DG) (5)
      • Multimodal (8)
      • Multitask Learning (1)
      • Segmentation (1)
      • Colorization (1)
    • RL 🤖 (4)
    • Autonomous Driving 🚙 (11)
      • Geometry (4)
      • LiDAR 3D Detection (1)
      • Trajectory prediction (2)
      • Lane Detection (1)
      • HDmap (3)
    • Linux (15)
    • PyTorch👩🏻‍💻 (10)
    • Linear Algebra (2)
    • Python (5)
    • NLP (11)
      • Article 📑 (1)
    • Algorithms 💻 (22)
      • Basic (8)
      • BAEKJOON (8)
      • Programmers (2)
    • ML (1)
      • 통계적 머신러닝(20-2) (1)
    • SQL (3)
    • 기초금융 💵 (1)

블로그 메뉴

  • 홈
  • About me

공지사항

인기 글

태그

  • LLM
  • CV
  • 백준
  • til
  • pytorch
  • Incremental Learning
  • conda
  • NLP
  • 코딩테스트
  • CL
  • 자료구조
  • 리눅스
  • Linux
  • continual learning
  • domain generalization
  • dfs
  • domain adaptation
  • Python
  • 알고리즘
  • 백트래킹

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
당니이

다은이의 컴퓨터 공부

[백준] 치킨배달(Python) - 구현 & 백트래킹
Algorithms 💻/BAEKJOON

[백준] 치킨배달(Python) - 구현 & 백트래킹

2022. 5. 23. 19:02
반응형

# 문제 

문제가 언뜻 보면 복잡해보이지만, 사실 M개의 치킨집을 선택하는 최적의 입지를 구하는 문제다. 여기서 최적의 입지의 기준이란 각 집으로부터 "치킨거리"의 합이 가장 작아지는 M개의 치킨집을 고르는 경우를 구하는 것 !  "치킨거리"를 구하는 공식 또한 인덱스를 기준으로 하기에 그렇게 어렵지 않다. 

 

# 입출력 

 

# Idea

 

# Code

우선 이 문제는 구현과 백트래킹으로 풀 수 있으므로, 구현으로 푸는 방법을 먼저 소개하겠다. itertools의 combination 함수를 이용하면 쉽게 구현 가능하다. 

"""
치킨 배달 
  - Combination으로 먼저 풀기
"""
from itertools import combinations

# 해당 치킨집 조합과 1들의 거리를 리턴하는 함수 
def distance(one_list, two_ele) : 
  dis = 0 
  for one_ele in one_list : 
    how_min = 99999 
    for t in two_ele : 
      # 둘 중 min 값만 저장 
      how_min = min(abs(one_ele[0] - t[0]) + abs(one_ele[1] - t[1]), how_min)
    dis += how_min
  return dis


if __name__ == '__main__':
  N, M = map(int, input().split())
  m = []     # map 
  result = 999999    # 도시의 치킨거리 최솟값 

  for _ in range(N):
    m.append(list(map(int, input().split())))

  # 1과 2 위치 적재 
  ones = [] ; twos = []
  for i in range(N):
    for j in range(N):
      if m[i][j] == 1 : 
        ones.append((i+1, j+1))   # 튜플로 적재 
      elif m[i][j] == 2 : 
        twos.append((i+1, j+1))

  chi = list(combinations(twos, M))       # 치킨집 M개 고르는 경우의 수 

  # 치킨집 조합별 반복문 
  for two_ele in chi : 
    result = min(result, distance(ones, two_ele))

  print(result)

 

반응형
저작자표시 (새창열림)

'Algorithms 💻 > BAEKJOON' 카테고리의 다른 글

[백준] 스타트와 링크(Python) - 백트래킹  (0) 2022.05.05
[백준] N-Queens 문제(Python) - 백트래킹  (2) 2022.04.27
[백준] 1,2,3 더하기(Python) - 백트래킹 & 1차원 dfs 탐색  (0) 2022.04.20
[백준] 로또(Python) - 백트래킹 & 1차원 dfs 탐색  (0) 2022.04.07
[백준] 에디터(Python) - Stack  (0) 2022.03.26
    'Algorithms 💻/BAEKJOON' 카테고리의 다른 글
    • [백준] 스타트와 링크(Python) - 백트래킹
    • [백준] N-Queens 문제(Python) - 백트래킹
    • [백준] 1,2,3 더하기(Python) - 백트래킹 & 1차원 dfs 탐색
    • [백준] 로또(Python) - 백트래킹 & 1차원 dfs 탐색
    당니이
    당니이
    씩씩하게 공부하기 📚💻

    티스토리툴바