25-1 SISS/C스터디
[SISS/C언어 스터디] 25-1학기 4주차 스터디 - 완전 탐색, 추가 과제
noname64
2025. 4. 3. 13:15
: 4주차 (3/31~4/6) 프로그래머스 지정 1문제 (완전탐색)- https://school.programmers.co.kr/learn/courses/30/lessons/86971
전력망을 둘로 나누기
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#define MAX_N 100
// 인접 리스트를 사용한 그래프 표현
int graph[MAX_N + 1][MAX_N + 1];
int visited[MAX_N + 1];
// DFS를 이용하여 연결된 송전탑 개수 계산
int dfs(int node, int n) {
visited[node] = 1;
int count = 1;
for (int i = 1; i <= n; i++) {
if (graph[node][i] == 1 && !visited[i]) {
count += dfs(i, n);
}
}
return count;
}
int solution(int n, int** wires, size_t wires_rows, size_t wires_cols) {
int min_diff = n;
// 그래프 초기화
memset(graph, 0, sizeof(graph));
// 그래프 생성
for (size_t i = 0; i < wires_rows; i++) {
int v1 = wires[i][0];
int v2 = wires[i][1];
graph[v1][v2] = 1;
graph[v2][v1] = 1;
}
// 모든 간선을 하나씩 끊어보며 최소 차이 계산
for (size_t i = 0; i < wires_rows; i++) {
int v1 = wires[i][0];
int v2 = wires[i][1];
// 전선 끊기
graph[v1][v2] = 0;
graph[v2][v1] = 0;
// 방문 배열 초기화
memset(visited, 0, sizeof(visited));
// 한쪽 네트워크의 송전탑 개수 구하기
int count = dfs(v1, n);
// 두 네트워크 간의 차이 계산
int diff = abs((n - count) - count);
if (diff < min_diff) {
min_diff = diff;
}
// 전선 복구
graph[v1][v2] = 1;
graph[v2][v1] = 1;
}
return min_diff;
}
2110
→ https://www.acmicpc.net/problem/2110
#include <stdio.h>
#include <stdlib.h>
// 오름차순 - qsort()
int compare(const void *a, const void *b) {
return (*(int*)a - *(int*)b);
}
int main() {
int N, C;
scanf("%d %d", &N, &C); // 집 개수(N)와 공유기 개수(C)
int arr[N];
for (int i = 0; i < N; i++) {
scanf("%d", &arr[i]); // 집 좌표
}
qsort(arr, N, sizeof(int), compare); // 집 좌표 정렬
int start = 1; // 최소 거리
int end = arr[N-1] - arr[0]; // 최대 거리
int result = 0;
// 이진 탐색
while (start <= end) {
int mid = (start + end) / 2; // 공유기 간의 거리 후보
int current = arr[0]; // 첫 번째 공유기를 첫 번째 집에
int count = 1; // 공유기 개수
// 공유기 설치 가능 여부 확인
for (int i = 1; i < N; i++) {
if (arr[i] >= current + mid) { // 현위치에서 mid 거리 이상일 경우 설치
count++;
current = arr[i];
}
}
// 공유기 설치 수가 목표보다 이상일 경우 거리 늘림
if (count >= C) {
result = mid;
start = mid + 1;
} else { // 공유기 설치 수가 목표보다 미만일 경우 거리 줄임
end = mid - 1;
}
}
printf("%d\n", result);
return 0;
}