2023. 11. 9. 15:04, 알고리즘/프로그래머스
https://school.programmers.co.kr/learn/courses/30/lessons/86971
#include <bits/stdc++.h>
using namespace std;
int answer=0x7f7f7f7f;
vector<bool> vis(101);
void dfs(int idx, vector<vector<int>> wires){
vis[idx]=true;
for(int i=0; i<wires.size();i++){
if(wires[i][0]==idx&&!vis[wires[i][1]]) dfs(wires[i][1],wires);
else if(wires[i][1]==idx&&!vis[wires[i][0]]) dfs(wires[i][0],wires);
}
}
int solution(int n, vector<vector<int>> wires){
for(int i=0; i<wires.size();i++){
int res=0;
vector<vector<int>> tmp(wires);
fill(vis.begin(),vis.end(),false);
tmp.erase(tmp.begin()+i);
dfs(tmp[0][0],tmp);
for(int i=1; i<=n; i++){
if(vis[i]) res++;
}
answer=min(answer,abs(res-(n-res)));
}
return answer;
}
+++++++++++
다른 사람의 풀이 보기를 했을때 가장 위에 올라와있는 추천수가 가장 많은 코드인데, 이 코드로 돌려보면
위의 풀이보다 훨씬 빠르다. 이 방법을 익히는것이 좋겠다. 이 방법에 익숙해지도록 하자
#include <bits/stdc++.h>
using namespace std;
int solution(int n, vector<vector<int>> wires) {
vector<vector<int>> graph(n + 1);
for(int i = 0; i < (int)wires.size(); i++) {
int u = wires[i][0];
int v = wires[i][1];
graph[u].push_back(v);
graph[v].push_back(u);
}
vector<int> siz(n + 1);
function<void(int, int)> dfs = [&](int cur, int prev) -> void {
siz[cur] = 1;
for(int nxt : graph[cur]) {
if(nxt == prev) continue;
dfs(nxt, cur);
siz[cur] += siz[nxt];
}
};
dfs(1, -1);
int answer = INT_MAX;
for(int i = 1; i <= n; i++) {
for(int j : graph[i]) {
int l = siz[j];
int r = n - siz[j];
answer = min(answer, abs(l - r));
}
}
return answer;
}
람다 함수를 통해서 dfs를 solution 내부에서 정의하고 사용하는것 또한 재미있다. 유용한 형태이다. 아무래도 이 형태로 사용하는것은 그동안 알고리즘 문제풀이에서는 많이 사용해보지 않아서 내가 아직 익숙하게 사용하지 못하는 형태지만, 그래도 계속 만날때마다 익숙해지는 연습을 해보도록 하자.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
프로그래머스 lv 2. 42860 조이스틱 c++ (0) | 2023.11.13 |
---|---|
프로그래머스 lv 2. 84512 모음사전 c++ (0) | 2023.11.09 |
프로그래머스 lv 2. 87946 피로도 c++ (0) | 2023.11.08 |
프로그래머스 lv 2. 42842 카펫 c++ (0) | 2023.11.08 |
프로그래머스 lv 2. 42839 소수찾기 c++ (0) | 2023.11.08 |
Comments, Trackbacks