๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm ๐Ÿง‘๐Ÿป‍๐Ÿ’ป/๋ฐฑ์ค€(BOJ)

[๋ฐฑ์ค€,c++] 17135๋ฒˆ - ์บ์Šฌ๋””ํŽœ์Šค

by ์•ˆ์ฃผํ˜• 2022. 8. 25.

๋ฌธ์ œ

 

17135๋ฒˆ: ์บ์Šฌ ๋””ํŽœ์Šค

์ฒซ์งธ ์ค„์— ๊ฒฉ์žํŒ ํ–‰์˜ ์ˆ˜ N, ์—ด์˜ ์ˆ˜ M, ๊ถ์ˆ˜์˜ ๊ณต๊ฒฉ ๊ฑฐ๋ฆฌ ์ œํ•œ D๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ๊ฒฉ์žํŒ์˜ ์ƒํƒœ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. 0์€ ๋นˆ ์นธ, 1์€ ์ ์ด ์žˆ๋Š” ์นธ์ด๋‹ค.

www.acmicpc.net

 

์ฝ”๋“œ

#include <iostream>
#include <vector>
#include <memory.h>
using namespace std;


int N, M, D, ans = -1, ans_temp;
int map_temp[16][16], map[16][16];


void attack_enemy(vector<pair<int,int>> enemy){
    for(auto it: enemy){
        if(it.first != 1e9 && it.second != 1e9){
            if(map_temp[it.first][it.second] == 1){
                map_temp[it.first][it.second] = 0;   // ์ ์„ ์ฃฝ์˜€์œผ๋‹ˆ ๋นˆ์นธ์œผ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.
                ans_temp++; // ์ฃฝ์ธ ํšŸ์ˆ˜ ์ฆ๊ฐ€
            }
        }
    }
}


void move_enemy(){  // ์  ์ด๋™
    vector<pair<int,int>> enemy_location;
    for(int i=0; i<N; i++){
        for(int k=0; k<M; k++){
            if(map_temp[i][k] == 1){
                int nr = i+1;
                int nc = k;
                if(nr<N) enemy_location.push_back({nr, nc});    // ์•„๋ž˜๋กœ ์ด๋™ํ–ˆ์„ ๋•Œ ์„ฑ์ด ์žˆ๋Š” ์นธ์ด ์•„๋‹ˆ๋ฉด ์ด๋™ํ•  ์œ„์น˜ ๊ธฐ์–ต
                map_temp[i][k] = 0;
            }
        }
    }
    
    for(auto it: enemy_location) map_temp[it.first][it.second] = 1; // ์  ์ด๋™
}

bool isenemy(){ //์ ์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ
    for(int i=0; i<N; i++){
        for(int k=0; k<M; k++){
            if(map_temp[i][k] == 1) return true;  // ์ ์ด ์กด์žฌํ•œ๋‹ค๋ฉด
        }
    }
    return false;   // ์ ์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด
}

vector<pair<int,int>> find_enemy(int archer1, int archer2, int archer3){ // ์  ์œ„์น˜ ํƒ์ƒ‰
    int min_d1 = 1e9, min_d2 = 1e9, min_d3 = 1e9;
    int enemy_r1 = 1e9, enemy_c1 = 1e9, enemy_r2 = 1e9, enemy_c2 = 1e9, enemy_r3 = 1e9, enemy_c3 = 1e9;
    
    for(int i=0; i<N; i++){ // ๊ฐ ๊ถ์ˆ˜๋งˆ๋‹ค ๊ฐ€๊นŒ์šด ์  ํƒ์ƒ‰
        for(int k=0; k<M; k++){
            if(map_temp[i][k] == 1){ // ๋นˆ์นธ์ด ์•„๋‹ˆ๋ผ ์ ์ผ ๊ฒฝ์šฐ
                int d1 = abs(N - i) + abs(archer1 - k);
                int d2 = abs(N - i) + abs(archer2 - k);
                int d3 = abs(N - i) + abs(archer3 - k);
                if(d1 <= min_d1 && d1 <= D){ // ๊ถ์ˆ˜1์ด ์ฃฝ์ผ ์ ์˜ ์ขŒํ‘œ
                    if(d1 == min_d1){
                        if(enemy_c1>k){
                            min_d1 = d1;
                            enemy_r1 = i;
                            enemy_c1 = k;
                        }
                    }
                    else{
                        min_d1 = d1;
                        enemy_r1 = i;
                        enemy_c1 = k;
                    }
                }
                if(d2 <= min_d2 && d2 <= D){ // ๊ถ์ˆ˜2๊ฐ€ ์ฃฝ์ผ ์ ์˜ ์ขŒํ‘œ
                    if(d2 == min_d2){
                        if(enemy_c2>k){
                            min_d2 = d2;
                            enemy_r2 = i;
                            enemy_c2 = k;
                        }
                    }
                    else{
                        min_d2 = d2;
                        enemy_r2 = i;
                        enemy_c2 = k;
                    }
                    
                }
                if(d3 <= min_d3 && d3 <= D){ // ๊ถ์ˆ˜3์ด ์ฃฝ์ผ ์ ์˜ ์ขŒํ‘œ
                    if(d3 == min_d3){
                        if(enemy_c3>k){
                            min_d3 = d3;
                            enemy_r3 = i;
                            enemy_c3 = k;
                        }
                    }
                    else{
                        min_d3 = d3;
                        enemy_r3 = i;
                        enemy_c3 = k;
                    }
                    
                }
            }
        }
    }
    return {{enemy_r1, enemy_c1}, {enemy_r2, enemy_c2}, {enemy_r3, enemy_c3}};  // ๊ฐ๊ฐ ๊ถ์ˆ˜๊ฐ€ ์ด์•ผํ•  ์  ์ขŒํ‘œ
}


void simulation(int archer1, int archer2, int archer3){
    memcpy(map_temp, map, sizeof(map));
    while(isenemy()){
        attack_enemy(find_enemy(archer1, archer2, archer3));
        move_enemy();
    }
    ans = max(ans, ans_temp);
    ans_temp = 0;
}


int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    cin>>N>>M>>D;
    
    // ๋งต ์ž…๋ ฅ
    for(int i=0; i<N; i++){
        for(int k=0; k<M; k++){
            cin>>map[i][k];
        }
    }
    
    // ๊ถ์ˆ˜ ์„ธ๋ช… ์œ„์น˜ ๊ณ ๋ฅด๊ธฐ
    for(int a = 0; a < M; a++){
        for(int b = a+1; b < M; b++){
            for(int c = b+1; c < M; c++){
                simulation(a, b, c);
            }
        }
    }
    
    cout<<ans;
    
}

 

ํ’€์ด

0 0 0 0
1 1 1 1
0 0 0 0
๊ถ์ˆ˜ ๊ถ์ˆ˜ ๊ถ์ˆ˜  

์œ„์™€ ๊ฐ™์ด N, M ํฌ๊ธฐ์˜ ๊ณต๊ฐ„์— 1์ด๋ผ๊ณ  ์ ํžŒ ๊ณณ์€ ์ ์„ ์˜๋ฏธํ•˜๋ฉฐ, N+1ํ–‰์€ ์„ฑ์ด ์žˆ๋Š” ๊ณณ์œผ๋กœ ์„ฑ์—๋Š” ์ตœ๋Œ€ ์„ธ๋ช…์˜ ๊ถ์ˆ˜๊ฐ€ ๊ฐ๊ฐ์˜ ์„ฑ์— ์œ„์น˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๊ฐ๊ฐ์˜ ํ„ด๋งˆ๋‹ค ๊ถ์ˆ˜๋Š” ์  ํ•˜๋‚˜๋ฅผ ๊ณต๊ฒฉํ•  ์ˆ˜ ์žˆ๊ณ , ๋ชจ๋“  ๊ถ์ˆ˜๋Š” ๋™์‹œ์— ๊ณต๊ฒฉํ•œ๋‹ค. 
  2. ๊ถ์ˆ˜๊ฐ€ ๊ณต๊ฒฉํ•˜๋Š” ์ ์€ ๊ฑฐ๋ฆฌ๊ฐ€ D์ดํ•˜์ธ ์  ์ค‘์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ ์ด๊ณ , ๊ทธ๋Ÿฌํ•œ ์ ์ด ์—ฌ๋Ÿฟ์ผ ๊ฒฝ์šฐ์—๋Š” ๊ฐ€์žฅ ์™ผ์ชฝ์— ์žˆ๋Š” ์ ์„ ๊ณต๊ฒฉํ•œ๋‹ค.
  3. ๊ฐ™์€ ์ ์ด ์—ฌ๋Ÿฌ ๊ถ์ˆ˜์—๊ฒŒ ๊ณต๊ฒฉ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ณต๊ฒฉ๋ฐ›์€ ์ ์€ ๊ฒŒ์ž„์—์„œ ์ œ์™ธ๋œ๋‹ค. 
  4. ๊ถ์ˆ˜์˜ ๊ณต๊ฒฉ์ด ๋๋‚˜๋ฉด, ์ ์ด ์ด๋™ํ•œ๋‹ค. ์ ์€ ์•„๋ž˜๋กœ ํ•œ ์นธ ์ด๋™ํ•˜๋ฉฐ, ์„ฑ์ด ์žˆ๋Š” ์นธ์œผ๋กœ ์ด๋™ํ•œ ๊ฒฝ์šฐ์—๋Š” ๊ฒŒ์ž„์—์„œ ์ œ์™ธ๋œ๋‹ค.
  5. ๋ชจ๋“  ์ ์ด ๊ฒฉ์žํŒ์—์„œ ์ œ์™ธ๋˜๋ฉด ๊ฒŒ์ž„์ด ๋๋‚œ๋‹ค. 

๊ฐ ์กฐ๊ฑด์— ๋งž๊ฒŒ ์ฐจ๊ทผ์ฐจ๊ทผ ๊ตฌํ˜„ํ•ด ๋‚˜๊ฐ€๋ฉด ๋˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฌธ์ œ๊ฐ€ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฌ๊ธด ํ•ด๋„ ์ œ์ผ ์žฌ๋ฐŒ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋Œ“๊ธ€