๐Ÿ•๏ธ ICPC Sinchon/Bruteforce

[BOJ S2][C++] ๋ฐฑ์ค€ 14620๋ฒˆ: ๊ฝƒ๊ธธ

์„ ๋‹ฌ 2022. 9. 24. 15:50
๋ฐ˜์‘ํ˜•

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

 

14620๋ฒˆ: ๊ฝƒ๊ธธ

2017๋…„ 4์›” 5์ผ ์‹๋ชฉ์ผ์„ ๋งž์ดํ•œ ์ง„์•„๋Š” ๋‚˜๋ฌด๋ฅผ ์‹ฌ๋Š” ๋Œ€์‹  ํ•˜์ดํ…Œํฌ๊ด€ ์•ž ํ™”๋‹จ์— ๊ฝƒ์„ ์‹ฌ์–ด ๋“ฑ๊ตํ•  ๋•Œ ๋งˆ๋‹ค ๊ฝƒ๊ธธ์„ ๊ฑท๊ณ  ์‹ถ์—ˆ๋‹ค. ์ง„์•„๊ฐ€ ๊ฐ€์ง„ ๊ฝƒ์˜ ์”จ์•—์€ ๊ฝƒ์„ ์‹ฌ๊ณ ๋‚˜๋ฉด ์ •ํ™•ํžˆ 1๋…„ํ›„์— ๊ฝƒ์ด ํ”ผ๋ฏ€

www.acmicpc.net

 

๋ฌธ์ œ

2017๋…„ 4์›” 5์ผ ์‹๋ชฉ์ผ์„ ๋งž์ดํ•œ ์ง„์•„๋Š” ๋‚˜๋ฌด๋ฅผ ์‹ฌ๋Š” ๋Œ€์‹  ํ•˜์ดํ…Œํฌ๊ด€ ์•ž ํ™”๋‹จ์— ๊ฝƒ์„ ์‹ฌ์–ด ๋“ฑ๊ตํ•  ๋•Œ ๋งˆ๋‹ค ๊ฝƒ๊ธธ์„ ๊ฑท๊ณ  ์‹ถ์—ˆ๋‹ค.

์ง„์•„๊ฐ€ ๊ฐ€์ง„ ๊ฝƒ์˜ ์”จ์•—์€ ๊ฝƒ์„ ์‹ฌ๊ณ ๋‚˜๋ฉด ์ •ํ™•ํžˆ 1๋…„ํ›„์— ๊ฝƒ์ด ํ”ผ๋ฏ€๋กœ ์ง„์•„๋Š” ๋‹ค์Œํ•ด ์‹๋ชฉ์ผ ๋ถ€ํ„ฐ ๊ฝƒ๊ธธ์„ ๊ฑธ์„ ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ง„์•„์—๊ฒŒ๋Š” ๊ฝƒ์˜ ์”จ์•—์ด ์„ธ๊ฐœ๋ฐ–์— ์—†์—ˆ์œผ๋ฏ€๋กœ ์„ธ ๊ฐœ์˜ ๊ฝƒ์ด ํ•˜๋‚˜๋„ ์ฃฝ์ง€ ์•Š๊ณ  1๋…„ํ›„์— ๊ฝƒ์žŽ์ด ๋งŒ๊ฐœํ•˜๊ธธ ์›ํ•œ๋‹ค.

๊ฝƒ๋ฐญ์€ N*N์˜ ๊ฒฉ์ž ๋ชจ์–‘์ด๊ณ  ์ง„์•„๋Š” ์”จ์•—์„ (1,1)~(N,N)์˜ ์ง€์  ์ค‘ ํ•œ๊ณณ์— ์‹ฌ์„ ์ˆ˜ ์žˆ๋‹ค. ๊ฝƒ์˜ ์”จ์•—์€ ๊ทธ๋ฆผ (a)์ฒ˜๋Ÿผ ์‹ฌ์–ด์ง€๋ฉฐ 1๋…„ ํ›„ ๊ฝƒ์ด ํ”ผ๋ฉด ๊ทธ๋ฆผ (b)๋ชจ์–‘์ด ๋œ๋‹ค.

๊ฝƒ์„ ์‹ฌ์„ ๋•Œ๋Š” ์ฃผ์˜ํ•  ์ ์ด์žˆ๋‹ค. ์–ด๋–ค ์”จ์•—์ด ๊ฝƒ์ด ํ•€ ๋’ค ๋‹ค๋ฅธ ๊ฝƒ์žŽ(ํ˜น์€ ๊ฝƒ์ˆ )๊ณผ ๋‹ฟ๊ฒŒ ๋  ๊ฒฝ์šฐ ๋‘ ๊ฝƒ ๋ชจ๋‘ ์ฃฝ์–ด๋ฒ„๋ฆฐ๋‹ค. ๋˜ ํ™”๋‹จ ๋ฐ–์œผ๋กœ ๊ฝƒ์žŽ์ด ๋‚˜๊ฐ€๊ฒŒ ๋œ๋‹ค๋ฉด ๊ทธ ๊ฝƒ์€ ์ฃฝ์–ด๋ฒ„๋ฆฌ๊ณ  ๋งŒ๋‹ค.

๊ทธ๋ฆผ(c)๋Š” ์„ธ ๊ฝƒ์ด ์ •์ƒ์ ์œผ๋กœ ํ•€ ๋ชจ์–‘์ด๊ณ  ๊ทธ๋ฆผ(d)๋Š” ๋‘ ๊ฝƒ์ด ์ฃฝ์–ด๋ฒ„๋ฆฐ ๋ชจ์–‘์ด๋‹ค.

ํ•˜์ดํ…Œํฌ ์•ž ํ™”๋‹จ์˜ ๋Œ€์—ฌ ๊ฐ€๊ฒฉ์€ ๊ฒฉ์ž์˜ ํ•œ ์ ๋งˆ๋‹ค ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ง„์•„๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์„ธ ์”จ์•—์„ ๋ชจ๋‘ ๊ฝƒ์ด ํ”ผ๊ฒŒํ•˜๋ฉด์„œ ๊ฐ€์žฅ ์‹ผ ๊ฐ€๊ฒฉ์— ํ™”๋‹จ์„ ๋Œ€์—ฌํ•˜๊ณ  ์‹ถ๋‹ค.

๋‹จ ํ™”๋‹จ์„ ๋Œ€์—ฌํ•  ๋•Œ๋Š” ๊ฝƒ์žŽ์ด ํ•€ ๋ชจ์–‘์„ ๊ธฐ์ค€์œผ๋กœ ๋Œ€์—ฌ๋ฅผ ํ•ด์•ผํ•˜๋ฏ€๋กœ ๊ฝƒ ํ•˜๋‚˜๋‹น 5ํ‰์˜ ๋•…์„ ๋Œ€์—ฌํ•ด์•ผ๋งŒ ํ•œ๋‹ค.

๋ˆ์ด ๋งŽ์ง€ ์•Š์€ ์ง„์•„๋ฅผ ์œ„ํ•˜์—ฌ ์ง„์•„๊ฐ€ ๊ฝƒ์„ ์‹ฌ๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ตœ์†Œ๋น„์šฉ์„ ๊ตฌํ•ด์ฃผ์ž!

์ž…๋ ฅ

์ž…๋ ฅ์˜ ์ฒซ์งธ ์ค„์— ํ™”๋‹จ์˜ ํ•œ ๋ณ€์˜ ๊ธธ์ด N(6≤N≤10)์ด ๋“ค์–ด์˜จ๋‹ค.

์ดํ›„ N๊ฐœ์˜ ์ค„์— N๊ฐœ์”ฉ ํ™”๋‹จ์˜ ์ง€์ ๋‹น ๊ฐ€๊ฒฉ(0≤G≤200)์ด ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

๊ฝƒ์„ ์‹ฌ๊ธฐ ์œ„ํ•œ ์ตœ์†Œ ๋น„์šฉ์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

ํ’€์ด

// Authored by : seondal
// Co-authored by : -

// #include <bits/stdc++.h>
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

typedef pair<int,int> p;

vector<vector<int>> input;
vector<vector<p>> successPos;

int dx[] = {0,0,-1,1};
int dy[] = {1,-1,0,0};

// ์ฃผ์–ด์ง„ ๋ฒกํ„ฐ์— ์žˆ๋Š” ์”จ์•—๋“ค์ด ๊ฝƒ์„ ํ”ผ์› ์„ ๋•Œ ๋•… ๊ฐ€๊ฒฉ์„ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜
int calcSum(vector<p> v) {
    int sum = 0;
    
    for(int i=0; i<3; i++) {
        p cur = v[i];
        
        sum += input[cur.first][cur.second];  // ์”จ์•— ์œ„์น˜ ๋•…๊ฐ’ ๋”ํ•˜๊ณ 
        
        // ์œ„์น˜๊ฐ€ ์ฃผ์–ด์ง„ ์”จ์•—์˜ ๊ฝƒ ํ”ผ์šฐ๊ธฐ
        for(int dir=0; dir<4; dir++) {
            int x = cur.first + dx[dir];
            int y = cur.second + dy[dir];
            
            sum += input[x][y];  // ๊ฝƒ์žŽ ์œ„์น˜ ๋•…๊ฐ’ ๋”ํ•˜๊ณ 
        }
    }
    
    return sum;
}

// ์„ธ ์ขŒํ‘œ์— ์”จ์•—์„ ์‹ฌ์—ˆ์„ ๋•Œ ๊ฝƒ ๊ฐœํ™”๊ฐ€ ์„ฑ๊ณตํ•˜๋Š”์ง€ ๋ฆฌํ„ด
bool isSucceed(int n, vector<p> &seedpos) {
    vector<vector<bool>> flowerPos (n, vector<bool>(n,false));
    
    // ๊ฝƒ ์œ„์น˜ ๋ฒกํ„ฐ์— ์”จ์•— ์œ„์น˜ ํ‘œ์‹œ
    for(int i=0; i<3; i++)
        flowerPos[seedpos[i].first][seedpos[i].second] = true;
    
    // ๊ฝƒ ํ”ผ์šฐ๊ธฐ
    for(int i=0; i<3; i++) {
        p cur = seedpos[i];
        
        // (์”จ์•—์˜ ์ƒํ•˜์ขŒ์šฐ์— ์œ„์น˜ ํ‘œ์‹œ)
        for(int dir=0; dir<4; dir++) {
            int x = cur.first + dx[dir];
            int y = cur.second + dy[dir];
            
            // ๊ฝƒ์ด ๋•…์„ ๋ฒ—์–ด๋‚˜๊ฑฐ๋‚˜ ์ด๋ฏธ ๊ฝƒ์ด ์žˆ์–ด์„œ ๊ฒน์นœ๋‹ค๋ฉด
            if(x<0 || x>=n || y<0 || y>=n || flowerPos[x][y])
                return false;
            
            flowerPos[x][y] = true;
        }
    }
    
    return true;
}

int solution (int n) {
    // permutation์œผ๋กœ ์กฐํ•ฉ์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•œ ์ž„์‹œ ๋ฐฐ์—ด
    int tot = n*n;
    vector<bool> tmp(tot, false);
    tmp[tot-1] = tmp[tot-2] = tmp[tot-3] = true;
    
    do{
        vector<p> seedPos;
        // ์กฐํ•ฉ์œผ๋กœ ์”จ์•— ์œ„์น˜๊ฐ€ ๋ ์ˆ˜ ์žˆ๋Š” ์ขŒํ‘œ๋“ค ๊ตฌํ•ด์„œ seedPos ๋ฒกํ„ฐ์— ๋„ฃ๊ธฐ
        for(int i=0; i<tot; i++) {
            if(tmp[i])
                seedPos.push_back({i/n, i%n});
        }
        
        // ์”จ์•— ์‹ฌ๊ธฐ์— ์„ฑ๊ณตํ•˜๋ฉด successPos์— ๋„ฃ๊ธฐ
        if(isSucceed(n, seedPos))
            successPos.push_back(seedPos);
        
    } while (next_permutation(tmp.begin(), tmp.end()));
    
    // ๊ฐ ์กฐํ•ฉ์˜ ๋•…๊ฐ’๋“ค์˜ ์ตœ์†Ÿ๊ฐ’ ๊ตฌํ•˜๊ธฐ
    int minCost = 3001;
    for(int i=0; i<successPos.size(); i++) {
        int curCost = calcSum(successPos[i]);
        minCost = min(minCost, curCost);
    }
    
    return minCost;
}
int main() {
    int n;
    cin >> n;
    input.assign(n, vector<int>(n,0));
    for(int i=0; i<n; i++)
        for(int j=0; j<n; j++)
            cin >> input[i][j];
    
    cout << solution(n);
}

/*
 */
๋ฐ˜์‘ํ˜•