프로그래밍/알고리즘

BOJ 12001 · Load Balancing (Bronze)

반응형


알고리즘 분류 : 브루트 포스  


농장을 4군데로 분할하여, 가장 균형 있게 나누는 방법을 푸는 문제다. 균형 있게 나눈다는 것은 4군데 중 어느 한곳에 너무 많은 소가 배치되지 않도록 나누는 것을 말한다. N이 최대 100이므로, 모든 경우의 수를 만들어도 해결할 수 있다.


  • X축 기준을 정하고 위아래로 나눈다.
  • Y축 기준을 정하고 양옆으로 나눈다.
  • 각 지역에 존재하는 소가 몇 마리인지 센다.
  • 위에서 센 소의 수 중, 가장 큰 값을 cow라고 하자.
  • N*N 번 반복하면서 얻을 수 있는 cow 중, 가장 작은 값이 정답이다.




C++ 소스코드


#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

int n, m;
vector<int> x, y;

void solve() {
    int ans = 1e9;
    for (int i=0; i<n; i++) {
        for (int j=0; j<n; j++) {
            int a = 0, b = 0, c = 0, d = 0;
            for (int k=0; k<n; k++) {
                if (x[k] < x[i]+1 && y[k] < y[j]+1) a++;
                if (x[k] < x[i]+1 && y[k] > y[j]+1) b++;
                if (x[k] > x[i]+1 && y[k] < y[j]+1) c++;
                if (x[k] > x[i]+1 && y[k] > y[j]+1) d++;
            }
            int cow = max(max(max(a, b), c), d);
            if (ans > cow) ans = cow;
        }
    }
    printf("%d\n", ans);
}

int main() {
    scanf("%d %d", &n, &m);
    for (int i=0; i<n; i++) {
        int a, b;
        scanf("%d %d", &a, &b);
        x.push_back(a);
        y.push_back(b);
    }
    solve();
    return 0;
}




Python 3 소스코드


from sys import stdin
input = stdin.readline

n, m = map(int, input().split())
x, y = [[] for _ in range(n)], [[] for _ in range(n)]
for i in range(n):
    x[i], y[i] = map(int, input().split())

def solve():
    ans = 1e9
    for i in range(n):
        for j in range(n):
            a, b, c, d = [0]*4
            for k in range(n):
                if x[k] < x[i]+1 and y[k] < y[j]+1:
                    a += 1
                if x[k] < x[i]+1 and y[k] > y[j]+1:
                    b += 1
                if x[k] > x[i]+1 and y[k] > y[j]+1:
                    c += 1
                if x[k] > x[i]+1 and y[k] < y[j]+1:
                    d += 1
            gap = max(a, b, c, d)
            ans = min(ans, gap)
    print(ans)

solve()




참고



반응형