πŸ“š μŠ€νƒ

λ¨Όμ € λ“€μ–΄ 온 데이터가 λ‚˜μ€‘μ— λ‚˜κ°€λŠ” ν˜•μ‹(μ„ μž…ν›„μΆœ FILO)의 자료ꡬ쑰
μž…κ΅¬μ™€ μΆœκ΅¬κ°€ λ™μΈν•œ ν˜•νƒœλ‘œ μŠ€νƒμ„ μ‹œκ°ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

stl stack 이용

  • push(element) : top에 μ›μ†Œλ₯Ό μΆ”κ°€
  • pop() : top에 μžˆλŠ” μ›μ†Œλ₯Ό μ‚­μ œ
  • top() : top에 μžˆλŠ” μ›μ†Œλ₯Ό λ°˜ν™˜(끝)
  • empty() : μŠ€νƒμ΄ λΉ„μ–΄μžˆμœΌλ©΄ true μ•„λ‹ˆλ©΄ false
  • size() : μŠ€νƒ μ‚¬μ΄μ¦ˆλ₯Ό λ°˜ν™˜
#include <stack>
#include <iostream>

using namespace std;

stack<int> s;

int main()
{
	s.push(5);
    s.push(2);
    s.push(3);
    s.push(7);
    s.pop();
    s.push(1);
    s.push(4);
    s.pop();

    while (!s.empty()){
        cout << s.top() << ' ';
        s.pop();
    }
}

πŸ“š 큐

λ¨Όμ € λ“€μ–΄ 온 데이터가 λ¨Όμ € λ‚˜κ°€λŠ” ν˜•μ‹(μ„ μž…μ„ μΆœ FIFO)의 자료ꡬ쑰
νλŠ” μž…κ΅¬μ™€ μΆœκ΅¬κ°€ λͺ¨λ‘ 뚫렀 μžˆλŠ” 터널과 같은 ν˜•νƒœ

stl queue 이용

  • push(element) : 큐에 μ›μ†Œλ₯Ό μΆ”κ°€(λ’€)
  • pop() : 큐에 μžˆλŠ” μ›μ†Œλ₯Ό μ‚­(μ•ž)
  • front() : 큐 제일 μ•žμ— μžˆλŠ” μ›μ†Œλ₯Ό λ°˜ν™˜
  • back() : 큐 제일 뒀에 μžˆλŠ” μ›μ†Œλ₯Ό λ°˜ν™˜
  • empty() : 큐가 λΉ„μ–΄μžˆμœΌλ©΄ true μ•„λ‹ˆλ©΄ false
  • size() : 큐 μ‚¬μ΄μ¦ˆλ₯Ό λ°˜ν™˜
#include <iostream>
#include <queue>

using namespace std;

queue<int> q;

int main(){
    q.push(5);
    q.push(2);
    q.push(3);
    q.push(7);
    q.pop();
    q.push(1);
    q.push(4);
    q.pop();

    while (!q.empty())
    {
        cout << q.front() << ' ';
        q.pop();
    }
}

πŸ“š μž¬κ·€ ν•¨μˆ˜

μž¬κ·€ ν•¨μˆ˜λž€ 자기 μžμ‹ μ„ λ‹€μ‹œ ν˜ΈμΆœν•˜λŠ” ν•¨μˆ˜λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
λ°˜λ“œμ‹œ μ’…λ£Œ 쑰건을 λͺ…μ‹œν•΄μ•Όν•œλ‹€
컴퓨터가 ν•¨μˆ˜λ₯Ό μ—°μ†μ μœΌλ‘œ ν˜ΈμΆœν•˜λ©΄ 컴퓨터 λ©”λͺ¨λ¦¬ λ‚΄λΆ€μ˜ μŠ€νƒ ν”„λ ˆμž„μ— μŒ“μΈλ‹€


πŸ“š DFS

깊이 μš°μ„  탑색이라고도 λΆ€λ₯΄λ©° κ·Έλž˜ν”„μ—μ„œ κΉŠμ€ 뢀뢄을 μš°μ„ μ μœΌλ‘œ νƒμƒ‰ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜
μŠ€νƒ 자료ꡬ쑰(ν˜Ήμ€ μž¬κ·€ ν•¨μˆ˜)λ₯Ό μ΄μš©ν•œλ‹€

  • 탐색 μ‹œμž‘ λ…Έλ“œλ₯Ό μŠ€νƒμ— μ‚½μž…ν•˜κ³  λ°©λ¬Έ 처리λ₯Ό ν•©λ‹ˆλ‹€.
  • μŠ€νƒμ˜ μ΅œμƒλ‹¨ λ…Έλ“œμ— λ°©λ¬Έν•˜μ§€ μ•Šμ€ μΈμ ‘ν•œ λ…Έλ“œκ°€ ν•˜λ‚˜λΌλ„ 있으면 κ·Έ λ…Έλ“œλ₯Ό μŠ€νƒμ— λ„£κ³  λ°©λ¬Έμ²˜λ¦¬ν•©λ‹ˆλ‹€. λ°©λ¬Έν•˜μ§€ μ•Šμ€ 인접 λ…Έλ“œκ°€ μ—†μœΌλ©΄ μŠ€νƒμ—μ„œ μ΅œμƒλ‹¨ λ…Έλ“œλ₯Ό κΊΌλƒ…λ‹ˆλ‹€.
  • 더 이상 2번의 과정을 μˆ˜ν–‰ν•  수 없을 λ•ŒκΉŒμ§€ λ°˜λ³΅ν•©λ‹ˆλ‹€


DFS 방식은 μΈμ ‘ν•œ λ…Έλ“œμ˜ μžμ‹μ„ 타고 λκΉŒμ§€ μˆœνšŒν•œ ν›„, λ‹€μ‹œ λŒμ•„μ™€μ„œ λ‹€λ₯Έ ν˜•μ œλ“€μ˜ μžμ‹μ„ 타고 λ‚΄λ €κ°€λ©° μˆœνšŒν•œλ‹€
μ‹€μ œ 탐색 μˆœμ„œλŠ”
A - B - D - E - F - C - G - H - I - J

예제

#include<iostream>
#include<vector>

using namespace std;

bool visited[9];
vector<int> graph[9];

void dfs(int x)
{
	visited[x] = true;
	cout << x << " ";
	for (int i = 0; i < graph[x].size(); i++)
    {
		int y = graph[x][i];
		if (!visited[y])
        	dfs(y);
	}
}

λ°©λ¬Έν•œ λ…Έλ“œλŠ” true둜 ν‘œμ‹œν•˜κ³  κ·Έλž˜ν”„λ₯Ό νƒμƒ‰ν•œλ‹€


πŸ“š BFS

λ„ˆλΉ„ μš°μ„  탐색이라고도 λΆ€λŸ¬λ©°, κ·Έλž˜ν”„μ—μ„œ κ°€κΉŒμš΄ λ…Έλ“œλΆ€ν„° μš°μ„ μ μœΌλ‘œ νƒμƒ‰ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μž…λ‹ˆλ‹€.
BFSλŠ” 큐 자료ꡬ쑰λ₯Ό μ΄μš©ν•œλ‹€.

  • 탐색 μ‹œμž‘ λ…Έλ“œλ₯Ό 큐에 μ‚½μž…ν•˜κ³  λ°©λ¬Έ 처리λ₯Ό ν•©λ‹ˆλ‹€.
  • νμ—μ„œ λ…Έλ“œλ₯Ό κΊΌλ‚Έ 뒀에 ν•΄λ‹Ή λ…Έλ“œμ˜ 인접 λ…Έλ“œ μ€‘μ—μ„œ λ°©λ¬Έν•˜μ§€ μ•Šμ€ λ…Έλ“œλ₯Ό λͺ¨λ‘ 큐에 μ‚½μž…ν•˜κ³  λ°©λ¬Έμ²˜λ¦¬ν•©λ‹ˆλ‹€.
  • 더 이상 2번의 과정을 μˆ˜ν–‰ν•  수 없을 λ•ŒκΉŒμ§€ λ°˜λ³΅ν•©λ‹ˆλ‹€.

BFS 방식은 ν•œ 단계식 λ‚΄λ €κ°€λ©΄μ„œ, ν•΄λ‹Ή λ…Έλ“œμ™€ 같은 λ ˆλ²¨μ— μžˆλŠ” λ…Έλ“œλ“€μ„ λ¨Όμ € μˆœν™˜ν•œλ‹€.
μ‹€μ œ 탐색 μˆœμ„œλŠ”
A - B - C - D - G - H - I - E - F - J

예제

#include<iostream>
#include<vector>
#include <queue>

using namespace std;

bool visited[9];
vector<int> graph[9];

void bfs(int start)
{
	queue<int> q;
	q.push(start);
	visited[start] = true;
	while (!q.empty())
    {
		int x = q.front();
		q.pop();
		cout << x << " ";
		for (int i = 0; i < graph[x].size(); i++)
        {
			int y = graph[x][i];
			if (!visited[y])
            {
				q.push(y);
				visited[y] = true;
			}
		}
	}
}

πŸ“š 예제

πŸ“• 음료수 μ–Όλ € λ¨ΉκΈ°

N X N 크기의 μ–ΌμŒ 틀이 μžˆλ‹€. ꡬ멍이 뚫렀 μžˆλŠ” 뢀뢄은 0, 칸막이가 μ‘΄μž¬ν•˜λŠ” 뢀뢄은 1둜 ν‘œμ‹œλœλ‹€. ꡬ멍이 뚫렀 μžˆλŠ” 뢀뢄끼리 상, ν•˜, 쒌, 우둜 λΆ™μ–΄ μžˆλŠ” 경우 μ„œλ‘œ μ—°κ²°λ˜μ–΄ μžˆλŠ” κ²ƒμœΌλ‘œ κ°„μ£Όν•œλ‹€. μ΄λ•Œ μ–ΌμŒ ν‹€μ˜ λͺ¨μ–‘이 μ£Όμ–΄μ‘Œμ„ λ•Œ μƒμ„±λ˜λŠ” 총 μ•„μ΄μŠ€ν¬λ¦Όμ˜ 개수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. λ‹€μŒμ˜ 4 X 5 μ–ΌμŒ ν‹€ μ˜ˆμ‹œμ—μ„œλŠ” μ•„μ΄μŠ€ν¬λ¦Όμ΄ 총 3개 μƒμ„±λœλ‹€.

μ†”μ§νžˆ 감도 λͺ»μž‘μ•˜λ‹€ λͺ‡μ‹­λΆ„κ°„μ˜ 고민끝에 κ·Έλƒ₯ 클둠코딩을 ν•˜μ˜€λ‹€
정말 κΈ°λ°œν•œκ±° κ°™λ‹€ μš”μ μ€

  • 이동가λŠ₯ν•œ λ…Έλ“œ μƒν•˜μ’Œμš°μ— 0값이 μžˆλ‹€λ©΄ λ°©λ¬Έν•œλ‹€
  • λ°©λ¬Έν•œ μ§€μ μ—μ„œ λ‹€μ‹œ μƒν•˜μ’Œμš°λ₯Ό μ²΄ν¬ν•œλ‹€

    μ΄λŸ°μ‹μœΌλ‘œ μΈμ ‘ν•œ λ…Έλ“œμ€‘ 0이 μžˆλŠ”κ³³μœΌλ‘œ λ°©λ¬Έν•œλ’€ 카운트λ₯Ό ν•΄μ€€λ‹€
#include <iostream>

using namespace std;

int check[1001][1001];
int n, m;

bool dfs(int x, int y)
{
    if (x <= -1 || x >= n || y <= -1 || y >= m)
        return false; 
    if (check[x][y] == 0)
    {
        check[x][y] = 1;
        dfs(x - 1, y);
        dfs(x, y - 1);
        dfs(x + 1, y);
        dfs(x, y + 1);
        return true;
    }
    return false;
}

int main()
{
    cin >> n >> m;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
            cin >> check[i][j];
    }
    int res = 0;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            if (dfs(i, j))
                res += 1;
        }
    }
    cout << res << endl;
}

이거 보자말자 μ•„μΌλžœλ“œ λ¬Έμ œκ°€ 생각이 났닀


πŸ“˜ λ―Έλ‘œνƒˆμΆœ

λ™λΉˆμ΄λŠ” N X M 크기의 μ§μ‚¬κ°ν˜• ν˜•νƒœμ˜ λ―Έλ‘œμ— κ°‡ν˜€ μžˆλ‹€. λ―Έλ‘œμ—λŠ” μ—¬λŸ¬ 마리의 괴물이 μžˆμ–΄ 이λ₯Ό ν”Όν•΄ νƒˆμΆœν•΄μ•Ό ν•œλ‹€. λ™λΉˆμ΄μ˜ μœ„μΉ˜λŠ” (1, 1)이고 미둜의 μΆœκ΅¬λŠ” (N, M)의 μœ„μΉ˜μ— μ‘΄μž¬ν•˜λ©° ν•œλ²ˆμ— ν•œ μΉΈμ”© 이동할 수 μžˆλ‹€. μ΄λ•Œ 괴물이 μžˆλŠ” 뢀뢄은 0으둜, 괴물이 μ—†λŠ” 뢀뢄은 1둜 ν‘œμ‹œλ˜μ–΄ 이ㅏㅆ닀. λ―Έλ‘œλŠ” λ°˜λ“œμ‹œ νƒˆμΆœν•  수 μžˆλŠ” ν˜•νƒœλ‘œ μ œμ‹œλœλ‹€. μ΄λ•Œ λ™λΉˆμ΄κ°€ νƒˆμΆœν•˜κΈ° μœ„ν•΄ 움직여야 ν•˜λŠ” μ΅œμ†Œ 칸의 개수λ₯Ό κ΅¬ν•˜μ‹œμ˜€. 칸을 μ…€ λ•ŒλŠ” μ‹œμž‘ μΉΈκ³Ό λ§ˆμ§€λ§‰ 칸을 λͺ¨λ‘ ν¬ν•¨ν•΄μ„œ κ³„μ‚°ν•œλ‹€.

문제λ₯Ό 보자말자 μ €λ²ˆμ— κ³΅λΆ€ν–ˆλ˜ κ²Œμž„κ°œλ°œλ¬Έμ œκ°€ 생각났닀 κ·Έλž˜μ„œ μ²˜μŒμ— μƒκ°ν•œ μ•„μ΄λ””μ–΄λŠ” λ™λΉˆμ΄κ°€ 움직일 수 μžˆλŠ” λ°©ν–₯μ •μ˜λ₯Ό ν•˜κ³  λ§Œμ•½ κ·Έ λ°©ν–₯으둜 μ›€μ§μ˜€μ„λ•Œ 갈 수 μžˆλŠ”κ³³μ΄λΌλ©΄ 카운트λ₯Ό μ¦κ°€μ‹œμΌœμ£Όκ³  μ•„λ‹ˆλΌλ©΄ κ·Έ λ…Έλ“œλ₯Ό μ£½μ—¬λ²„λ¦¬λŠ” μ‹μœΌλ‘œ dfsλ₯Ό 생각을 ν–ˆλ‹€

예λ₯Ό λ“€μ–΄ μ΄λŸ¬ν•œ κ·Έλž˜ν”„κ°€ μžˆλ‹€λ©΄ 첫 μ‹œμž‘μ§€μ μ—μ„œ 움직일 수 μžˆλŠ” 곳은 였λ₯Έμͺ½κ³Ό μ•„λž˜ 밖에 μ—†λ‹€ 근데 μ•„λž˜λŠ” 0이기 λ•Œλ¬Έμ— 였λ₯Έμͺ½μœΌλ‘œ 움직이고 카운트λ₯Ό μ˜¬λ €μ£Όλ©΄μ„œ μž¬κ·€λ₯Ό λŒλ¦¬λŠ” ν˜•μ‹μ΄λ‹€
κ·Έ λ‹€μŒ μ΅œλ‹¨κ±°λ¦¬λ₯Ό ꡬ해야 ν•˜κΈ° λ•Œλ¬Έμ— μš°λ¦¬κ°€ μ›ν•˜λŠ” μ§€μ κΉŒμ§€ μ›€μ§μ˜€μ„λ•Œ int μ΅œλŒ€κ°’μ„ μ„ μ–Έν•˜κ³  그거보닀 μž‘μ€ 경우 μ΅œμ†Œκ°’μ΄λΌκ³  νŒλ‹¨ν•˜κ³  계속 μ €μž₯ν•œλ‹€ 그러면 λͺ¨λ“  μž¬κ·€κ°€ λλ‚¬μ„λ•Œ μ΅œμ†Œκ±°λ¦¬κ°€ λ‚˜μ˜¬κ²ƒμ΄λΌ 생각을 ν•˜μ˜€λ‹€

근데 λ„ˆλ¬΄ μ–΄λ ΅λ‹€.....

아이고

ν•œλ²ˆ κ΅¬ν˜„ν•΄λ³΄λ € ν•˜λ‹€κ°€ μ—΄λ°›μ•„μ„œ λ•Œλ €μΉ˜μš°κ³  μ €μžμ˜ μ½”λ“œλ₯Ό λ¦¬λ·°ν•΄λ³΄μ•˜λ‹€
쒀더 곡뢀λ₯Όν•˜κ³  λ‚΄κ°€ μƒκ°ν•˜λŠ” λ°©μ‹μœΌλ‘œ λ‹€μ‹œν•œλ²ˆ κ΅¬ν˜„ν•΄λ΄μ•Όκ² λ‹€

#include <iostream>
#include <queue>

using namespace std;

int n, m;
int graph[201][201];

// 이동할 λ„€ κ°€μ§€ λ°©ν–₯ μ •μ˜ (상, ν•˜, 쒌, 우) 
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};

int bfs(int x, int y) {
    // 큐(Queue) κ΅¬ν˜„μ„ μœ„ν•΄ queue 라이브러리 μ‚¬μš© 
    queue<pair<int, int> > q;
    q.push({x, y});
    // 큐가 빌 λ•ŒκΉŒμ§€ λ°˜λ³΅ν•˜κΈ° 
    while(!q.empty()) {
        int x = q.front().first;
        int y = q.front().second;
        q.pop();
        // ν˜„μž¬ μœ„μΉ˜μ—μ„œ 4κ°€μ§€ λ°©ν–₯으둜의 μœ„μΉ˜ 확인
        for (int i = 0; i < 4; i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];
            // 미둜 μ°ΎκΈ° 곡간을 λ²—μ–΄λ‚œ 경우 λ¬΄μ‹œ
            if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
            // 벽인 경우 λ¬΄μ‹œ
            if (graph[nx][ny] == 0) continue;
            // ν•΄λ‹Ή λ…Έλ“œλ₯Ό 처음 λ°©λ¬Έν•˜λŠ” κ²½μš°μ—λ§Œ μ΅œλ‹¨ 거리 기둝
            if (graph[nx][ny] == 1) {
                graph[nx][ny] = graph[x][y] + 1;
                q.push({nx, ny});
            } 
        } 
    }
    // κ°€μž₯ 였λ₯Έμͺ½ μ•„λž˜κΉŒμ§€μ˜ μ΅œλ‹¨ 거리 λ°˜ν™˜
    return graph[n - 1][m - 1];
}

int main(void) {
    // N, M을 곡백을 κΈ°μ€€μœΌλ‘œ κ΅¬λΆ„ν•˜μ—¬ μž…λ ₯ λ°›κΈ°
    cin >> n >> m;
    // 2차원 리슀트의 λ§΅ 정보 μž…λ ₯ λ°›κΈ°
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            scanf("%1d", &graph[i][j]);
        }
    }
    // BFSλ₯Ό μˆ˜ν–‰ν•œ κ²°κ³Ό 좜λ ₯
    cout << bfs(0, 0) << '\n';
    return 0;
}

βž• 2606 λ°”μ΄λŸ¬μŠ€

μ‹ μ’… λ°”μ΄λŸ¬μŠ€μΈ μ›œ λ°”μ΄λŸ¬μŠ€λŠ” λ„€νŠΈμ›Œν¬λ₯Ό 톡해 μ „νŒŒλœλ‹€. ν•œ 컴퓨터가 μ›œ λ°”μ΄λŸ¬μŠ€μ— 걸리면 κ·Έ 컴퓨터와 λ„€νŠΈμ›Œν¬ μƒμ—μ„œ μ—°κ²°λ˜μ–΄ μžˆλŠ” λͺ¨λ“  μ»΄ν“¨ν„°λŠ” μ›œ λ°”μ΄λŸ¬μŠ€μ— 걸리게 λœλ‹€.

예λ₯Ό λ“€μ–΄ 7λŒ€μ˜ 컴퓨터가 <κ·Έλ¦Ό 1>κ³Ό 같이 λ„€νŠΈμ›Œν¬ μƒμ—μ„œ μ—°κ²°λ˜μ–΄ μžˆλ‹€κ³  ν•˜μž. 1번 컴퓨터가 μ›œ λ°”μ΄λŸ¬μŠ€μ— 걸리면 μ›œ λ°”μ΄λŸ¬μŠ€λŠ” 2번과 5번 컴퓨터λ₯Ό 거쳐 3번과 6번 μ»΄ν“¨ν„°κΉŒμ§€ μ „νŒŒλ˜μ–΄ 2, 3, 5, 6 λ„€ λŒ€μ˜ μ»΄ν“¨ν„°λŠ” μ›œ λ°”μ΄λŸ¬μŠ€μ— 걸리게 λœλ‹€. ν•˜μ§€λ§Œ 4번과 7번 μ»΄ν“¨ν„°λŠ” 1번 컴퓨터와 λ„€νŠΈμ›Œν¬μƒμ—μ„œ μ—°κ²°λ˜μ–΄ μžˆμ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 영ν–₯을 λ°›μ§€ μ•ŠλŠ”λ‹€.

μ–΄λŠ λ‚  1번 컴퓨터가 μ›œ λ°”μ΄λŸ¬μŠ€μ— κ±Έλ Έλ‹€. μ»΄ν“¨ν„°μ˜ μˆ˜μ™€ λ„€νŠΈμ›Œν¬ μƒμ—μ„œ μ„œλ‘œ μ—°κ²°λ˜μ–΄ μžˆλŠ” 정보가 μ£Όμ–΄μ§ˆ λ•Œ, 1번 컴퓨터λ₯Ό 톡해 μ›œ λ°”μ΄λŸ¬μŠ€μ— 걸리게 λ˜λŠ” μ»΄ν“¨ν„°μ˜ 수λ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

DFSλ₯Ό ν™œμš©ν•˜λŠ” λ¬Έμ œμ΄λ‹€ dfs에 λŒ€ν•œ λ‚΄μš©μ„ μ—¬λŸ¬λ²ˆ 읽어도 아직 ν™œμš©ν•  μ •λ„κΉŒμ§€ μ‹€λ ₯이 였λ₯Έκ±° κ°™μ§€κ°€ μ•Šλ‹€ λͺ‡κ°œμ˜ 문제λ₯Ό 더 풀어봐야할거 κ°™λ‹€

dfsλ₯Ό μ‚¬μš©ν• λ•ŒλŠ” 이미 λ°©λ¬Έν•œ λ…Έλ“œλ₯Ό μ²΄ν¬ν•˜λŠ” λ°°μ—΄κ³Ό μž…λ ₯받은 λ°°μ—΄ 두가지λ₯Ό μ „μ—­λ³€μˆ˜λ‘œ μ„ μ–Έν•΄μ£Όμ—ˆλ‹€

ν˜Όμžμƒκ°ν• λ•ŒλŠ” λ‘κ°œλ₯Ό μ–΄λ–€μ‹μœΌλ‘œ μ—°κ²°ν•΄μ•Όν• μ§€ 아이디어가 λ– μ˜€λ₯΄μ§€ μ•Šμ•˜λŠ”λ° λ‹€λ₯Έ λΈ”λ‘œκ·Έλ₯Ό μ°Έκ³ ν•΄λ³΄λ‹ˆ μ–‘λ°©ν–₯ κ·Έλž˜ν”„λ‘œ 이어주면 ν’€μˆ˜μžˆλ‹€

#include <iostream>

using namespace std;

int com[101][101];
int check[101];
int res = 0;
int n, m;

void dfs(int k)
{
    check[k] = 1;
    res++;
    for (int i = 1; i <= n; i++)
    {
        if (com[k][i] && !check[i])
            dfs(i);
    }
}

int main()
{
    cin >> n >> m;
    for (int i = 0; i < m; i++)
    {
        int x, y;
        cin >> x >> y;
        com[x][y] = 1;
        com[y][x] = 1;
    }
    dfs(1);
    cout << res - 1 << endl;
    return 0;
}
profile
μ—΄μ‹¬νžˆμ‚΄μž

0개의 λŒ“κΈ€