문제
어느 나라에는, 여러 큐브와 연결된 스위치를 적절한 횟수만큼 눌러 모든 큐브 위에 적힌 숫자를 동일하게 만드는 게임이 있다.
그중 스트레이트 스위치라는 게임이 있다.
스트레이트 스위치 게임은 다음의 규칙을 따른다.
- 선분 위에 여러 개의 큐브가 일렬로 놓여 있고, 이 큐브 중 특정 큐브들과 연결된 스위치들이 여러 개 존재한다.
- i 번 스위치를 한 번 누르면 해당 스위치와 연결된 모든 큐브 위의 숫자가 1씩 빠르게 i 번 증가해, 총 i 만큼 증가한다.
- 큐브 위의 숫자는 0, 1, 2, 3, 4만 존재할 수 있으며 스위치를 눌러 큐브 위의 숫자가 증가하다 4를 초과하면 0으로 즉시 초기화된다.
- 스위치를 한 번 누를 때, 반드시 단 한 개의 스위치만 누를 수 있다.
- 같은 번호의 큐브가 한 스위치에 여러 번 연결되어있는 경우는 없다.
- 각 스위치를 누를 수 있는 횟수의 제한은 없다.
- 큐브 위에 쓰여 있는 모든 숫자가 동일해지는 순간, 게임은 종료된다.
이 스트레이트 스위치 게임의 국가 대표 선수인 당신은 세계 대회에서 우수한 성적을 거두기 위해 전략을 세워야 한다.
큐브의 개수와 현재 큐브 위에 쓰여 있는 숫자들, 그리고 스위치-큐브 간의 연결 정보가 주어질 때
이 큐브들 위에 쓰여 있는 숫자를 모두 동일하게 만들기 위해 눌러야 하는 스위치의 최소 횟수를 구해보자
입력
첫 번째 줄에는 큐브의 개수 N과 스위치의 개수 K가 주어진다. (1 ≤ N, K ≤ 8)
두 번째 줄에는 현재 N개의 큐브 위에 쓰여 있는 숫자 a1 a2 a3 … aN 가 한 줄에 주어진다. (0 ≤ ai ≤ 4)
세 번째 줄 부터 K+3번째 줄에는, 1번 스위치부터 K번 스위치까지 각 스위치에 연결된 큐브의 개수(Bm)와, 연결된 큐브의 번호들(bj)이 각 줄 마다 주어진다. (1 ≤ j, B ≤ N, 1 ≤ m, bj ≤ K)
출력
첫 번째 줄에 큐브들 위에 쓰여 있는 숫자를 모두 동일하게 만들기 위해 눌러야 하는 스위치의 최소 횟수를 출력한다.
(단, 주어진 스위치들을 아무리 누르더라도 모든 큐브의 숫자를 동일하게 만들 수 없는 경우에는 -1을 출력한다.)
풀이
스위치를 누르는 최소 횟수를 구하는 문제라는 점에서 최단 거리
문제임을 알 수 있다. BFS
를 사용할 것인데, 큐브는 정수가 나열된 vector
형태의 데이터이므로 지점마다의 최단거리를 기록할 때 vector
형식을 key
로 갖는 map
자료구조를 사용해야 한다. 큐브와 스위치의 개수가 8
개로 아주 작으므로 이런 방식을 사용해도 시간 안에 충분히 돌아갈 것이라고 예상할 수 있다.
그리고 약간의 구현
능력이 필요한 부분은 큐브와 스위치의 연결인데, 이는 vector
배열을 선언하여 각 인덱스마다 해당 번호의 스위치에 연결된 큐브 번호들을 넣어주면 된다.
전체 코드
1 |
|
- Post link: https://blog.yjyoon.dev/boj/2020/11/25/boj-20209/
- Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.