코테/프로그래머스
[프로그래머스] 전력망을 둘로 나누기 (BFS)
길용쓰
2023. 2. 24. 11:31
https://school.programmers.co.kr/learn/courses/30/lessons/86971
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
전선 하나를 끊어 전력망을 2개로 나눴을때
각 전전력망의 개수 차의 최솟값을 구하라
주어진 wires 배열의 값중 하나를 의미 없는 값으로 바꾸고 모든 경우에 bfs 탐색을 수행
1번 송전탑 + 연결된 탑의 개수 N을 구하고
N과 (전체 전력망 개수)-N의 차가 최소가 될때 그 값을 return 한다
int solution(int n, vector<vector<int>> wires) {
int answer = 999;
for(int t=0 ; t<wires.size() ; t++){
w=wires;
w[t]={0,0};
w 벡터에 wires를 복사하고 임의의 값 하나를 {0,0}으로 변경
queue<int> q;
q.push(1);
counts=0;
for(int tt=0 ; tt<101 ; tt++)
visit[tt]=0;
visit[1]=1;
while(!q.empty()){
counts++;
int start = q.front();
cout<<start<<" ";
q.pop();
for(int i=0 ; i<wires.size() ; i++){
int w0 = w[i][0];
int w1 = w[i][1];
if(w0==start && visit[w1]!=1){
q.push(w1);
visit[w1]=1;
}
if(w1==start && visit[w0]!=1){
q.push(w0);
visit[w0]=1;
}
}
}
각각의 경우에 bfs 탐색을 수행
int a = n-counts;
int b = max(counts, n-counts);
int c = min(counts, n-counts);
int d = b-c;
if(d<answer)
answer = d;
}
return answer;
bfs로 구한 한 전력망의 송전탑 개수 counts와
다른 전력망의 개수는 n - counts
둘의 차를 구하고
차의 최소값을 answer에 담아 return하면 끝
#include <string>
#include <vector>
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;
vector<vector<int>> w;
int visit[101];
int counts=0;
int solution(int n, vector<vector<int>> wires) {
int answer = 999;
for(int t=0 ; t<wires.size() ; t++){
w=wires;
w[t]={0,0};
queue<int> q;
q.push(1);
counts=0;
for(int tt=0 ; tt<101 ; tt++)
visit[tt]=0;
visit[1]=1;
while(!q.empty()){
counts++;
int start = q.front();
cout<<start<<" ";
q.pop();
for(int i=0 ; i<wires.size() ; i++){
int w0 = w[i][0];
int w1 = w[i][1];
if(w0==start && visit[w1]!=1){
q.push(w1);
visit[w1]=1;
}
if(w1==start && visit[w0]!=1){
q.push(w0);
visit[w0]=1;
}
}
}
int a = n-counts;
int b = max(counts, n-counts);
int c = min(counts, n-counts);
int d = b-c;
if(d<answer)
answer = d;
cout<<"->"<<counts<<" answer="<<answer<<"\n";
}
return answer;
}
전체 코드