728x90
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/86971
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#define MAX 100
int adj[MAX + 1][MAX + 1];
int visited[MAX + 1];
int dfs(int v1, int n) {
visited[v1] = 1;
int cnt = 1;
for (int i = 1; i <= n; i++) {
if (adj[v1][i] && !visited[i])
cnt += dfs(i, n);
}
return cnt;
}
int solution(int n, int** wires, size_t wires_rows, size_t wires_cols) {
int answer = n;
int v1, v2;
memset(adj, 0, sizeof(adj));
for (int i = 0; i < wires_rows; i++) {
v1 = wires[i][0];
v2 = wires[i][1];
adj[v1][v2] = 1;
adj[v2][v1] = 1;
}
// 하나씩 돌면셔 간선 끊고, 갯수 확인
for (int i = 0; i < wires_rows; i++) {
v1 = wires[i][0];
v2 = wires[i][1];
adj[v1][v2] = 0; // 간선 끊기
adj[v2][v1] = 0;
memset(visited, 0, sizeof(visited)); // 방문배열 초기화
int tmp = dfs(v1, n); // v1 노드에 연결된 노드 갯수
int dif = abs((n - tmp) - tmp); // 차이계산
if (dif < answer) {
answer = dif;
}
adj[v1][v2] = 1; // 끊은 간선 되돌리기
adj[v2][v1] = 1;
}
return answer;
}
1. 인접 행렬 초기화
주어진 전선 정보에 대한 그래프를 인접 행렬 형태로 초기화 한다.
adf[i][j] = 1 이면 노드 i 와 노드 j 가 연결된 것을 의미한다.
2. 간선 제거 및 탐색
각 전선을 하나씩 제거 후 나눠진 서브 그래프 중 한쪽의 노드 수를 계산한다.
3. 최소 차이 계산
두 서브 그래프의 노드 수의 차이를 통해 최소 차이를 찾는다.
dfs 함수 구조
현재 방문한 노드를 visited 에 기록한다.
현재 노드에 연결된 노드들을 순회하여 현재 노드와 연결된 노드들 중 방문하지 않은 노드에 대해 dfs함수를 재귀적으로 호출한다.
방문한 노드 수를 세서 리턴.
참고) memset
#include <string.h>
void *memset(void *s, int c, size_t n);
메모리의 특정 영역을 원하는 값으로 채우는 데 사용
- s: 값을 설정할 메모리의 시작 주소.
- c: 메모리 영역을 채울 값. 이 값은 unsigned char로 변환되어 사용됨.
- n: 설정할 바이트의 수.
728x90
'프로그래머스' 카테고리의 다른 글
[프로그래머스/C] 큰 수 만들기 (0) | 2024.06.22 |
---|---|
[프로그래머스/C] 가장 큰 수 (0) | 2024.06.22 |
[프로그래머스/C] 주식가격 (0) | 2024.06.22 |
[프로그래머스/C] 특이한 정렬 (0) | 2024.06.21 |
[프로그래머스/C] 피로도 (0) | 2024.06.20 |