-
백준(BOJ) 2933번 미네랄알고리즘 풀이/백준(Boj) 2019. 9. 20. 15:57
문제 : https://www.acmicpc.net/problem/2933
문제창영과 상근은 한 동굴을 놓고 소유권을 주장하고 있다. 두 사람은 막대기를 서로에게 던지는 방법을 이용해 누구의 소유인지를 결정하기로 했다. 싸움은 동굴에서 벌어진다. 동굴에는 미네랄이 저장되어 있으며, 던진 막대기가 미네랄을 파괴할 수도 있다.
동굴은 R행 C열로 나타낼 수 있으며, R×C칸으로 이루어져 있다. 각 칸은 비어있거나 미네랄을 포함하고 있으며, 네 방향 중 하나로 인접한 미네랄이 포함된 두 칸은 같은 클러스터이다.
창영은 동굴의 왼쪽에 서있고, 상근은 오른쪽에 서있다. 두 사람은 턴을 번갈아가며 막대기를 던진다. 막대를 던지기 전에 던질 높이를 정해야 한다. 막대는 땅과 수평을 이루며 날아간다.
막대가 날아가다가 미네랄을 만나면, 그 칸에 있는 미네랄은 모두 파괴되고 막대는 그 자리에서 이동을 멈춘다.
미네랄이 파괴된 이후에 남은 클러스터가 분리될 수도 있다. 새롭게 생성된 클러스터가 떠 있는 경우에는 중력에 의해서 바닥으로 떨어지게 된다. 떨어지는 동안 클러스터의 모양은 변하지 않는다. 클러스터는 다른 클러스터나 땅을 만나기 전까지 게속해서 떨어진다. 클러스터는 다른 클러스터 위에 떨어질 수 있고, 그 이후에는 합쳐지게 된다.
동굴에 있는 미네랄의 모양과 두 사람이 던진 막대의 높이가 주어진다. 모든 막대를 던지고 난 이후에 미네랄 모양을 구하는 프로그램을 작성하시오.
풀이 :
막대를 하나씩 던질때마다 DFS를 통해 한번에 이동할 미네랄들을 group에 저장한다.
그리고 low 배열을 만들어서 각 열마다 가장 큰 행을 넣어주자. 즉 가장 밑에있는 미네랄을 넣어주는 것.
그리고 각 열마다 가장 큰 행들이 얼마나 밑으로 내려갈수 있는지 정한다. 그 후 그중 최소만큼 옮긴다.
막대를 던진 횟수 만큼 반복한다.
코드 ( C++ )
'알고리즘 풀이 > 백준(Boj)' 카테고리의 다른 글
백준(BOJ) 3047번 ABC (31) 2019.09.21 백준(BOJ) 12969번 ABC (31) 2019.09.21 백준(BOJ) 5213번 과외맨 (31) 2019.09.18 백준(BOJ) 14500번 테트로미노 (31) 2019.09.16 백준(BOJ) 4811번 알약 (31) 2019.09.16