๐ ๋งํฌ
https://www.acmicpc.net/problem/18405
https://github.com/jokj624/PS/blob/master/15000-20000/18405.cpp
๐คฏ ํ์ค ํ๊ธฐ
ํ๋ฒ์ ํจ์จ์ ์ธ ์ฝ๋๋ฅผ ์ง๊ณ ์ถ๋ค. ๐ค
๐คท ๋ฌธ์
๐ฉ๐ป ํ์ด
๋จ์ํ BFS ๋ฌธ์ ์ด๋ค. ๊ทผ๋ฐ ๊ณ ๋ คํด์ผํ ์ ์ด ์กฐ๊ธ ์๋๋ฐ ๋ฌธ์ ์ ๋์์๋ฏ, ์ข ๋ฅ ๋ฒํธ๊ฐ ๋ฎ์ ๋ฐ์ด๋ฌ์ค๋ถํฐ ์ฆ์ํ๋ค๋ ์ ์ด๋ค.
์ฒ์์ ์ด ์ด์ ๋ก ์ฐ์ ์์ ํ๋ฅผ ์ผ๋๋ฐ ์ฐ์ ์์ ํ๋ ์ฝ์ ๋๋ง๋ค heap ์ ๋ ฌ์ด ์ผ์ด๋ ์ด ๋ฌธ์ ๊ตฌํ์๋ ์ ํฉํ์ง ์์ ๊ฒ์ ํ์ธํ๋ค. ๊ทธ๋์ ๊ทธ๋ฅ ํ๋ก ๋ฐ๊ฟจ๋ค๊ฐ ์ด์จ๋ ๋งค ์ด๋ง๋ค sorting์ด ์ผ์ด๋์ผ ํ๋ vector๋ก ๊ตฌํํ๊ธฐ๋ก ํ๋ค.
virus ๊ตฌ์กฐ์ฒด๋ฅผ ๋ง๋ค์ด virus ์ข ๋ฅ ๋ฒํธ์ ์์น ์ขํ๋ฅผ ๋ฒกํฐ์ ์ ์ฅํด์ค๋ค. ๋งค ์ด๋ง๋ค virus๊ฐ ์ ์ฅ๋ ๋ฒกํฐ๋ฅผ sortingํด์ค๋ค. ๋ฐ์ด๋ฌ์ค ์ข ๋ฅ ๋ฒํธ๊ฐ ๋ฎ์ ๊ฒ ๋ถํฐ ์์ ์ค๋๋ก!
๊ทธ๋ฆฌ๊ณ BFS ๋ฅผ ํตํด ๋ฒกํฐ์ ํ์ฌ ์๋ virus๋ค์ ์์๋๋ก ์-ํ-์ข-์ฐ๋ก ํผ์ง๊ฒ ํ๋ค.
visit vector๋ ํ์์๋ค. ์ด์ฐจํผ ๋ฐ์ด๋ฌ์ค๊ฐ ์๋ ์นธ์ 0์ด๊ณ , ์๋ ์นธ์ ์ข ๋ฅ ๋ฒํธ๊ฐ ์ฑ์์ ธ์๊ธฐ ๋๋ฌธ์ ๊ทธ๊ฒ์ผ๋ก ์ถฉ๋ถํ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ์ ์ ์๋ค.
์ ์ถํ์ ๋, TLE๊ฐ ๋ฐ์ํ๋๋ฐ ๊ณฐ๊ณฐํ ์๊ฐํด๋ณด๋ค๊ฐ S์ด๊ฐ ๋๊ธฐ ์ ์ ์ด๋ฏธ X,Y ์นธ์ ๋ฐ์ด๋ฌ์ค๊ฐ ์ฑ์์ก๋ค๋ฉด ๋์ด์ ๋ณผ ํ์ ์๋๊ฑธ ์ฒดํฌํ์ง ๋ชปํ์ด์ break๋ฌธ์ ์ถ๊ฐ ํด์คฌ๋๋ ๋ฐ๋ก ํต๊ณผํ๋ค.
๐ป ์ฝ๋
//AC
//BOJ 18405 ๊ฒฝ์์ ์ ์ผ
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int arr[202][202];
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0}; //์ํ์ข์ฐ ์ขํ ๋ฐฐ์ด
struct Virus{
int virus;
int x;
int y;
}; //Virus ๊ตฌ์กฐ์ฒด, ์ข
๋ฅ, ์์น ์ ๋ณด ๋ด๋๋ค.
bool cmp(const Virus& v1, const Virus& v2){
return v1.virus < v2.virus;
} // virus ์ข
๋ฅ๊ฐ ๋ฎ์ ๊ฒ ๋ถํฐ ์ ๋ ฌ
int main(){
vector<Virus> vec;
int N, K, S, X, Y;
scanf("%d %d", &N, &K);
for(int i=1; i<=N; i++){
for(int j=1; j<=N; j++){
scanf("%d", &arr[i][j]);
if(arr[i][j] >= 1 && arr[i][j] <= K){
vec.push_back({arr[i][j], i, j}); // ๋ฐ์ด๋ฌ์ค ์ ๋ณด push
}
}
}
scanf("%d %d %d", &S, &X, &Y);
int s = 0;
while(s < S){ // ์ด๊ฐ ์์ง S์ ๋๋ฌํ์ง ๋ชปํ๋ค๋ฉด
sort(vec.begin(), vec.end(), cmp); //1์ด ์ฆ๊ฐํ ๋๋ง๋ค ์๋ก sort
int len = vec.size();
for(int j=0; j<len; j++){
Virus v = vec[j];
for(int i=0; i<4; i++){
int nx = v.x + dx[i];
int ny = v.y + dy[i];
if(nx <= 0 || ny <= 0 || nx > N || ny > N) continue; //๊ฒฝ๊ณ์ ์์ธ ์ฒ๋ฆฌ
if(!arr[nx][ny]){
arr[nx][ny] = v.virus; // ๋ฐ์ด๋ฌ์ค ์ฑ์ฐ๊ธฐ
vec.push_back({arr[nx][ny], nx, ny});
}
}
}
if(arr[X][Y] > 0) break; // s < S ์ผ ๋, ์ด๋ฏธ ์ฑ์์ก๋ค๋ฉด ๋ ์ด์ ๋ณผ ํ์ ์๋ค.
s++; //1์ด ์ฆ๊ฐ์ํจ๋ค
}
printf("%d", arr[X][Y]);
return 0;
}
์ฌ์ค ํ๊ณ ๋์ ๋ค๋ฅธ ๋ถ๋ค์ ์ด๋ป๊ฒ ํ์์ง? ํ๊ณ ๊ตฌ๊ฒฝํด๋ดค๋๋ฐ
๋งค ์ด๋ง๋ค sort๋ฅผ ํ ๊ฑด ์์ฒญ ๋นํจ์จ์ ์ธ ์ฝ๋์๋ค!
๋งจ ์ฒ์์๋ง sort๋ฅผ ํด์ฃผ๋ฉด ๊ทธ ์ดํ๋ก๋ ์์์ ์ข ๋ฅ๊ฐ ๋ฎ์ ๋ฐ์ด๋ฌ์ค ๋ถํฐ ๋ฒกํฐ์ ๋ด๊ธธ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋๊น ๊ฒฐ๊ตญ ์ฒ์์๋ง ์ ๋ ฌํด์ฃผ๊ณ ์์ํ๋ฉด ๋ค์๋ ์์์ ๋ฎ์ ๋ฒํธ๋ถํฐ ๋ค์ด์จ๋ค๋ ๊ฒ์ด๋ค.
์ฝ๋ ํ์ค๋ง ์์ ํด์ฃผ๊ณ ๋ค์ ์ ์ถํ๋๋ ๋ฌด๋ ค 4ms๋ ์ค์ด๋ค์๋ค.
//AC
//BOJ 18405 ๊ฒฝ์์ ์ ์ผ
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int arr[202][202];
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
struct Virus{
int virus;
int x;
int y;
};
bool cmp(const Virus& v1, const Virus& v2){
return v1.virus < v2.virus;
}
int main(){
vector<Virus> vec;
int N, K, S, X, Y;
scanf("%d %d", &N, &K);
for(int i=1; i<=N; i++){
for(int j=1; j<=N; j++){
scanf("%d", &arr[i][j]);
if(arr[i][j] >= 1 && arr[i][j] <= K){
vec.push_back({arr[i][j], i, j});
}
}
}
scanf("%d %d %d", &S, &X, &Y);
int s = 0;
sort(vec.begin(), vec.end(), cmp);
while(s < S){
int len = vec.size();
for(int j=0; j<len; j++){
Virus v = vec[j];
for(int i=0; i<4; i++){
int nx = v.x + dx[i];
int ny = v.y + dy[i];
if(nx <= 0 || ny <= 0 || nx > N || ny > N) continue;
if(!arr[nx][ny]){
arr[nx][ny] = v.virus;
vec.push_back({arr[nx][ny], nx, ny});
}
}
}
if(arr[X][Y] > 0) break;
s++;
}
printf("%d", arr[X][Y]);
return 0;
}
์์ง๋ ํ๋ฒ์ ํจ์จ์ ์ด๊ฒ ์ฝ๋๋ฅผ ์ง๋ ค๋ฉด ๋ฉ์๋ค.
'DEV > PS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ/1103] ๊ฒ์, c++ (0) | 2021.05.29 |
---|---|
[BOJ/13334] ์ฒ ๋ก, c++ (0) | 2021.05.20 |
[BOJ/20127] Y-์์ด, C++ (0) | 2021.05.14 |
์ 1ํ SMUPC ์๋ช ํ๋ก๊ทธ๋๋ฐ ๊ฒฝ์ง๋ํ ์ฐธ๊ฐ ํ๊ธฐ (4) | 2021.05.09 |
[BOJ/7569] ํ ๋งํ , c++ (0) | 2021.05.06 |