๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/3๋‹จ๊ณ„

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค Lv3] : ๊ธฐ๋‘ฅ๊ณผ ๋ณด ์„ค์น˜

by Jaeguk 2022. 7. 19.
๋ฌธ์ œ ๋งํฌ

https://school.programmers.co.kr/learn/courses/30/lessons/60061

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

์ตœ๋Œ€ 1000๊ฐœ์˜ ๊ฑด์„ค ๋ช…๋ น์„ ์ฒ˜๋ฆฌํ•œ ํ›„ ์ตœ์ข…์ ์œผ๋กœ ๋‚จ์•„์žˆ๋Š” ๊ธฐ๋‘ฅ๊ณผ ๋ณด์˜ ์œ„์น˜๋ฅผ ๋ฆฌํ„ดํ•˜์ž.

 

ํ’€์ด

๋ช…๋ น ํ˜•์‹์€ {x์ขŒํ‘œ, y์ขŒํ‘œ, ๊ธฐ๋‘ฅ or ๋ณด, ์‚ญ์ œ or ์„ค์น˜}๋กœ ๊ตฌ์„ฑ๋œ ๋ฒกํ„ฐ ํ˜•์‹์ด๋‹ค.

์ด๋•Œ ๊ธฐ๋‘ฅ๊ณผ ๋ณด๊ฐ€ ์„ค์น˜๋  ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด์ด ์žˆ๋‹ค.

โ— ๊ธฐ๋‘ฅ์€ ๋ฐ”๋‹ฅ ์œ„์— ์žˆ๊ฑฐ๋‚˜ ๋ณด์˜ ํ•œ์ชฝ ๋ ๋ถ€๋ถ„ ์œ„์— ์žˆ๊ฑฐ๋‚˜, ๋˜๋Š” ๋‹ค๋ฅธ ๊ธฐ๋‘ฅ ์œ„์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
โ— ๋ณด๋Š” ํ•œ์ชฝ ๋ ๋ถ€๋ถ„์ด ๊ธฐ๋‘ฅ ์œ„์— ์žˆ๊ฑฐ๋‚˜, ๋˜๋Š” ์–‘์ชฝ ๋ ๋ถ€๋ถ„์ด ๋‹ค๋ฅธ ๋ณด์™€ ๋™์‹œ์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์œ„์˜ ๋‘ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ๋ชปํ•˜๋ฉด, ์‚ญ์ œ ํ˜น์€ ์„ค์น˜๋ฅผ ํ•  ์ˆ˜ ์—†๋‹ค.

์œ„์˜ ์กฐ๊ฑด์„ ์–ด๊ธฐ๋Š” ๋ช…๋ น์ด ๋“ค์–ด์˜ฌ ๊ฒฝ์šฐ๋Š” ๋ช…๋ น์„ ๋ฌด์‹œํ•œ๋‹ค.

 

์ฒ˜์Œ์— ๋‚˜๋Š” ์—„์ฒญ๋‚œ ๊ฒฝ์šฐ์˜ ์˜ˆ์™ธ๋“ค์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋‹จ์ˆœ ๊ตฌํ˜„ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ์„ค์น˜ ๋˜๋Š” ์ œ๊ฑฐ ๋ช…๋ น์ด ๋“ค์–ด์™”์„ ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์™ธ ์ƒํ™ฉ์„ ํ•˜๋‚˜ ํ•˜๋‚˜ ์˜ˆ์ƒํ•˜๋ฉด์„œ ์ตœ๋Œ€ํ•œ ๊ตฌํ˜„์„ ํ–ˆ๋‹ค.

์˜ˆ์ œ ๋ฌธ์ œ๋Š” ๋‹ค ๋งžํ˜”์ง€๋งŒ, ์ฒ˜๋ฆฌ๋ฅผ ๋ชปํ•œ ์˜ˆ์™ธ๊ฐ€ ์žˆ์—ˆ๋Š” ์ง€ ์ •ํ™•์„ฑ ํ…Œ์ŠคํŠธ ๋Œ€๋ถ€๋ถ„์—์„œ ์‹คํŒจ๊ฐ€ ๋‚˜์™”๋‹ค.

 

์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์‰ฝ๊ฒŒ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š” ์„ค์น˜ ๋˜๋Š” ์‚ญ์ œ๋ฅผ ํ•œ ํ›„์— ๋ชจ๋“  ๊ธฐ๋‘ฅ์ด๋‚˜ ๋ณด๊ฐ€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์„ ์ฒ˜์Œ์— ์‹œ๋„ํ•˜์ง€ ์•Š์•˜๋˜ ์ด์œ ๋Š” ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒƒ ๊ฐ™์•„์„œ ์‹œ๋„์กฐ์ฐจ ํ•˜์ง€ ์•Š์•˜๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋ช…๋ น์€ ์ตœ๋Œ€ 1000๊ฐœ๋กœ ์ž…๋ ฅ์ด ๊ทธ๋ ‡๊ฒŒ ๋งŽ์ง€ ์•Š๋‹ค. ๊ณ„์†ํ•ด์„œ ๊ฑด๋ฌผ์„ ์„ค์น˜ํ•˜๋Š” ๋ช…๋ น๋งŒ ๋“ค์–ด์˜จ๋‹ค๊ณ  ํ•ด๋„ ๊ทธ๋ฆฌ ๋งŽ์€ ํƒ์ƒ‰์ด ํ•„์š”ํ•˜์ง€ ์•Š์Œ์„ ์ง์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์„ค์น˜๋œ ๊ฑด๋ฌผ์˜ ์ •๋ณด๋Š” building์ด๋ผ๋Š” ๋ฒกํ„ฐ ์ง‘ํ•ฉ์— ์ €์žฅํ•ด๋‘์—ˆ๋‹ค. set<vector<int>> building

๋ฒกํ„ฐ๊ฐ€ ์•„๋‹Œ set์— ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ์ด์œ ๋Š” ํƒ์ƒ‰๊ณผ ์‚ญ์ œ๊ฐ€ ๊ฐ„๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋˜ํ•œ ์ •๋‹ต๋„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ด์„œ ๋ฆฌํ„ดํ•ด์•ผ ํ•˜๋Š”๋ฐ, set์€ ์•Œ์•„์„œ ์ •๋ ฌ์„ ์‹œ์ผœ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ ์ •๋ ฌํ•ด ์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค.

 

1. ๊ธฐ๋‘ฅ์ด ์„œ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด

๊ธฐ๋‘ฅ์ด x, y์— ์„ค์น˜๋˜์–ด์žˆ๋‹ค๊ณ  ํ•˜์ž. 

์ œ์‹œ๋œ ์กฐ๊ฑด์— ์˜ํ•ด y == 0 ์ด๊ฑฐ๋‚˜, (x, y-1)์— ์„ค์น˜๋œ ๊ธฐ๋‘ฅ์ด ์กด์žฌํ•˜๊ฑฐ๋‚˜, (x, y-1) ๋˜๋Š” (x-1, y-1)์— ๋ณด๊ฐ€ ์กด์žฌํ•˜๋ฉด ๋œ๋‹ค.

=> ๋ฐ”๋‹ฅ์ด๊ฑฐ๋‚˜, ์•„๋ž˜์— ๊ธฐ๋‘ฅ ๋˜๋Š” ๋ณด๊ฐ€ ์กด์žฌํ•˜๋ฉด ๋œ๋‹ค.

์œ„์˜ 4๊ฐ€์ง€ ์กฐ๊ฑด ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋งŒ์กฑํ•˜๋ฉด ํ•ด๋‹น ๊ธฐ๋‘ฅ์€ ์กฐ๊ฑด์„ ๋งŒ์กฑ์‹œํ‚จ๋‹ค.

๋ฐ˜๋Œ€๋กœ 4๊ฐ€์ง€ ์กฐ๊ฑด์„ ๋ชจ๋‘ ๋งŒ์กฑํ•˜์ง€ ๋ชปํ•œ๋‹ค๋ฉด ํ•ด๋‹น ๊ธฐ๋‘ฅ์€ ์„ค์น˜๋  ์ˆ˜ ์—†๋‹ค.

 

2. ๋ณด๊ฐ€ ์„ค์น˜๋  ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด

๋ณด๊ฐ€ x, y์— ์„ค์น˜๋˜์–ด์žˆ๋‹ค๊ณ  ํ•˜์ž.

์ œ์‹œ๋œ ์กฐ๊ฑด์— ์˜ํ•ด  (x, y - 1) ๋˜๋Š” (x+1, y - 1)์— ๊ธฐ๋‘ฅ์ด ์กด์žฌํ•˜๊ฑฐ๋‚˜, (x-1, y)์™€ (x+1, y) ๋ชจ๋‘์— ๋ณด๊ฐ€ ์กด์žฌํ•˜๋ฉด ๋œ๋‹ค.

=> ์•„๋ž˜์— ๊ธฐ๋‘ฅ์ด ํ•˜๋‚˜๋ผ๋„ ์กด์žฌํ•˜๊ฑฐ๋‚˜, ์–‘์ชฝ์— ๋ณด๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์œผ๋ฉด ๋œ๋‹ค.

์œ„์˜ 3๊ฐ€์ง€ ์กฐ๊ฑด ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋งŒ์กฑํ•˜๋ฉด ํ•ด๋‹น ๋ณด๋Š” ์กฐ๊ฑด์„ ๋งŒ์กฑ์‹œํ‚จ๋‹ค.

๋ฐ˜๋Œ€๋กœ 3๊ฐ€์ง€ ์กฐ๊ฑด์„ ๋ชจ๋‘ ๋งŒ์กฑํ•˜์ง€ ๋ชปํ•˜๋ฉด ํ•ด๋‹น ๋ณด๋Š” ์„ค์น˜๋  ์ˆ˜ ์—†๋‹ค.

 

๋ช…๋ น์„ ์ผ๋‹จ ์ˆ˜ํ–‰ํ•œ ํ›„ ์œ„์˜ ๊ณผ์ •์„ ํ†ตํ•ด ๋ชจ๋“  ๊ธฐ๋‘ฅ๊ณผ ๋ณด๊ฐ€ ์กฐ๊ฑด์„ ๋งŒ์กฑ์‹œํ‚ค๋Š” ์ง€ ํ™•์ธํ•œ๋‹ค.

ํ•˜๋‚˜๋ผ๋„ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋‘ฅ ๋˜๋Š” ๋ณด๊ฐ€ ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ๋ช…๋ น์„ ์ฒ ํšŒํ•œ๋‹ค.

 

์ฝ”๋“œ ์ž‘์„ฑ
 
#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 100 + 5;
set<vector<int>> building;
 
bool is_ok(){
    for(auto build : building){
        if(!build[2]){//๊ธฐ๋‘ฅ
            int x = build[0];
            int y = build[1];
            if(y == 0)
                continue;
            vector<int> necessary[3= {{x,y-10}, {x-1,y,1}, {x,y,1}};
            bool chk = false;
            for(int i = 0; i< 3; i++){
                if(building.find(necessary[i]) != building.end()){
                    chk = true;
                    break;
                }
            }
            if(chk)
                continue;
            return false;
        }
        else if(build[2]){//๋ณด
            int x = build[0];
            int y = build[1];
            vector<int> necessary[4= {{x,y-10}, {x+1, y-10}, {x-1, y ,1} , {x+1,y,1}};
            if(building.find(necessary[0]) != building.end())
                continue;
            else if(building.find(necessary[1]) != building.end())
                continue;
            else if(building.find(necessary[2]) != building.end()
                   && building.find(necessary[3]) != building.end())
                continue;
            return false;
        }
    }
    return true;
}
vector<vector<int>> solution(int n, vector<vector<int>> build_frame) {
    vector<vector<int>> answer;
    for(auto build : build_frame){
        vector<int> v = {build[0], build[1], build[2]};
        int how = build[3];
        
        if(!how){ //์‚ญ์ œ
            building.erase(v);
            if(is_ok()) continue;
            else building.insert(v);
        }
        else if(how){ //์„ค์น˜
            building.insert(v);
            if(is_ok()) continue;
            else building.erase(v);
        }
    }
    
    for(auto v : building)
        answer.push_back(v);   
    return answer;
}
cs

 

728x90