[C++/PGS] Lv.2 : ์ง๊ฒ์ฐจ์ ํฌ๋ ์ธ
https://school.programmers.co.kr/learn/courses/30/lessons/388353#
ํ๋ก๊ทธ๋๋จธ์ค
SW๊ฐ๋ฐ์๋ฅผ ์ํ ํ๊ฐ, ๊ต์ก์ Total Solution์ ์ ๊ณตํ๋ ๊ฐ๋ฐ์ ์ฑ์ฅ์ ์ํ ๋ฒ ์ด์ค์บ ํ
programmers.co.kr
ํ๋ก๊ทธ๋๋จธ์ค ๋ ๋ฒจ 2
2025 ํ๋ก๊ทธ๋๋จธ์ค ์ฝ๋ ์ฑ๋ฆฐ์ง 1์ฐจ ์์ ๋ฌธ์ - ์ ๋ต๋ฅ 42%...
๊ฝค ๋ณต์กํ ๊ตฌํ+๊ทธ๋ํ ํ์ ๋ฌธ์ ์ด๋ค.
์ด ๋ฌธ์ ์ ํฌ์ธํธ๋ bfs ๋ฟ๋ง์๋๋ผ, ๋บ ์ ์๋ ์ง์ ์ด๋ ๋ฃจํธ๋ก ์ด๋ป๊ฒ ํ์ํ ์ง ์ฐพ๋๊ฒ ์ค์ํจโผ๏ธ
์๋ฅผ ๋ค์ด์, ๋ช ๋ น์ด๊ฐ "A"์ผ ๋
๋๋ ์ฒ์์ 'A'๋ผ๋ ์ง์ ์ฐพ๊ณ , ์ด ์ง์์ ์์ํ์ฌ ๋ชจ์๋ฆฌ๊น์ง ๋๋ฌํ ๋๊น์ง ์ํ์ข์ฐ๋ก ํ์ํ๋๋ฐ
์ด๊ฒ ์๋๋ผ ๋ชจ์๋ฆฌ์ ๋น์นธ์์ bfs๋ก 'A'๊น์ง ๋๋ฌํด์ผ ํด๊ฒฐ๋๋ ๋ฌธ์ ์๋ค ใ ใ
Store์์ for๋ฌธ์ ๋๋ฆฌ๋ฉฐ
๋ชจ์๋ฆฌ์ ์๋ ๋ฌธ์๊ฐ 'A'์ด๋ฉด -> ์ด ์ขํ๋ฅผ ๋ฐ๋ก ์ ์ฅํ๊ณ ,
๋ชจ์๋ฆฌ๊ฐ ๋น์นธ์ด๋ฉด -> ์ฌ๊ธฐ์๋ถํฐ ์์ชฝ์ผ๋ก ํ์ํ๋ฉฐ 'A'๋ฅผ ์ฐพ๊ธฐ
๊ทธ๋ฆฌ๊ณ visited ์ฒ๋ฆฌ๋ ์ค์ํ๋ค!!
์ฝ์งํ๋๋ผ ๊ณ ์ํ๋๋ฐ ๐ฅน ์ด ๊ธ์ด ๋๊ตฐ๊ฐ์๊ฒ ๋์์ด ๋๊ธธ..!
์ฐธ๊ณ ๋ก ์ฝ๋์์ map์ ์ ์จ๋ ๋๋ค (์ฝ์ง์ ํ์ )
๋์ ํ์ด
#include <string>
#include <vector>
#include <iostream>
#include <queue>
#include <unordered_map>
using namespace std;
vector<string> Store;
int n; int m;
int dx[4] = {0,1,0,-1};
int dy[4] = {1,0,-1,0};
int visited[51][51] ={0,};
int visitId = 1;
unordered_map<char, vector<pair<int, int>>> letters;
void deleteBox(string req){
char r = req[0];
if(req.length()==2){
for(auto p: letters[r]){
Store[p.first][p.second] = ' ';
}
letters[r].clear();
return;
}
vector<pair<int, int>> box;
for(int i=0; i<n; ++i){
for(int j=0; j<m; ++j){
// ๋ชจ์๋ฆฌ์์ ์ถ๋ฐํด์ผ ํจ
if(i!=0 && i!=n-1 && j!=0 && j!=m-1) continue;
if(Store[i][j]==r) {
box.push_back({i,j});
continue;
}
// ๋น์นธ์ด์ด์ผ ํจ
if(Store[i][j]!=' ') continue;
queue<pair<int,int>> q;
q.push({i,j});
visited[i][j] = visitId;
while(!q.empty()){ // ๋น์นธ์์ bfs๋ก r์ ์ฐพ๊ธฐ
auto [a, b] = q.front();
q.pop();
for(int k=0; k<4; ++k){
int nx = a+dx[k];
int ny = b+dy[k];
if(nx<0 || ny<0 || nx>=n || ny>=m) continue;
if(visited[nx][ny]==visitId) continue;
// ๋ค์ ์นธ์ด r์ธ ๊ฒฝ์ฐ - box์ ์ ์ฅ
if(Store[nx][ny]==r){
box.push_back({nx,ny});
visited[nx][ny] = visitId;
}
// ๋ค์ ์นธ๋ ๋น์นธ์ด๋ฉด ๊ณ์ ํ์
if(Store[nx][ny]==' '){
q.push({nx,ny});
visited[nx][ny] = visitId;
}
}
}
}
}
visitId++;
for(auto b: box) Store[b.first][b.second] = ' ';
}
int solution(vector<string> storage, vector<string> requests) {
int answer = 0;
Store = storage;
n = storage.size();
m = storage[0].size();
for(int i=0; i<n; ++i){
for(int j=0; j<m; ++j){
char c = Store[i][j];
letters[c].emplace_back(i, j);
}
}
for(string req: requests){
deleteBox(req);
}
for(int i=0; i<n; ++i){
for(int j=0; j<m; ++j){
if(Store[i][j]!=' ') answer ++;
}
}
return answer;
}