https://school.programmers.co.kr/learn/courses/30/lessons/81302
* 2차원벡터다루기 형식
vector<vector<string> places
- main : for(auto place : places)
if(check) bfs(place) //이후 place[y][x]로 접근하라.
- check
for(i=0-5, j=0-5)
if(place[y][x]==사람) bfs there
* 2차원배열 초기화방법
bool visit[5][5]={false};
* 종이에그려보며 규칙세우기.
POOOP
OXXOX
OPXPX
OOXOX
POXXP
for(모든P bfs)
--------------------------------
- bfs
거리가 2초과-> 스킵
거리가 2이하 and 거기가 사람임 -> false
for(4방탐색)
범위쳌
방문함 ->스킵
next==x -> 스킵
방문처리
큐푸쉬
#include <string>
#include <vector>
#include <bits/stdc++.h>
using namespace std;
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
struct Point{
int y;
int x;
int dist;
};
bool bfs(vector<string> place,int y, int x){
queue<Point> q;
q.push({y,x,0});
bool v[5][5]={false};
v[y][x]=1;
while(q.size()){
Point curr=q.front(); q.pop();
if(curr.dist>2) continue;
//거리 2이하 and 초기위치아님 and 사람을만낫다 -> false
if(curr.dist!=0 and place[curr.y][curr.x]=='P') return false;
for(int i=0;i<4;++i){
int ny=curr.y+dy[i];
int nx=curr.x+dx[i];
if(ny<0 ||ny>=5 || nx<0||nx>=5) continue;
if(v[ny][nx]) continue;
if(place[ny][nx]=='X')continue;
v[ny][nx]=1;
q.push({ny,nx,curr.dist+1});
}
}
return true;
}
//사람에 대해 bfs 돌려주기
bool check(vector<string> place){
for(int i=0;i<5;++i){
for(int j=0;j<5;++j){
if(place[i][j]=='P'){
if(bfs(place,i,j)==false) return false;
}
}
}
//모든 사람에대해 실패가 아니면
return true;
}
vector<int> solution(vector<vector<string>> places) {
vector<int> answer;
for(vector<string> place : places){
if(check(place)) answer.push_back(1);
else answer.push_back(0);
}
return answer;
}
'Algorithm > programmers' 카테고리의 다른 글
프로그래머스 비밀지도 cpp python// 비트연산 문자열 (0) | 2023.07.11 |
---|---|
프로그래머스 이모티콘할인행사 // 중복순열, vector<pair<int,int>>정렬방법 (0) | 2023.06.28 |
프로그래머스 개인정보 수집 유효기간 // c++ split, 단위를통일하라, 함수화하고 cout으로 단위테스트하라. (0) | 2023.06.28 |
프로그래머스 숫자카드나누기 // 복잡하면 함수로.. , 배열을 정렬하라. (0) | 2023.06.22 |
프로그래머스 여행경로 // 키가 string인 dfs는 for(i)로 해결, 예외처리 백트래킹 (0) | 2023.06.21 |