๐Ÿ’  BOJ

[BOJ][C++] ๋ฐฑ์ค€ 15686๋ฒˆ: ์น˜ํ‚จ๋ฐฐ๋‹ฌ

์„ ๋‹ฌ 2024. 3. 11. 20:52
๋ฐ˜์‘ํ˜•

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

 

15686๋ฒˆ: ์น˜ํ‚จ ๋ฐฐ๋‹ฌ

ํฌ๊ธฐ๊ฐ€ N×N์ธ ๋„์‹œ๊ฐ€ ์žˆ๋‹ค. ๋„์‹œ๋Š” 1×1ํฌ๊ธฐ์˜ ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ๋„์‹œ์˜ ๊ฐ ์นธ์€ ๋นˆ ์นธ, ์น˜ํ‚จ์ง‘, ์ง‘ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ๋„์‹œ์˜ ์นธ์€ (r, c)์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ๋‚˜ํƒ€๋‚ด๊ณ , rํ–‰ c์—ด ๋˜๋Š” ์œ„์—์„œ๋ถ€ํ„ฐ r๋ฒˆ์งธ ์นธ

www.acmicpc.net

 

๋ฌธ์ œ

ํฌ๊ธฐ๊ฐ€ N×N์ธ ๋„์‹œ๊ฐ€ ์žˆ๋‹ค. ๋„์‹œ๋Š” 1×1ํฌ๊ธฐ์˜ ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ๋„์‹œ์˜ ๊ฐ ์นธ์€ ๋นˆ ์นธ, ์น˜ํ‚จ์ง‘, ์ง‘ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ๋„์‹œ์˜ ์นธ์€ (r, c)์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ๋‚˜ํƒ€๋‚ด๊ณ , rํ–‰ c์—ด ๋˜๋Š” ์œ„์—์„œ๋ถ€ํ„ฐ r๋ฒˆ์งธ ์นธ, ์™ผ์ชฝ์—์„œ๋ถ€ํ„ฐ c๋ฒˆ์งธ ์นธ์„ ์˜๋ฏธํ•œ๋‹ค. r๊ณผ c๋Š” 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค.

์ด ๋„์‹œ์— ์‚ฌ๋Š” ์‚ฌ๋žŒ๋“ค์€ ์น˜ํ‚จ์„ ๋งค์šฐ ์ข‹์•„ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ, ์‚ฌ๋žŒ๋“ค์€ "์น˜ํ‚จ ๊ฑฐ๋ฆฌ"๋ผ๋Š” ๋ง์„ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ์น˜ํ‚จ ๊ฑฐ๋ฆฌ๋Š” ์ง‘๊ณผ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์น˜ํ‚จ์ง‘ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ์ด๋‹ค. ์ฆ‰, ์น˜ํ‚จ ๊ฑฐ๋ฆฌ๋Š” ์ง‘์„ ๊ธฐ์ค€์œผ๋กœ ์ •ํ•ด์ง€๋ฉฐ, ๊ฐ๊ฐ์˜ ์ง‘์€ ์น˜ํ‚จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๋„์‹œ์˜ ์น˜ํ‚จ ๊ฑฐ๋ฆฌ๋Š” ๋ชจ๋“  ์ง‘์˜ ์น˜ํ‚จ ๊ฑฐ๋ฆฌ์˜ ํ•ฉ์ด๋‹ค.

์ž„์˜์˜ ๋‘ ์นธ (r1, c1)๊ณผ (r2, c2) ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๋Š” |r1-r2| + |c1-c2|๋กœ ๊ตฌํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜์™€ ๊ฐ™์€ ์ง€๋„๋ฅผ ๊ฐ–๋Š” ๋„์‹œ๋ฅผ ์‚ดํŽด๋ณด์ž.

0 2 0 1 0
1 0 1 0 0
0 0 0 0 0
0 0 0 1 1
0 0 0 1 2

0์€ ๋นˆ ์นธ, 1์€ ์ง‘, 2๋Š” ์น˜ํ‚จ์ง‘์ด๋‹ค.

(2, 1)์— ์žˆ๋Š” ์ง‘๊ณผ (1, 2)์— ์žˆ๋Š” ์น˜ํ‚จ์ง‘๊ณผ์˜ ๊ฑฐ๋ฆฌ๋Š” |2-1| + |1-2| = 2, (5, 5)์— ์žˆ๋Š” ์น˜ํ‚จ์ง‘๊ณผ์˜ ๊ฑฐ๋ฆฌ๋Š” |2-5| + |1-5| = 7์ด๋‹ค. ๋”ฐ๋ผ์„œ, (2, 1)์— ์žˆ๋Š” ์ง‘์˜ ์น˜ํ‚จ ๊ฑฐ๋ฆฌ๋Š” 2์ด๋‹ค.

(5, 4)์— ์žˆ๋Š” ์ง‘๊ณผ (1, 2)์— ์žˆ๋Š” ์น˜ํ‚จ์ง‘๊ณผ์˜ ๊ฑฐ๋ฆฌ๋Š” |5-1| + |4-2| = 6, (5, 5)์— ์žˆ๋Š” ์น˜ํ‚จ์ง‘๊ณผ์˜ ๊ฑฐ๋ฆฌ๋Š” |5-5| + |4-5| = 1์ด๋‹ค. ๋”ฐ๋ผ์„œ, (5, 4)์— ์žˆ๋Š” ์ง‘์˜ ์น˜ํ‚จ ๊ฑฐ๋ฆฌ๋Š” 1์ด๋‹ค.

์ด ๋„์‹œ์— ์žˆ๋Š” ์น˜ํ‚จ์ง‘์€ ๋ชจ๋‘ ๊ฐ™์€ ํ”„๋žœ์ฐจ์ด์ฆˆ์ด๋‹ค. ํ”„๋ Œ์ฐจ์ด์ฆˆ ๋ณธ์‚ฌ์—์„œ๋Š” ์ˆ˜์ต์„ ์ฆ๊ฐ€์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ ์น˜ํ‚จ์ง‘์„ ํ์—…์‹œํ‚ค๋ ค๊ณ  ํ•œ๋‹ค. ์˜ค๋žœ ์—ฐ๊ตฌ ๋์— ์ด ๋„์‹œ์—์„œ ๊ฐ€์žฅ ์ˆ˜์ต์„ ๋งŽ์ด ๋‚ผ ์ˆ˜ ์žˆ๋Š”  ์น˜ํ‚จ์ง‘์˜ ๊ฐœ์ˆ˜๋Š” ์ตœ๋Œ€ M๊ฐœ๋ผ๋Š” ์‚ฌ์‹ค์„ ์•Œ์•„๋‚ด์—ˆ๋‹ค.

๋„์‹œ์— ์žˆ๋Š” ์น˜ํ‚จ์ง‘ ์ค‘์—์„œ ์ตœ๋Œ€ M๊ฐœ๋ฅผ ๊ณ ๋ฅด๊ณ , ๋‚˜๋จธ์ง€ ์น˜ํ‚จ์ง‘์€ ๋ชจ๋‘ ํ์—…์‹œ์ผœ์•ผ ํ•œ๋‹ค. ์–ด๋–ป๊ฒŒ ๊ณ ๋ฅด๋ฉด, ๋„์‹œ์˜ ์น˜ํ‚จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์ž‘๊ฒŒ ๋ ์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N(2 ≤ N ≤ 50)๊ณผ M(1 ≤ M ≤ 13)์ด ์ฃผ์–ด์ง„๋‹ค.

๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ๋„์‹œ์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

๋„์‹œ์˜ ์ •๋ณด๋Š” 0, 1, 2๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , 0์€ ๋นˆ ์นธ, 1์€ ์ง‘, 2๋Š” ์น˜ํ‚จ์ง‘์„ ์˜๋ฏธํ•œ๋‹ค. ์ง‘์˜ ๊ฐœ์ˆ˜๋Š” 2N๊ฐœ๋ฅผ ๋„˜์ง€ ์•Š์œผ๋ฉฐ, ์ ์–ด๋„ 1๊ฐœ๋Š” ์กด์žฌํ•œ๋‹ค. ์น˜ํ‚จ์ง‘์˜ ๊ฐœ์ˆ˜๋Š” M๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 13๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ํ์—…์‹œํ‚ค์ง€ ์•Š์„ ์น˜ํ‚จ์ง‘์„ ์ตœ๋Œ€ M๊ฐœ๋ฅผ ๊ณจ๋ž์„ ๋•Œ, ๋„์‹œ์˜ ์น˜ํ‚จ ๊ฑฐ๋ฆฌ์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

ํ’€์ด

1.  ์น˜ํ‚จ์ง‘์˜ ์ขŒํ‘œ๋“ค์„ chicken ๋ฐฐ์—ด์—, ์ง‘์˜ ์ขŒํ‘œ๋“ค์„ house ๋ฐฐ์—ด์— ๋„ฃ๋Š”๋‹ค

    for(int i=0; i<n; i++) {
        for(int j=0; j<n; j++) {
            cin >> input;
            if(input==1) 
                house.push_back({i,j});
            else if(input==2) 
                chicken.push_back({i,j});
        }
    }

 

2. chicken.size()๊ฐœ์˜ ์น˜ํ‚จ์ง‘ ์ค‘ m๊ฐœ์˜ ์น˜ํ‚จ์ง‘์„ ๊ณ ๋ฅด๋Š” ์กฐํ•ฉ์„ ๊ณ ๋ฅด์ž

์กฐํ•ฉ์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋ฏ€๋กœ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ๋‹ค

// ์กฐํ•ฉ์œผ๋กœ m๊ฐœ์˜ ์น˜ํ‚จ์ง‘ ๊ตฌํ•˜๊ธฐ
vector<int> combination(13);
vector<bool> used(13, false);
void recur(int index, int k) {
    if(k==m) {
        return;
    }
    for(int i=index; i<chicken.size(); i++) {
        if(!used[i]) {
            combination[k] = i;
            used[i] = true;
            recur(i, k+1);
            used[i] = false;
        }
    }
    
}

 

3. ์กฐํ•ฉ์ด ์™„์„ฑ๋˜๋ฉด (๊ฐ ์žฌ๊ท€ํ•จ์ˆ˜์˜ ๋) ํ•ด๋‹น ์กฐํ•ฉ์ผ ๋•Œ์˜ ๋„์‹œ ์น˜ํ‚จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•œ๋‹ค

house๋ฆฌ์ŠคํŠธ๋ฅผ ๋Œ๋ฉฐ ๊ฐ ์ง‘์— ๋Œ€ํ•ด ์กฐํ•ฉ์— ์žˆ๋Š” ์น˜ํ‚จ ์ง‘๊ณผ์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•ด์„œ ์ตœ์†Œ ์น˜ํ‚จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๊ณ 

์ด ์ตœ์†Œ ์น˜ํ‚จ ๊ฑฐ๋ฆฌ๋“ค์„ ํ•ฉํ•œ ๋„์‹œ์น˜ํ‚จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๊ณ  ์ด ๋„์‹œ์น˜ํ‚จ ๊ฑฐ๋ฆฌ๋“ค ์ค‘ ์ตœ์†Œ ๋„์‹œ์น˜ํ‚จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋ฉด ๋‹ต์ด๋‹ค

        int cityDistance = 0;
        // ํ•ด๋‹น ์กฐํ•ฉ์˜ ์น˜ํ‚จ์ง‘๋งŒ ์žˆ์„ ๋•Œ์˜ ๋„๋กœ์˜ ์น˜ํ‚จ๊ฑฐ๋ฆฌ ๊ตฌํ•˜๊ธฐ
        for(int i=0; i<house.size(); i++) {
            int minDistance = 101; // ์ตœ๋Œ€ ์น˜ํ‚จ๊ฑฐ๋ฆฌ
            for(int j=0; j<m; j++) {
                int cur = combination[j];
                int distance = getDistance(house[i], chicken[cur]);
                if(distance < minDistance) {
                    minDistance = distance;
                }
            }
            cityDistance += minDistance;
        }
        if(cityDistance < ans) {
            ans = cityDistance;
        }

 

์ฝ”๋“œ

#include <iostream>
#include <vector>

using namespace std;

typedef pair<int, int> ci;

int n,m;
vector<ci> house;
vector<ci> chicken;

// x์ขŒํ‘œ์™€ y์ขŒํ‘œ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ ๊ตฌํ•˜๊ธฐ
int getDistance(ci x, ci y) {
    int x1=x.first, x2=x.second;
    int y1=y.first, y2=y.second;
    int dx = x1-y1>0 ? x1-y1 : y1-x1;
    int dy = x2-y2>0 ? x2-y2 : y2-x2;
    return dx+dy;
}

// ์กฐํ•ฉ์œผ๋กœ m๊ฐœ์˜ ์น˜ํ‚จ์ง‘ ๊ตฌํ•˜๊ธฐ
int ans = 130001;
vector<int> combination(13);
vector<bool> used(13, false);
void recur(int index, int k) {
    if(k==m) {
        int cityDistance = 0;
        // ํ•ด๋‹น ์กฐํ•ฉ์˜ ์น˜ํ‚จ์ง‘๋งŒ ์žˆ์„ ๋•Œ์˜ ๋„๋กœ์˜ ์น˜ํ‚จ๊ฑฐ๋ฆฌ ๊ตฌํ•˜๊ธฐ
        for(int i=0; i<house.size(); i++) {
            int minDistance = 101; // ์ตœ๋Œ€ ์น˜ํ‚จ๊ฑฐ๋ฆฌ
            for(int j=0; j<m; j++) {
                int cur = combination[j];
                int distance = getDistance(house[i], chicken[cur]);
                if(distance < minDistance) {
                    minDistance = distance;
                }
            }
            cityDistance += minDistance;
        }
        if(cityDistance < ans) {
            ans = cityDistance;
        }
        return;
    }
    for(int i=index; i<chicken.size(); i++) {
        if(!used[i]) {
            combination[k] = i;
            used[i] = true;
            recur(i, k+1);
            used[i] = false;
        }
    }
    
}

int main() {
    cin >> n >> m;
    int input;
    for(int i=0; i<n; i++) {
        for(int j=0; j<n; j++) {
            cin >> input;
            if(input==1) 
                house.push_back({i,j});
            else if(input==2) 
                chicken.push_back({i,j});
        }
    }
    
    recur(0, 0);
    
    cout << ans;
}

 

๋ฐ˜์‘ํ˜•