반응형
https://www.acmicpc.net/problem/21736
21736번: 헌내기는 친구가 필요해
2020년에 입학한 헌내기 도연이가 있다. 도연이는 비대면 수업 때문에 학교에 가지 못해 학교에 아는 친구가 없었다. 드디어 대면 수업을 하게 된 도연이는 어서 캠퍼스 내의 사람들과 친해지고
www.acmicpc.net
알고리즘 분류
그래프 탐색(BFS, DFS)
해설
#include <iostream>
#include <queue>
using namespace std;
int main() {
int N, M, ix, iy;
cin >> N >> M;
char** campus = new char* [N];
bool** visit = new bool* [N];
for (int i = 0; i < N; i++) {
campus[i] = new char[M];
visit[i] = new bool[M];
for (int j = 0; j < M; j++) {
cin >> campus[i][j];
visit[i][j] = 0;
if (campus[i][j] == 'I') {
ix = i; iy = j; // I의 좌표 저장
}
}
}
int people = 0; // 만난 사람의 수
int dx[4] = { 1,-1,0,0 };
int dy[4] = { 0,0,1,-1 };
queue<pair<int, int>> q;
q.push(make_pair(ix, iy));
while (!q.empty()) { // BFS 알고리즘
int x = q.front().first;
int y = q.front().second;
q.pop();
for (int i = 0; i < 4; i++) {
int nx = dx[i] + x;
int ny = dy[i] + y;
if (nx >= 0 && nx < N && ny >= 0 && ny < M) {
if (visit[nx][ny] == 0) {
if (campus[nx][ny] != 'X') {
q.push(make_pair(nx, ny));
if (campus[nx][ny] == 'P')
people++;
}
visit[nx][ny] = 1;
}
}
}
}
if (people == 0) cout << "TT";
else cout << people;
}
전형적인 BFS 알고리즘 문제입니다
실버2라는 난이도로 그래프 이론 문제 중 낮은 편으로
BFS 알고리즘 입문자들이 공부하기 좋은 문제
visit 배열과 campus 배열(그래프)을 동적할당 하고
방문하지 않은 곳들을 상하좌우로 방문하며
P를 찾아내는 방식입니다.
아래는 유사한 방식의 BFS 알고리즘을 활용한 문제들입니다
반응형
'코딩테스트 > 백준(BOJ)' 카테고리의 다른 글
[백준] 30024번 옥수수밭 C++ (0) | 2023.09.29 |
---|---|
[백준] 11403번 경로 찾기 C++ (0) | 2023.07.05 |
[백준] 1932번 정수 삼각형 C++ (0) | 2023.06.29 |
[백준] 14940번 쉬운 최단거리 C++ (0) | 2023.06.27 |
[백준] 1946번 신입 사원 : 파이썬(python) 설명 (1) | 2023.03.27 |