ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • BOJ)15686 - 치킨배달
    PS/boj 2022. 9. 22. 23:11
    • 치킨 거리를 구하는 것은 O(1)로 가능
    • 집에서 치킨집 까지의 거리를 모두 구한 리스트를 만들고 선택한 M 개의 치킨집까지의 거리 중에서 최솟값의 합을 구하면 nCm 개의 도시의 치킨거리가 나올텐데 그 중에 최솟값이 ans 라고 생각
    • 최악의 경우를 고려해도 시간초과가 나지 않아 보였음.
    • 13Cm 인데 여기서 m은 1~13, Combination 연산 최댓값 생각해도 13C7
    • 대략 O(집 100 * 치킨집 7 * 13C7)
    • sol 1 로 제출하고 다른 모범 답안 참조하여 sol 2로 수정함.

     

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    # sol 1
    import sys
    from itertools import combinations
     
    N, M = map(int, input().split())
    board = [list(map(int, input().split())) for _ in range(N)] # 여기서 board는 필요없었음.
     
    home = []
    chicken = []
    for i in range(N):
        for j in range(N): # enumerate 사용 생각 했어야함.
            if board[i][j] == 1:
                home.append([i, j])
            elif board[i][j] == 2:
                chicken.append([i, j])
     
    # 굳이 모든 dist 를 먼저 구할 필요가 없긴 했음.
    dist = []
    for i in range(len(home)):
        d = []
        for j in range(len(chicken)):
            d.append(abs(home[i][0- chicken[j][0]) + abs(home[i][1- chicken[j][1]))
        dist.append(d)
     
    ans = sys.maxsize
    for selected in combinations([_ for _ in range(len(chicken))], M):
        total = 0
     
            # total 구하는 과정이 많이 구렸음. sol2 처럼 하는게 좋은듯.
        for d in dist:
            chicken_dist = sys.maxsize
            for j in selected:
                chicken_dist = min(chicken_dist, d[j])
     
            total += chicken_dist
     
        ans = min(ans, total)
     
    print(ans)
    cs

     

    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
    29
    30
    # sol 2
    import sys
    from itertools import combinations
     
    N, M = map(int, input().split())
     
    homes = []
    chickens = []
    for i in range(N):
        for j, v in enumerate(map(int, input().split())):
            if v == 1:
                homes.append((i, j))
            elif v == 2:
                chickens.append((i, j))
     
     
    def get_dist(a, b):
        return abs(a[0- b[0]) + abs(a[1- b[1])
     
     
    ans = sys.maxsize
    for selected in combinations(chickens, M):
        total = 0
     
        for house in homes:
            total += min(get_dist(house, chicken) for chicken in selected)
     
        ans = min(ans, total)
     
    print(ans)
    cs

     


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

     

    'PS > boj' 카테고리의 다른 글

    BOJ)1915 - 가장 큰 정사각형  (0) 2022.09.25
    BOJ)1389 - 케빈 베이커의 6단계 법칙  (0) 2022.09.24
    boj)2250 - 트리의 높이와 너비  (0) 2020.12.12
    boj)1991 - 트리 순회  (0) 2020.12.11
    boj)7562 - 나이트의 이동  (0) 2020.12.10
킹수빈닷컴