백준 BOJ 15558번 : 점프 게임
문제 난이도 : Silver I
알고리즘 분류 : BFS
1초마다 1번부터 한 칸씩 없어지는 두 개의 다리가 있고, 각 다리의 값이 1이면 지나갈 수 있는 칸이라고 할 때, 1초마다 같은 다리에서 +1, -1 또는 다른 다리로 +M만큼 이동하는 선택지들을 통해 N보다 큰 거리를 이동할 수 있는지 구하는 문제이다.
매번 선택지가 3개라는 점에서 BFS를 생각할 수 있으나 조건문 설정이 나름 까다로워 보인다.
(x, y)를 x번 다리(x = 0 또는 1)의 y번째 칸(y = 1 ~ N)이라고 할 때 dis[x][y]를 최단 거리라고 두자.
뒤로 가는 경우 다리가 1초마다 한 칸씩 사라지기 때문에, dis[x][y] < y-2를 만족해야 뒤로 갈 수 있다. (0초일 때 1번 칸에 있을 수 있음을 생각하면 -1초일 때 2번 칸에서 뒤로 올 수 있다. 즉, 현재 시간과 현재 칸의 위치가 2보다 크게 차이나야 뒤로 한 칸 갈 수 있다.)
나머지 세팅은 기존의 BFS와 크게 다르지 않다.
참고로 다리의 번호를 0과 1로 두면 다른 다리로 이동할 때 !x와 같이 나타낼 수 있어서 편리하다.
#include <bits/stdc++.h>
#define int long long
using namespace std;
main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL), cout.tie(NULL);
int N, M; cin >> N >> M;
string str[2]; cin >> str[0] >> str[1];
str[0] = '0' + str[0];
str[1] = '0' + str[1];
vector<vector<int>> dis(2, vector<int>(N+1, -1));
dis[0][1] = 0;
queue<pair<int, int>> q;
q.push({0, 1});
while(!q.empty()) {
int x = q.front().first;
int y = q.front().second;
q.pop();
if(y + M > N) {
cout << 1 << "\n";
return 0;
}
if(str[x][y-1] == '1' && dis[x][y-1] == -1 && dis[x][y] < y-2) {
dis[x][y-1] = dis[x][y] + 1;
q.push({x, y-1});
}
if(str[x][y+1] == '1' && dis[x][y+1] == -1) {
dis[x][y+1] = dis[x][y] + 1;
q.push({x, y+1});
}
if(str[!x][y+M] == '1' && dis[!x][y+M] == -1) {
dis[!x][y+M] = dis[x][y] + 1;
q.push({!x, y+M});
}
}
cout << 0 << "\n";
}
백준 BOJ 14940번 : 쉬운 최단거리
문제 난이도 : Silver I
알고리즘 분류 : BFS
어떤 지점으로부터의 거리를 모든 좌표에 대해 구하는 문제이다.
이 때 이동은 가능하나 도달할 수 없는 지점은 -1을, 기존에 벽이었던 지점은 0으로 출력해야 한다.
위의 두 조건을 신경써주기만 하면 BFS로 간단하게 풀이할 수 있는 문제이다.
원래 문제에서는 도착 지점까지의 거리를 구하는 것인데, 역으로 생각해보면 출발 지점으로부터 모든 좌표의 거리를 구해주는 것과 동일하므로 그냥 BFS를 써주면 된다.
#include <bits/stdc++.h>
#define int long long
using namespace std;
main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL), cout.tie(NULL);
int N, M; cin >> N >> M;
vector<vector<int>> dis(N, vector<int>(M, -1));
queue<pair<int, int>> q;
vector<vector<int>> v(N, vector<int>(M));
for(int i=0; i<N; i++)
for(int j=0; j<M; j++) {
cin >> v[i][j];
if(v[i][j] == 2) {
dis[i][j] = 0;
q.push({i, j});
}
}
while(!q.empty()) {
int x = q.front().first;
int y = q.front().second;
q.pop();
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
for(int i=0; i<4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if(nx < 0 || ny < 0 || nx >= N || ny >= M) continue;
if(v[nx][ny] == 0 || dis[nx][ny] != -1) continue;
dis[nx][ny] = dis[x][y] + 1;
q.push({nx, ny});
}
}
for(int i=0; i<N; i++) {
for(int j=0; j<M; j++) {
if(v[i][j] != 0 && dis[i][j] == -1) cout << -1 << " ";
else if(v[i][j] == 0) cout << 0 << " ";
else cout << dis[i][j] << " ";
}
cout << "\n";
}
}
백준 BOJ 14218번 : 그래프 탐색 2
문제 난이도 : Silver I
알고리즘 분류 : 그래프 탐색
초기 그래프에서 간선을 하나씩 추가해나갈 때마다, 1번 노드에서부터 각 노드까지의 거리를 구하는 문제이다.
처음에는 문제를 보고 일반 그래프 탐색으로는 시간 초과에 걸리지 않을까 싶었는데, 문제 난이도가 Silver I에 배정된 것을 보고 충분히 시간 안에 가능하겠다는 판단이 들어 BFS로 풀이하였다.
매 간선을 추가할 때마다 BFS를 새로 실행해주어도 시간 초과에 걸리지 않는다.
#include <bits/stdc++.h>
#define int long long
using namespace std;
main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL), cout.tie(NULL);
int N, M; cin >> N >> M;
vector<vector<int>> adj;
adj.resize(N+1);
while(M--) {
int a, b; cin >> a >> b;
adj[a].push_back(b);
adj[b].push_back(a);
}
int K; cin >> K;
while(K--) {
int a, b; cin >> a >> b;
adj[a].push_back(b);
adj[b].push_back(a);
vector<int> dis(N+1, -1);
dis[1] = 0;
queue<int> q;
q.push(1);
while(!q.empty()) {
int x = q.front();
q.pop();
for(int i=0; i<adj[x].size(); i++) {
int y = adj[x][i];
if(dis[y] != -1) continue;
dis[y] = dis[x] + 1;
q.push(y);
}
}
for(int i=1; i<=N; i++) cout << dis[i] << " ";
cout << "\n";
}
}
백준 BOJ 14217번 : 그래프 탐색
문제 난이도 : Gold V
알고리즘 분류 : 그래프 탐색
위의 백준 BOJ 14218번 : '그래프 탐색 2' 문제에서 두 도시 사이의 도로를 없애는 쿼리가 추가된 문제이다.
N이 작지 않았다면 메모리나 시간 등의 문제로 해결이 쉽지 않았을 것인데, 이 문제에서는 N이 500 이하이므로 500 x 500 adj 배열을 만들어 사용할 수 있다.
따라서 push_back과 같이 연결 도시들을 추가해주지 말고, 2차원 배열로 바로 adj 여부에 접근할 수 있도록 해주자.
이렇게 할 경우 도시 a와 도시 b 사이의 도로를 제거하는 경우에도 adj[a][b] = adj[b][a] = 0으로 간단하게 처리해줄 수 있다.
#include <bits/stdc++.h>
#define int long long
using namespace std;
main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL), cout.tie(NULL);
int N, M; cin >> N >> M;
int adj[501][501] = {};
while(M--) {
int a, b; cin >> a >> b;
adj[a][b] = adj[b][a] = 1;
}
int K; cin >> K;
while(K--) {
int Q, a, b; cin >> Q >> a >> b;
if(Q == 1) adj[a][b] = adj[b][a] = 1;
else if(Q == 2) adj[a][b] = adj[b][a] = 0;
vector<int> dis(N+1, -1);
dis[1] = 0;
queue<int> q;
q.push(1);
while(!q.empty()) {
int x = q.front();
q.pop();
for(int i=1; i<=N; i++) {
if(adj[x][i] == 0) continue;
if(dis[i] != -1) continue;
dis[i] = dis[x] + 1;
q.push(i);
}
}
for(int i=1; i<=N; i++) cout << dis[i] << " ";
cout << "\n";
}
}
백준 BOJ 13903번 : 출근
문제 난이도 : Silver I
알고리즘 분류 : BFS
0과 1로 이루어져있는 배열에서 1로만 이동할 수 있고, 이동할 수 있는 방식(칸의 변위)이 K가지가 주어질 때, 맨 윗줄에서 맨 아랫줄로 가는 최소 이동 수를 구하는 문제이다.
BFS에서 이동 방법을 dx 배열과 dy 배열로 놓고 푸는 방법이 익숙하다면 어렵지 않게 해결할 수 있는 문제이다.
dx, dy 배열에 K가지의 이동 방식을 넣고 BFS를 돌려주기만 하면 된다.
맨 윗줄의 1인 칸의 dist 값을 모두 0으로 초기화 해주고 queue에 넣어주면 된다.
나의 경우 처음에 맨 윗줄의 "1인 칸"이라는 조건을 빠뜨리는 실수를 했는데 주의하자.
#include <bits/stdc++.h>
#define int long long
using namespace std;
main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL), cout.tie(NULL);
int N, M; cin >> N >> M;
vector<vector<int>> v(N, vector<int>(M));
for(int i=0; i<N; i++)
for(int j=0; j<M; j++) cin >> v[i][j];
int K; cin >> K;
vector<int> dx(K), dy(K);
for(int i=0; i<K; i++) cin >> dx[i] >> dy[i];
vector<vector<int>> dis(N, vector<int>(M, -1));
for(int i=0; i<M; i++)
if(v[0][i] == 1) dis[0][i] = 0;
queue<pair<int, int>> q;
for(int i=0; i<M; i++)
if(v[0][i] == 1) q.push({0, i});
int ans = INT_MAX;
while(!q.empty()) {
int x = q.front().first;
int y = q.front().second;
q.pop();
if(x == N-1) {
ans = min(ans, dis[x][y]);
continue;
}
for(int i=0; i<K; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if(nx < 0 || ny < 0 || nx >= N || ny >= M) continue;
if(v[nx][ny] != 1 || dis[nx][ny] != -1) continue;
dis[nx][ny] = dis[x][y] + 1;
q.push({nx, ny});
}
}
if(ans != INT_MAX) cout << ans << "\n";
else cout << -1 << "\n";
}
백준 BOJ 13700번 : 완전 범죄
문제 난이도 : Silver I
알고리즘 분류 : BFS
출발점에서 도착점으로 +F, -B로 이동하면서, 경찰서는 방문하지 않고 도달할 수 있는 최소 이동 수를 구하는 문제이다.
BFS 코드에서 조건식만 조금 수정해주면 풀이할 수 있다.
먼저 경찰서의 좌표를 저장하고, BFS를 돌릴 때 좌표가 범위 안에 있으면서 방문하지 않은 노드이고 경찰서의 좌표가 아니라면 queue에 넣어서 탐색해주면 된다.
#include <bits/stdc++.h>
#define int long long
using namespace std;
main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL), cout.tie(NULL);
int N, S, D, F, B, K; cin >> N >> S >> D >> F >> B >> K;
vector<int> v(N+1);
while(K--) {
int x; cin >> x;
v[x] = 1;
}
vector<int> dis(N+1, -1);
dis[S] = 0;
queue<int> q;
q.push(S);
while(!q.empty()) {
int x = q.front();
q.pop();
if(x == D) {
cout << dis[D] << "\n";
return 0;
}
if(x+F <= N && v[x+F] != 1 && dis[x+F] == -1) {
dis[x+F] = dis[x] + 1;
q.push(x+F);
}
if(x-B >= 1 && v[x-B] != 1 && dis[x-B] == -1) {
dis[x-B] = dis[x] + 1;
q.push(x-B);
}
}
cout << "BUG FOUND\n";
}
백준 BOJ 10917번 : Your life
문제 난이도 : Silver I
알고리즘 분류 : BFS
M개의 순서쌍 (x, y)에 대해 x에서 y로 이동이 가능할 때, 1에서 N으로 이동하는 최소 횟수를 구하는 문제이다.
이 역시 BFS 문제로, M개의 쌍을 모두 간선으로 이어준 후 1번 노드에서 BFS를 수행하여 N번 노드까지의 거리를 구해주면 된다.
이 문제에서 주어지는 (x, y)는 y에서 x로 이동할 수 있다는 뜻은 아니므로 단방향 간선으로 연결해주어야 한다.
#include <bits/stdc++.h>
#define int long long
using namespace std;
main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL), cout.tie(NULL);
int N, M; cin >> N >> M;
vector<vector<int>> adj(N+1);
while(M--) {
int a, b; cin >> a >> b;
adj[a].push_back(b);
}
vector<int> dis(N+1, -1);
dis[1] = 0;
queue<int> q;
q.push(1);
while(!q.empty()) {
int x = q.front();
q.pop();
if(x == N) {
cout << dis[N] << "\n";
return 0;
}
for(int i=0; i<adj[x].size(); i++) {
int y = adj[x][i];
if(dis[y] != -1) continue;
dis[y] = dis[x] + 1;
q.push(y);
}
}
cout << -1 << "\n";
}
백준 BOJ 6601번 : Knight Moves
문제 난이도 : Silver I
알고리즘 분류 : BFS
체스판 위의 좌표가 주어질 때 knight의 이동으로 도달할 수 있는 최소 이동 수를 구하는 문제이다.
기존의 BFS를 이용한 knight's tour 문제에 반복문만 적용시켜주면 해결되는 문제이다.
참고로 이 문제 내에서 knight가 몇 번의 이동을 통해 서로 도달할 수 없는 칸은 없으므로 예외 처리를 해줄 필요는 없다.
#include <bits/stdc++.h>
#define int long long
using namespace std;
main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL), cout.tie(NULL);
string a, b;
while(cin >> a >> b) {
int bx = a[0] - 'a' + 1, by = a[1] - '0';
int ex = b[0] - 'a' + 1, ey = b[1] - '0';
vector<vector<int>> dis(9, vector<int>(9, -1));
dis[bx][by] = 0;
queue<pair<int, int>> q;
q.push({bx, by});
while(!q.empty()) {
int x = q.front().first;
int y = q.front().second;
q.pop();
if(x == ex && y == ey) {
cout << "To get from " << a << " to " << b << " takes "
<< dis[ex][ey] << " knight moves.\n";
break;
}
int dx[8] = {-2, -1, 1, 2, 2, 1, -1, -2};
int dy[8] = {1, 2, 2, 1, -1, -2, -2, -1};
for(int i=0; i<8; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if(nx <= 0 || ny <= 0 || nx > 8 || ny > 8) continue;
if(dis[nx][ny] != -1) continue;
dis[nx][ny] = dis[x][y] + 1;
q.push({nx, ny});
}
}
}
}
백준 BOJ 21938번 : 영상처리
문제 난이도 : Silver II
알고리즘 분류 : DFS, BFS
N x M 크기의 픽셀의 RGB 값이 주어질 때, RGB 값의 평균이 특정 값 이상인 경우 1으로 표기한 후 상하좌우로 연결된 1 덩어리가 몇 개인지 구하는 문제이다.
앞 부분은 간단한 구현으로 구할 수 있고, 1과 0으로 이루어진 배열이 완성되었으면 이제 DFS와 같은 그래프 탐색으로 덩어리가 몇 개인지 세어주면 된다.
임계값 T가 RGB 입력 이후에 주어져서 배열을 2개 선언해야 비교적 간단하게 풀리는 귀찮은 문제이다.
#include <bits/stdc++.h>
#define int long long
using namespace std;
int N, M;
vector<vector<int>> u;
vector<vector<bool>> vis;
void f(int x, int y) {
vis[x][y] = true;
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
for(int i=0; i<4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if(nx < 0 || ny < 0 || nx >= N || ny >= M) continue;
if(u[nx][ny] != 1 || vis[nx][ny]) continue;
f(nx, ny);
}
}
main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL), cout.tie(NULL);
cin >> N >> M;
vector<vector<vector<int>>> v(N, vector<vector<int>>(M, vector<int>(3)));
for(int i=0; i<N; i++)
for(int j=0; j<M; j++)
cin >> v[i][j][0] >> v[i][j][1] >> v[i][j][2];
int x; cin >> x;
u.resize(N, vector<int>(M));
for(int i=0; i<N; i++)
for(int j=0; j<M; j++) {
if(v[i][j][0] + v[i][j][1] + v[i][j][2] >= x*3) u[i][j] = 1;
else u[i][j] = 0;
}
vis.resize(N, vector<bool>(M));
int ans = 0;
for(int i=0; i<N; i++)
for(int j=0; j<M; j++)
if(u[i][j] == 1 && !vis[i][j]) {
f(i, j);
ans++;
}
cout << ans << "\n";
}
백준 BOJ 8061번 : Bitmap
문제 난이도 : Silver II
알고리즘 분류 : BFS
0과 1로 이루어진 배열이 있을 때, 각 칸이 1로부터 맨해튼 거리로 얼마나 떨어져 있는지를 구하는 문제이다.
모든 칸에 대해 BFS를 하면 시간 초과가 발생하므로, 큐에 1에 해당하는 칸을 모두 넣고, 그 거리를 0으로 설정해준 뒤 BFS를 하면 BFS를 한 번만 수행하고도 모든 거리를 구할 수 있다.
#include <bits/stdc++.h>
#define int long long
using namespace std;
main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL), cout.tie(NULL);
int N, M; cin >> N >> M;
vector<vector<int>> dis(N, vector<int>(M, -1));
queue<pair<int, int>> q;
vector<vector<char>> v(N, vector<char>(M));
for(int i=0; i<N; i++)
for(int j=0; j<M; j++) {
cin >> v[i][j];
if(v[i][j] == '1') {
dis[i][j] = 0;
q.push({i, j});
}
}
while(!q.empty()) {
int x = q.front().first;
int y = q.front().second;
q.pop();
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
for(int k=0; k<4; k++) {
int nx = x + dx[k];
int ny = y + dy[k];
if(nx < 0 || ny < 0 || nx >= N || ny >= M) continue;
if(dis[nx][ny] != -1) continue;
dis[nx][ny] = dis[x][y] + 1;
q.push({nx, ny});
}
}
for(int i=0; i<N; i++) {
for(int j=0; j<M; j++) cout << dis[i][j] << " ";
cout << "\n";
}
}
백준 BOJ 11190번 : Pub-lic Good
문제 난이도 : Silver I
알고리즘 분류 : BFS
그래프가 주어질 때 모든 술집에 인접하는 집이 최소 하나 있고, 모든 집에 인접하는 술집이 하나 있도록 하는 예시를 구하는 문제이다.
어떤 점에서부터 거리가 홀수인 지점은 pub, 짝수면 house 이런 식으로 배치하면 하나의 답이 될 수 있다.
문제는 그래프가 여러 개로 끊어져 있는 경우가 있고 또한 인접 노드가 0인 노드가 있으면 반드시 impossible이 되므로 경우를 잘 나누어 보아야 한다.
일반 BFS 문제보다 약간 응용이 필요하다고 생각해서 Silver I에 투표하였는데 다른 풀이 길이를 보면 아주 짧은 것으로 보아 더 쉬운 다른 풀이가 있는 것 같기도 하다.
#include <bits/stdc++.h>
#define int long long
using namespace std;
main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL), cout.tie(NULL);
int N, M; cin >> N >> M;
vector<vector<int>> adj(N+1);
while(M--) {
int a, b; cin >> a >> b;
adj[a].push_back(b);
adj[b].push_back(a);
}
vector<int> dis(N+1, -1);
for(int i=1; i<=N; i++) {
if(dis[i] != -1) continue;
dis[i] = 0;
queue<int> q;
q.push(i);
while(!q.empty()) {
int x = q.front();
q.pop();
for(int i=0; i<adj[x].size(); i++) {
int y = adj[x][i];
if(dis[y] != -1) continue;
dis[y] = dis[x] + 1;
q.push(y);
}
}
}
bool check = true;
for(int i=1; i<=N; i++) {
if(adj[i].size() == 0 || dis[i] == -1) check = false;
}
if(!check) {
cout << "Impossible\n";
return 0;
}
for(int i=1; i<=N; i++) {
if(dis[i] % 2 == 0) cout << "pub ";
else cout << "house ";
}
cout << "\n";
}
백준 BOJ 15886번 : 내 선물을 받아줘 2
문제 난이도 : Silver II
알고리즘 분류 : 문자열
문자열에서 E를 만나면 한 칸 오른쪽으로, W를 만나면 한 칸 왼쪽으로 이동할 때 어떤 위치를 시작점으로 잡아도 선물이 있는 좌표로 가려면 선물을 최소 몇 개 배치해야 하는지 구하는 문제이다.
EEE..EEWWW..WW의 형태가 있으면 무조건 가운데로 수렴한다.
따라서 EW의 개수를 세어주면 된다.
그리고 W가 맨 앞에 있는 경우와 E가 맨 뒤에 있는 경우 각각 맨 앞과 맨 뒤로 가게 된다.
따라서 이 두 가지만 추가로 체크해주면 된다.
#include <bits/stdc++.h>
#define int long long
using namespace std;
main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL), cout.tie(NULL);
int N; cin >> N;
string str; cin >> str;
int ans = 0;
if(str[0] == 'W') ans++;
if(str[N-1] == 'E') ans++;
for(int i=1; i<N; i++)
if(str[i-1] == 'E' && str[i] == 'W') ans++;
cout << ans << "\n";
}
백준 BOJ 17024번 : Grass Planting
문제 난이도 : Silver II
알고리즘 분류 : 트리
N개의 정점과 N-1개의 간선이 있으며 모든 노드 사이는 간선을 통해 도달이 가능하다고 할 때, 두 노드가 하나의 간선으로 연결되어 있거나 한 노드에서 다른 한 노드를 거쳐 도달할 수 있는 노드들은 모두 다른 색으로 칠한다고 할 때 색이 최소 몇 가지 필요한지를 구하는 문제이다.
우선 N개의 정점을 N-1개의 간선으로 모두 연결하려면 그 그래프는 반드시 트리가 된다.
이제 노드 중 가장 차수가 높은 것을 찾아 그 차수 + 1을 해주면 된다. (그 중심 노드도 다른 색으로 칠해야 하므로)
#include <bits/stdc++.h>
#define int long long
using namespace std;
main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL), cout.tie(NULL);
int N; cin >> N;
vector<vector<int>> adj(N+1);
for(int i=0; i<N-1; i++) {
int a, b; cin >> a >> b;
adj[a].push_back(b);
adj[b].push_back(a);
}
int ans = 0;
for(int i=1; i<=N; i++) ans = max(ans, (int)adj[i].size() + 1);
cout << ans << "\n";
}
백준 BOJ 18173번 : Bob in Wonderland
문제 난이도 : Silver II
알고리즘 분류 : 트리
N개의 노드와 N-1개의 간선으로 연결된 체인에서, 체인 몇 개를 끊고 다시 연결하여 일렬로 만든다고 할 때 최소 끊는 횟수를 구하는 문제이다.
먼저 체인을 끊을 필요가 있으려면 한 노드에 3개 이상의 노드가 있어야 한다.
그러면 2개의 노드를 제외하고 나머지들을 끊어서 한 쪽 끝에 연결해야 한다.
따라서 모든 노드의 차수를 검사하여 2보다 큰 값들에 대해 2를 뺀 값을 답에 더해줘서 합쳐서 구해주면 된다.
#include <bits/stdc++.h>
#define int long long
using namespace std;
main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL), cout.tie(NULL);
int N; cin >> N;
vector<vector<int>> adj(N+1);
for(int i=0; i<N-1; i++) {
int a, b; cin >> a >> b;
adj[a].push_back(b);
adj[b].push_back(a);
}
int ans = 0;
for(int i=1; i<=N; i++)
if(adj[i].size() > 2) ans += adj[i].size() - 2;
cout << ans << "\n";
}
'알고리즘 > 알고리즘 공부 내용 정리' 카테고리의 다른 글
백준 BOJ 풀이 220728 (0) | 2022.07.28 |
---|---|
백준 BOJ 풀이 : 각종 Silver 난이도 그래프 문제들 220727 (0) | 2022.07.27 |
백준 BOJ 풀이 : BFS 문제들 위주 풀이 (그래프 탐색) 220725 (0) | 2022.07.25 |
백준 BOJ 풀이 : 데이크스트라, 이분 탐색, 그래프 등 220724 (0) | 2022.07.24 |
백준 BOJ 풀이 : 이분 탐색 문제들 마저 해치우기 (220723) (0) | 2022.07.23 |