[백준] 15686 치킨 배달(C++)

2022. 7. 28. 00:41·Algorithm/Solution
728x90

15686번: 치킨 배달 (acmicpc.net)

 

15686번: 치킨 배달

크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태로 나타내고, r행 c열 또는 위에서부터 r번째 칸

www.acmicpc.net


난이도 : 골드 5

 

풀이 과정 :

각 집마다의 치킨거리를 구해 마을의 총 치킨거리가 최소가 되도록하는 문제입니다.

n이 50이므로 최대 집 개수+치킨집개수은 250이 됩니다. 

따라서 집개수와 치킨집 개수가 반반이라고 했을 때 최대 125*125 =  15625 번 연산을 하므로 

제한시간이 1초라서 완탐으로 풀 수 있는 문제 였습니다. 

 

완전탐색문제가 되면 복잡할거없이 치킨집을 조합으로 m개 고른다음,

m개마다의 치킨거리의 최솟값을 구하면 되는 문제가 되기때문에 stl이용하면 더 간단하게 풀수있는문제입니다.

 

코드 :

#include <iostream>
#include <algorithm> 
#include <vector>
using namespace std;

int n, m, arr[60][60], ans = 1e9, sum[255];
pair<int, int> h[255], c[255];
int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL), cout.tie(nullptr);
    cin >> n >> m;

    int c1 = 0, c2 = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> arr[i][j];
            if (arr[i][j] == 1) {
                h[c1].first = i;
                h[c1].second = j;
                c1++;
            }
            if (arr[i][j] == 2) {
                c[c2].first = i;
                c[c2].second = j;
                c2++;
            }
        }
    }

    vector<bool> temp(c2, true);
    for (int i = 0; i < c2 - m; i++) {
        temp[i] = false;
    }

    do {
        for (int i = 0; i < c1; i++) {
            sum[i] = 1e9;
        }
        for (int i = 0; i < c2; i++) {
            if (temp[i] == true) {
                for (int j = 0; j < c1; j++) {
                    int dx = abs(h[j].first - c[i].first);
                    int dy = abs(h[j].second - c[i].second);
                    sum[j] = min(sum[j], dx + dy);               
                }
            }
        }
        int s = 0;
        for (int i = 0; i < c1; i++) {
            s += sum[i];
        }
        ans = min(s, ans);
    } while (next_permutation(temp.begin(), temp.end()));  
    
    cout << ans;
}
728x90
저작자표시 비영리 (새창열림)

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

[백준] 2792 보석 상자(C++)  (0) 2022.08.22
[백준] 14503 로봇 청소기 (C++)  (0) 2022.08.17
[백준] 2623 음악 프로그램(C++)  (0) 2022.07.15
[백준] 14502 연구소(C++)  (0) 2022.06.25
[백준] 2110 공유기 설치(C++)  (0) 2022.06.08
'Algorithm/Solution' 카테고리의 다른 글
  • [백준] 2792 보석 상자(C++)
  • [백준] 14503 로봇 청소기 (C++)
  • [백준] 2623 음악 프로그램(C++)
  • [백준] 14502 연구소(C++)
BeNI
BeNI
코딩하는 블로그
  • BeNI
    코딩못하는컴공
    BeNI
  • 전체
    오늘
    어제
    • Menu (254)
      • My profile (1)
      • 회고 | 후기 (8)
      • Frontend (66)
        • Article (11)
        • Study (36)
        • 프로그래머스 FE 데브코스 (19)
      • Backend (0)
      • Algorithm (58)
        • Solution (46)
        • Study (12)
      • Major (111)
        • C&C++ (23)
        • Java (20)
        • Data Structure (14)
        • Computer Network (12)
        • Database (15)
        • Linux (6)
        • Architecture (3)
        • Lisp (15)
        • OS (1)
        • Security (2)
      • etc (2)
  • 링크

    • 깃허브
    • 방명록
  • 인기 글

  • 최근 댓글

  • 최근 글

  • 태그

    Algorithm
    C++
    백준
    데브코스
    프로그래머스
    react
    자료구조
    파일처리
    lisp
    리팩토링
  • hELLO· Designed By정상우.v4.10.2
BeNI
[백준] 15686 치킨 배달(C++)
상단으로

티스토리툴바