[๋ฌธ์ ]
[๋ฌธ์ ์กฐ๊ฑด]
- ๋๊ธฐ์ค์ 5๊ฐ์ด๋ฉฐ, ๊ฐ ๋๊ธฐ์ค์ 5x5 ํฌ๊ธฐ์ ๋๋ค.
- ๊ฑฐ๋ฆฌ๋๊ธฐ๋ฅผ ์ํ์ฌ ์์์๋ค ๋ผ๋ฆฌ๋ ๋งจํดํผ ๊ฑฐ๋ฆฌ๊ฐ 2 ์ดํ๋ก ์์ง ๋ง์ ์ฃผ์ธ์.
- ๋จ ์์์๊ฐ ์์์๋ ์๋ฆฌ ์ฌ์ด๊ฐ ํํฐ์ ์ผ๋ก ๋งํ ์์ ๊ฒฝ์ฐ์๋ ํ์ฉํฉ๋๋ค.
[๋ฌธ์ ํด์ค]
์์์, ์ฑ ์, ํํฐ์ ์ ๋ณด๊ฐ ๋ด๊ธด vector<string> ์ด ์ฃผ์ด์ง๊ณ ,
์์์๋ค์ด ๋งจํํผ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ ์งํ๊ณ ์๋์ง ํ์ํ๋ฉด ๋๋ค.
์ด ๋, ๋งจํํผ ๊ฑฐ๋ฆฌ๋ ๋ ์ขํ (r1, c1), (r2, c2)๊ฐ ์ฃผ์ด์ก์ ๋,
๏ฝr1-r2๏ฝ+๏ฝc1-c2๏ฝ๋ก ํ๋จ ๊ฐ๋ฅํ๋ค.
์๋ฅผ ๋ค์ด, (0, 0), (2, 0)์ ์ขํ๋ผ๋ฉด ๏ฝ0-2๏ฝ+๏ฝ0-0๏ฝ= 2 ์ด๋ฏ๋ก
์ด ์ขํ์ฌ์ด์ ํํฐ์ ์ด ์กด์ฌํ์ง ์๋๋ฐ P๊ฐ ์์ผ๋ฉด ์๋๋ค. (์๋ ์ด๋ฏธ์ง ์ฐธ์กฐ)
์ฆ, ๋จ์ํ 3x3 ํ์ด ๋ฒ์๋ง ํ์ ํ๋ฉด ์๋๋ ์ด์ ์ด๋ค.
์ผํ ๋ณด๋ฉด, ๊ฑฐ๋ฆฌ๋๊ธฐ๋ฅผ ๋ชจ๋ ๋ง์กฑํ๋ ๊ฒ ๊ฐ์ง๋ง,
(0, 0)๊ณผ (2, 0)์ P ๋ ๋งจํํผ ๊ฑฐ๋ฆฌ๊ฐ 2์ด๊ณ ๋น ์ฑ ์์ด ์ฌ์ด์ ์์ผ๋ฏ๋ก ๊ฑฐ๋ฆฌ๋๊ธฐ๋ฅผ ์งํค์ง ์์ ๊ฐ์์ค์ด๋ค.
[ํ์ด ํด์ค ๋ฐ ์ฝ๋]
; P์ ์ขํ์์ ๋งจํํผ๊ฑฐ๋ฆฌ๊น์ง๋ฅผ BFS๋ก ํ์ํ๋ฉด์ ๋ ๋ค๋ฅธ P๋ฅผ ๋ง๋๋์ง๋ฅผ ํ์ธํ๋ ๋ฐฉ๋ฒ์ผ๋ก ํ์๋ค.
1) P์ ๋ชจ๋ ์ขํ๋ฅผ pair vector์ ๋ฃ์ด๋๊ณ vector ์ฌ์ด์ฆ๋งํผ ํ์์ ์งํํ๋ค.
vector<pair<int, int>> person_seats ๋ณ์.
2) ์ฒซ๋ฒ์งธ person_seats ์ขํ๋ถํฐ BFS๋ก ์ํ์ข์ฐ๋ฅผ ํ์ํ๋ค. queue<pair<int, int>> q ๋ณ์์ direction[4][2] ๋ณ์๋ก.
์ด ๋, ์ฌ๋ฐฉ๋ฌธ์ ๋ง๊ธฐ ์ํด ๋ฐฉ๋ฌธ์ฒดํฌ๋ณ์์ ๋ฐฉ๋ฌธ์ฌ๋ถ๋ฅผ ์ฒดํฌํ๋ค. ์ด ๋, X,Y ๋ฒ์๋ฅผ ๋์ง ์๋์ง, ์ด๋ฏธ ๋ฐฉ๋ฌธํ๋ ๊ณณ์ ์๋์ง๋ฅผ ์ฒดํฌํ๋ฉด์ ํ์ํ๋ค.
3) ๋ค์ ์ขํ๊ฐ P๋ผ๋ฉด ๋งจํํผ ๊ฑฐ๋ฆฌ 2 ์์ ์๋ ์ขํ์ด๋ฉด์ P๊ฐ ๋ ์กด์ฌํ๋ค๋ ๋ง์ด๋ฏ๋ก ๊ฑฐ๋ฆฌ๋๊ธฐ๋ฅผ ์งํค์ง ์์๋ค๋ ๋ง์ด๋ค. false ๊ฐ์ ๋ฆฌํดํด์ค๋ค.
4) ๋ค์ ์ขํ๊ฐ O๋ผ๋ฉด ๋น์๋ฆฌ์ด๋ฏ๋ก ํด๋น ์ขํ๋ฅผ ๋ค์ ํ์ํด์ผ ํ๋ฏ๋ก queue์ ๋ฃ์ด์ฃผ๊ณ , ๋ฐฉ๋ฌธ์ฒดํฌํด์ค๋ค.
5) ํ๋ฒ ์ํ์ข์ฐ๋ก BFS ํ์์ ํ๊ฒ ๋๋ฉด ๊น์ด๊ฐ 1์ธ ๊ณณ์ ๋ค ํ์ํ๋ ๊ฒ ๋๋ค. ๊น์ด๋ ๋งจํํผ ๊ฑฐ๋ฆฌ์๋ ๊ฐ๋ค.
7) ๋ค์ํ๋ฒ BFS ํ์์ ์งํํ๊ณ , ๊น์ด๊ฐ 2์ธ ๊ณณ = ๋งจํํผ ๊ฑฐ๋ฆฌ๊ฐ 2์ธ๊ณณ ๊น์ง ๋ด์ค๋ค.
8) ๋ค์ BFS ํ์์ ์งํํ ๋, ๋งจํํผ๊ฑฐ๋ฆฌ๊ฐ 2๋ผ๋ฉด, ๋ค์ ํ์์ ๋งจํํผ๊ฑฐ๋ฆฌ 3์ธ ์ขํ๊ฐ ๋๋ค. ์ฆ, ์ด๋ฏธ 2์ธ๊ฑฐ๋ฆฌ๊น์ง ํ์ํ๋ค๋ ์๋ฏธ์ด๋ฏ๋ก ํด๋น P์ ์ขํ๋ ๋์ด์ ๋ณผ ํ์๊ฐ ์๋ค. break๋ฌธ์ผ๋ก ๋ค์ P์ ์ขํ๋ฅผ ํ์ํ๊ธฐ ์ํด ๋น ์ ธ๋์จ๋ค.
if (abs(person_seats[i].first - curX) + abs(person_seats[i].second - curY) == 2) break; ๊ฐ ๋ฐ๋ก ์ด ๋ถ๋ถ !
9) ๋ชจ๋ P์ ์ขํ๋ฅผ ๋ค ํ์ํ๋๋ฐ return false๋ฌธ์ ๋ง๋์ง ์์๋ค๋ฉด, ๋ชจ๋ ์ขํ๊ฐ ๊ฑฐ๋ฆฌ๋๊ธฐ๋ฅผ ๋ง์กฑํ๋ค๋ ์๋ฏธ์ด๋ฏ๋ก true๋ฅผ ๋ฆฌํดํด์ค๋ค.
#include <string>
#include <vector>
#include <queue>
#include <cmath>
#include <iostream>
using namespace std;
bool checkSeat(vector<string>, vector<pair<int, int>>);
vector<int> solution(vector<vector<string>> places) {
vector<int> answer;
for (int i = 0; i < 5; i++) {//๊ฐ์์ค 5๊ฐ
vector<pair<int, int>> person_seats;
for (int row = 0; row < 5; row++) {//ํ ๊ฐ์์ค ๋ด์ ํ ํ
for (int col = 0; col < 5; col++) {//ํ ๊ฐ์์ค ๋ด์ ํ ์ด
if (places[i][row][col] == 'P') {
person_seats.push_back(make_pair(row, col));
}
}
}
checkSeat(places[i], person_seats) ? answer.push_back(1) : answer.push_back(0);
}
return answer;
}
bool checkSeat(vector<string> classroom, vector<pair<int, int>> person_seats) {//BFS
int direction[4][2] = {{-1,0},{0,1},{1,0},{0,-1}}; //์, ์ค๋ฅธ์ชฝ, ์๋, ์ผ์ชฝ
for (int i = 0; i < person_seats.size(); i++) {
int visited[5][5] = { 0, };
queue<pair<int, int>> q;
q.push(make_pair(person_seats[i].first, person_seats[i].second));
visited[person_seats[i].first][person_seats[i].second] = 1;
while (!q.empty()) {
int curX = q.front().first;
int curY = q.front().second;
q.pop();
if (abs(person_seats[i].first - curX) + abs(person_seats[i].second - curY) == 2) break;
for (int i = 0; i < 4; i++) {
int nextX = curX + direction[i][0];
int nextY = curY + direction[i][1];
if (nextX >= 0 && nextX < 5 && nextY >= 0 && nextY < 5 && visited[nextX][nextY] == 0) {
if (classroom[nextX][nextY] == 'P') return false;
else if (classroom[nextX][nextY] == 'O') {
visited[nextX][nextY] = 1;
q.push(make_pair(nextX, nextY));
}
}
}
}
}
return true;//๊ฑฐ๋ฆฌ๋๊ธฐ๋ฅผ ์งํค์ง ๋ชปํ ๊ฒฝ์ฐ๋ฅผ ๋ค ํต๊ณผํ๋ค๋ฉด, ๊ฑฐ๋ฆฌ๋๊ธฐ๋ฅผ ์ ์งํจ ๊ฒ.
}
์ฐธ๊ณ ๋ก... ํ๋ฆฐ ํ์ด ๋ฐ ํ๋ฆฐ ์ฝ๋๋... ๊ฑ ์ฐธ๊ณ ๋ง...
์ฒจ์ ๋งจํํผ ๊ฑฐ๋ฆฌ๊ฐ 2x2 ์์ธ์ค ์๊ณ ,
๋ธ๋ฃจํธํฌ์ค๋ก P์ ์ขํ๋ฅผ pair vector์ ๋ชจ๋ ์ ์ฅํ ํ,
vector๊ฐ ๋น ๋๊น์ง ํ์ํ๋ ๋ฐ,
๊ฑฐ๋ฆฌ๋๊ธฐ๋ฅผ ์งํค์ง ์์๋ค๋ ์กฐ๊ฑด์ผ๋ก
P์ ์ํ์ข์ฐ์ P๊ฐ ์์ ๋์
P ์ํ์ข์ฐ์ O๊ฐ ์๊ณ ๋๊ฐ์ ์ P๊ฐ ์์ ๋๋ก ๋ฌ์ if๋ฌธ์ผ๋ก ๋จ์๋ฌด์ํ๊ฒ ์งฐ๋ค.
๊ฒฐ๊ณผ๋ 3, 8, 9, 12๋ฒ ํ ์คํธ ์ผ์ด์ค ์คํจ.
ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ฐพ์๋ณด๊ณ ๋งจํํผ ๊ฑฐ๋ฆฌ์ ์ฐธ๋ ์๋ฏธ๋ฅผ ์๊ฒ ๋์๋ค... ํํ...
๋ฌธ์ ์กฐ๊ฑด ์ ์ฝ์...
๊ตฌํ์ธ์ค ์๊ณ ๋จ์๋ฌด์ํ๊ฒ ์งฐ๋๋ฐ ์๋๋ฉด, BFS/DFS/DP ๋ฑ ์๊ณ ๋ฆฌ์ฆ ์ชฝ์ผ๋ก ์๊ฐํด๋ณด์.
๋ฌธ์ ์์ ์๊ตฌํ๋ ๋ฐ๊ฐ ์๋ ์๋ ์๋ค!! ์ซ๋ง ๋ ์ง์คํด์ ์ฝ๋ฉํ์...
#include <string>
#include <vector>
#include <iostream>
using namespace std;
bool checkSeat(vector<string>, vector<pair<int,int>>);
vector<int> solution(vector<vector<string>> places) {
vector<int> answer;
for(int i = 0; i < 5; i++){//๊ฐ์์ค 5๊ฐ
vector<pair<int,int>> person_seats;
for(int row = 0; row < 5; row++){//ํ ๊ฐ์์ค ๋ด์ ํ ํ
for(int col = 0; col < 5; col++){//ํ ๊ฐ์์ค ๋ด์ ํ ์ด
if(places[i][row][col]=='P'){
person_seats.push_back(make_pair(row,col));
}
}
}
checkSeat(places[i], person_seats) ? answer.push_back(1) : answer.push_back(0);
}
return answer;
}
bool checkSeat(vector<string> classroom, vector<pair<int,int>> person_seats){
int direction[5][2] = {{0,1},{1,0},{-1,0},{1,1},{1,-1}}; //์ค๋ฅธ์ชฝ, ์๋, ์ผ์ชฝ, ์ค๋ฅธ์ชฝ ๋๊ฐ์ , ์ผ์ชฝ ๋๊ฐ์
for(int i = 0; i < person_seats.size(); i++){
int curX = person_seats[i].first;
int curY = person_seats[i].second;
for(int i = 0; i<3; i++){//์ค๋ฅธ์ชฝ, ์๋, ์ผ์ชฝ ํ์ธ
int nextX = curX + direction[i][0];
int nextY = curY + direction[i][1];
if(nextX < 0 || nextX >= 5 || nextY < 0 || nextY >= 5) continue;
if(classroom[nextX][nextY] == 'P'){
return false;
}
else if(classroom[nextX][nextY] == 'O'){
for(int j = 3; j < 5; j++){//์ค๋ฅธ์ชฝ ๋๊ฐ์ , ์ผ์ชฝ ๋๊ฐ์ ํ์ธ
nextX = curX + direction[j][0];
nextY = curY + direction[j][1];
if(nextX < 0 || nextX >= 5 || nextY < 0 || nextY >= 5) continue;
if(classroom[nextX][nextY] == 'P'){
return false;
}
}
}
}
}
return true;
}