안녕하세요! 오늘은 프로그래머스의 네트워크 문제를 풀었습니다.
전형적인 union find문제기도 했지만, 한편으론 단순히 dfs돌리면서 같은그룹인지 확인할 수 있는 문제였습니다.
programmers.co.kr/learn/courses/30/lessons/43162#
코딩테스트 연습 - 네트워크
네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고, 컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있��
programmers.co.kr
접근과정으로
1. computers 배열에 들어온 데이터를 갖고 하나씩 순회하면서, 연결관계를 파악했습니다.
2. 두 지점이 연결되있으면 union find를 실행해 하나의 네트워크로 묶었고
3. 최종적으로 네트워크 갯수가 몇개인지를 세었습니다.
#include <string>
#include <vector>
using namespace std;
//최대 200개의 그룹존재할수있음
int group[201];
int findParent(int a){
if(group[a] == a){
return a;
}
return findParent(group[a]);
}
void merge(int a, int b){
int parent_a = findParent(a);
int parent_b = findParent(b);
//두 그룹이 다르면
if(parent_a != parent_b){
//b그룹을 a그룹에 속하게 만들기
group[parent_b] = parent_a;
}
}
int solution(int n, vector<vector<int>> computers) {
int answer = 0;
//각각 자신만 그룹 처리 (초기화)
for(int i=1;i<=n;i++){
group[i] = i;
}
for(int i=0;i<computers.size();i++){
for(int j=0;j<i;j++){
//i랑 j가 연결되있다면
if(computers[i][j] == 1){
//unionFind (각 컴퓨터 0부터인데 1부터로 기준바꾸고싶어 +1해서 넘김)
merge(i+1,j+1);
}
}
}
//그룹확인하며 최종 갯수 세기
int checked[201]={};
//물론 set같은 집합에 담아서 갯수세는게 편하지만
//안쓰고 배열이용해서 갯수세는 식으로 구현해봄.
for(int i=1;i<=n;i++){
int p = findParent(group[i]);
if(checked[p]==0){
answer++;
checked[p]=1;
}
}
return answer;
}
게임개발을 희망하는 초등학생, 중학생, 고등학생들을 위한 c언어 책
이 글을 보고있다는건 게임개발에 관심있다는 거겠죠? 그렇다면 정말 잘보셨습니다. 읽기 쉽고, 단기간 내에 자기꺼화 할 수 있게 최대한 핵심만 담았습니다. 게임을 어떻게 만드는지 궁금해
blog.codingteacher.kr
초등, 중등, 고등 1:1 원격 c언어 교육문의
010 - 4537 - 7998
현재 대치동 학원에서 코딩강사로 활동중에 있습니다
영재고, 과학고 내신 /
초등, 중등, 고등 입문반, 초급, 중급, 정올반 /
앱, 게임 제작반 문의주세요!
'박기완 코딩교육 > 코딩테스트 대비' 카테고리의 다른 글
프로그래머스 소수 찾기 문제 (0) | 2020.10.21 |
---|---|
프로그래머스 단어 변환 문제 (0) | 2020.10.20 |
프로그래머스 타겟 넘버 문제 (0) | 2020.10.18 |
프로그래머스 가장 먼 노드 문제 (0) | 2020.10.17 |
프로그래머스 입국심사 문제 (0) | 2020.10.16 |