보통은 2차원의 맵을 돌면서 일정 조건 만족하는 최소 경로 찾기로 많이 나옴!
종류에는 크게 BFS, DFS가 있음!
DFS (상하좌우)
재귀로 탐색 구현하는 방법
BFS
삼성 코딩테스트에서 꼭 나오는 유형,, 많이 나온다
중요하게 고려해야할 점
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
#define MAX 26
int n,cnt=0;
string arr[MAX];
bool visited[MAX][MAX]={0,};
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
vector<int> result;
queue<pair<int,int>> q;
void bfs(int x,int y) { //한 단지 뭉치를 세는 함수
q.push({x,y});
visited[x][y]=true;
cnt++;
while(!q.empty()) {
int a = q.front().first; // queue에서 꺼낸 좌표
int b = q.front().second;
q.pop();
for(int i=0;i<4;i++) { //상하좌우 찾기
int nx = a + dx[i]; //새로운 상하좌우 반영한 좌표 nx, ny
int ny = b + dy[i];
if(0<=nx && 0<=ny && nx <n && ny < n && visited[nx][ny]==false && arr[nx][ny]=='1') {
q.push({nx,ny});
visited[nx][ny]=true;
cnt++;
}
}
}
}
int main() {
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&arr[i]);
for (int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
if(arr[i][j]=='1' && visited[i][j]==false) {
cnt =0; //단지 수
bfs(i,j);
result.push_back(cnt);
}
}
}
sort(result.begin(),result.end());
cout << result.size() << "\\n";
printf("%d\\n",result.size());
for (int i=0;i<result.size();i++) {
printf("%d\\n",result[i]);
}
}