이동식 저장소

1102. 발전소 본문

Problem Solving/BOJ

1102. 발전소

해스끼 2020. 3. 1. 13:42
 

1102번: 발전소

은진이는 발전소에서 근무한다. 은진이가 회사에서 잠깐 잘 때마다, 몇몇 발전소가 고장이난다. 게다가, 지금 은진이의 보스 형택이가 은진이의 사무실로 걸어오고 있다. 만약 은진이가 형택이가 들어오기 전까지 발전소를 고쳐놓지 못한다면, 은진이는 해고당할 것이다. 발전소를 고치는 방법은 간단하다. 고장나지 않은 발전소를 이용해서 고장난 발전소를 재시작하면 된다. 하지만, 이때 비용이 발생한다. 이 비용은 어떤 발전소에서 어떤 발전소를 재시작하느냐에 따라 다르다

www.acmicpc.net


최소의 비용으로 적어도 p개의 발전소를 켜야 하는 문제이다.

 

문제를 풀기 전에 짚고 넘어가야 할 점이 있다.

1. 발전소를 동시에 켜는 것이 아니며, 이전에 켠 발전소로 다른 발전소를 켤 수 있다.

2. 발전소를 켜는 비용은 0일 수도 있다. 

3. 정확히 p개를 켜는 것이 최적이 아닐 수도 있다. 왜냐하면 처음에 이미 p개 이상의 발전소가 켜져 있을 수도 있기 때문이다.

4. 섣불리 -1을 출력하면 틀렸습니다. p가 0일 수도 있다.

 

 

문제를 정확히 이해했다면 이제 풀이를 고민해 보자. 

어떤 발전소를 어떤 순서로 켜야 할까?

주목할 점은 N이 최대 16이라는 것이다. 문제에서 N이 매우 작을 때는 항상 완전 탐색이 가능한지 의심해야 한다. 이 문제에서는 발전소의 상태가 최대 2^16가지이므로, 시간 안에 완전 탐색이 가능하다.

 

발전소의 상태는 어떻게 저장해야 할까? boolean 배열 16개로 할 수도 있겠지만, 비트마스크를 이용하여 단 2바이트로 상태를 저장할 수 있다. 켜져 있는 발전소로 꺼져 있는 다른 발전소를 모두 켜 보면서 최솟값을 찾으면 된다. 

 

물론 중복 탐색을 방지하기 위해 dp 배열에 값을 저장하자. 이때 배열을 0으로 초기화하면 안 된다. 이해가 되지 않는다면 위의 2번을 다시 읽어보자.


문제의 질을 올리자.

'Problem Solving > BOJ' 카테고리의 다른 글

5373. 큐빙  (0) 2020.03.10
1194. 달이 차오른다, 가자.  (0) 2020.03.01
테스트 입력 파일을 쉽게 사용하는 방법  (0) 2020.02.29
2692. 양팔저울  (0) 2020.02.28
16946. 벽 부수고 이동하기 4  (0) 2020.02.18
Comments