https://school.programmers.co.kr/learn/courses/30/lessons/43162
ํ๋ก๊ทธ๋๋จธ์ค
์ฝ๋ ์ค์ฌ์ ๊ฐ๋ฐ์ ์ฑ์ฉ. ์คํ ๊ธฐ๋ฐ์ ํฌ์ง์ ๋งค์นญ. ํ๋ก๊ทธ๋๋จธ์ค์ ๊ฐ๋ฐ์ ๋ง์ถคํ ํ๋กํ์ ๋ฑ๋กํ๊ณ , ๋์ ๊ธฐ์ ๊ถํฉ์ด ์ ๋ง๋ ๊ธฐ์ ๋ค์ ๋งค์นญ ๋ฐ์ผ์ธ์.
programmers.co.kr
๋ฌธ์ ์ค๋ช
๋คํธ์ํฌ๋ ์ปดํจํฐ ์ํธ ๊ฐ์ ์ ๋ณด๋ฅผ ๊ตํํ ์ ์๋๋ก ์ฐ๊ฒฐ๋ ํํ๋ฅผ ์๋ฏธํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ปดํจํฐ A์ ์ปดํจํฐ B๊ฐ ์ง์ ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์๊ณ , ์ปดํจํฐ B์ ์ปดํจํฐ C๊ฐ ์ง์ ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์์ ๋ ์ปดํจํฐ A์ ์ปดํจํฐ C๋ ๊ฐ์ ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์ ๋ณด๋ฅผ ๊ตํํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ปดํจํฐ A, B, C๋ ๋ชจ๋ ๊ฐ์ ๋คํธ์ํฌ ์์ ์๋ค๊ณ ํ ์ ์์ต๋๋ค.
์ปดํจํฐ์ ๊ฐ์ n, ์ฐ๊ฒฐ์ ๋ํ ์ ๋ณด๊ฐ ๋ด๊ธด 2์ฐจ์ ๋ฐฐ์ด computers๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ๋คํธ์ํฌ์ ๊ฐ์๋ฅผ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํ์์ค.
์ ํ์ฌํญ
- ์ปดํจํฐ์ ๊ฐ์ n์ 1 ์ด์ 200 ์ดํ์ธ ์์ฐ์์ ๋๋ค.
- ๊ฐ ์ปดํจํฐ๋ 0๋ถํฐ n-1์ธ ์ ์๋ก ํํํฉ๋๋ค.
- i๋ฒ ์ปดํจํฐ์ j๋ฒ ์ปดํจํฐ๊ฐ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉด computers[i][j]๋ฅผ 1๋ก ํํํฉ๋๋ค.
- computer[i][i]๋ ํญ์ 1์ ๋๋ค.
์ ์ถ๋ ฅ ์
n | computers | return |
3 | [[1, 1, 0], [1, 1, 0], [0, 0, 1]] | 2 |
3 | [[1, 1, 0], [1, 1, 1], [0, 1, 1]] | 1 |
์ ์ถ๋ ฅ ์ ์ค๋ช
์์ #1
์๋์ ๊ฐ์ด 2๊ฐ์ ๋คํธ์ํฌ๊ฐ ์์ต๋๋ค.
์์ #2
์๋์ ๊ฐ์ด 1๊ฐ์ ๋คํธ์ํฌ๊ฐ ์์ต๋๋ค.
๋ด ํด๋ต
dfs - stack ์ฌ์ฉ
#include <string>
#include <vector>
#include <stack>
using namespace std;
int solution(int n, vector<vector<int>> computers) {
int answer = 0;
int cur_computer = 0;
vector<bool> visit(n, false);
stack<int> network{}; // dfs
while(true)
{
// ๋คํธ์ํฌ์ ์ปดํจํฐ ๋ชฉ๋ก์ด ๋น์๋ค๋ฉด
if(network.empty())
{
// ๋ฐฉ๋ฌธํ์ง ์์ ์ปดํจํฐ ์ค ์ธ๋ฑ์ค ๊ฐ์ด ๊ฐ์ฅ ์์ ์ปดํจํฐ 1๊ฐ๋ฅผ ๋คํธ์ํฌ์ ์ถ๊ฐ
for(int i = 0; i < visit.size(); ++i)
{
if(!visit[i])
{
network.push(i);
break;
}
}
// ๋คํธ์ํฌ์ ์ปดํจํฐ๊ฐ ์๋ค๋ฉด ์ข
๋ฃ
if(network.empty())
break;
// ๋คํธ์ํฌ์ ์ปดํจํฐ๊ฐ ์๋ค๋ฉด ๋คํธ์ํฌ ์ ์ฆ๊ฐ
else
++answer;
}
// ํ์ฌ ์ปดํจํฐ ๋ฐฉ๋ฌธ
cur_computer = network.top();
network.pop();
visit[cur_computer] = true;
// ๋คํธ์ํฌ์ ์ฐ๊ฒฐ๋ ์ปดํจํฐ ๋ฃ๊ธฐ
for(int i = 0 ; i < computers[cur_computer].size(); ++i )
{
if(1 == computers[cur_computer][i] && !visit[i])
network.push(i);
}
}
return answer;
}
dfs - ์ฌ๊ท์ฌ์ฉ
#include <string>
#include <vector>
#include <stack>
using namespace std;
vector<bool> visit(200, false);
void dfs(int cur, const vector<vector<int>>& computers)
{
visit[cur] = true;
for(int i = 0; i < computers[cur].size(); ++i)
{
// ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ์ฐ๊ฒฐ๋ ์ปดํจํฐ๋ผ๋ฉด ์ฌ๊ท
if(1 == computers[cur][i] && !visit[i])
dfs(i, computers);
}
return;
}
int solution(int n, vector<vector<int>> computers) {
int answer = 0;
// ๋คํธ์ํฌ๋ก ์ฐ๊ฒฐ๋ ์ปดํจํฐ ์ฒดํฌ
for(int i = 0 ; i < n; ++i )
{
if(!visit[i])
{
dfs(i, computers);
++answer;
}
}
return answer;
}
'๐ฅ๏ธ Study Note > Coding Test' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ๋ก๊ทธ๋๋จธ์ค / level.3 / ๋จ์ด ๋ณํ(C++) (0) | 2023.04.13 |
---|---|
ํ๋ก๊ทธ๋๋จธ์ค / level.2 / ๊ฒ์ ๋งต ์ต๋จ๊ฑฐ๋ฆฌ(C++) (0) | 2023.04.11 |
ํ๋ก๊ทธ๋๋จธ์ค / level.2 / ํ๊ฒ ๋๋ฒ(C++) (0) | 2023.04.07 |
ํ๋ก๊ทธ๋๋จธ์ค / level.2 / ์ ๋ ฅ๋ง์ ๋๋ก ๋๋๊ธฐ(C++) (0) | 2023.04.06 |
ํ๋ก๊ทธ๋๋จธ์ค / level.2 / ๋ชจ์์ฌ์ (C++) (0) | 2023.04.05 |