Computer Science/백준

백준 14889번 스타트와 링크

Dior2ky 2020. 3. 12. 18:48
반응형

백준 14889번 스타트와 링크 문제이다.

이번 문제는 설명이 매우 길다. 사람을 두 그룹으로 나누어 묶고 시너지 표를 보고 각 그룹의 시너지의 차이를 구하면 된다.

이해가 잘 안된다면 입출력 예시를 본다.

이번 문제도 백트래킹 문제이기 때문에 한 그룹에 사람을 한명씩 넣어가도록 한다.

한 그룹에 사람이 반절 차게 되면 다른 한 그룹도 정해지게 된다.

그룹이 정해지는 순간 시너지 표에서 각 그룹의 시너지 합을 구해 차를 비교해준다.

차가 최솟값이 되어야 하기 때문에 최솟값으로 구해진 값과 비교하여 갱신해준다. 

여기서 생각해줘야 할 점은 solve 함수에 들어간 k값이다. k 값을 넣음으로써 그룹에 한 사람이 들어갔다면 

다시 처음사람부터 확인하는 것이 아니라 k번째 다음 사람부터 확인이 가능하다.

def solve(k, cnt)
    if cnt == ($n/2)
        result = calc()
        if $gap > result
            $gap = result
        end
    else
        for i in k...$n
            if $human[i] == 1
                $human[i] -=1
                solve(i, cnt+1)
                $human[i] +=1
            end
        end
    end
end
def calc()
    check = 0
    check2 = 0
    sum1 = 0
    sum2 = 0
    pick = Array.new($n/2){0}
    pick2 = Array.new($n/2){0}
    for i in 0...$n
        if $human[i] == 0
            pick[check] = i
            check += 1
        else
            pick2[check2] = i
            check2 += 1
        end
    end
    for i in 0...$n/2
        for j in i+1...$n/2
            sum1 = sum1 + $arr[pick[i]][pick[j]] + $arr[pick[j]][pick[i]]
            sum2 = sum2 + $arr[pick2[i]][pick2[j]] + $arr[pick2[j]][pick2[i]]
        end
    end
    return ((sum1 - sum2).abs)
end

            

$n = gets().chomp().to_i
$arr = Array.new($n) {Array.new($n){0}}
$human = Array.new($n){1}

$gap = 100000
for i in 0...$n
    $arr[i] = gets.chomp().split()
    for j in 0...$n
        $arr[i][j] = $arr[i][j].to_i
    end
end
solve(0, 0)

puts($gap)

언어는 ruby를 사용하였다. 

성공!

반응형