[백준 2912] 백설공주와 난쟁이 #73
ghdcksgml1
started this conversation in
1일 1알고리즘
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
아이디어
사진에 찍힌 난쟁이의 정보가 주어졌을 때, 예쁜 사진인지 아닌지 알아내는 프로그램을 작성하는 문제이다.
모자의 색상이 주어지면 머지소트 트리로 바로 구하는게 가능하지만, 모자의 색상이 주어지지 않고 알아서 찾아야하기 때문에 문제 아이디어를 떠올리는게 매우 어려웠다.
사진에 찍힌 난쟁이 K명 중 K/2보다 많은 난쟁이의 모자색을 찾아야한다.
일단 잘 모르겠어서 무작정 머지소트 트리를 구현했다.
머지소트 트리를 구현하면 아래와 같이 나온다.
여기서 엄청난 규칙을 발견했다!!
리프 노드를 제외한 현재 노드가 2K개라고 할때, K,K-1 인덱스의 값이 같다면 그 값이 과반수일 가능성이 높다는 것이다. (무조건 과반수 이상 x)
현재 노드의 개수가 홀수개라면 K/2를 추가해준다.
시간 복잡도
일단 (3 ≤ N ≤ 300,000, 1 ≤ C ≤ 10,000, 1 ≤ M ≤ 10,000) 이기 때문에 C*M = 108 으로 시간 초과가 나게 된다.
머지소트 트리를 쓰면 시간복잡도와 공간복잡도 둘다 O(N logN)으로 구현할 수 있다.
이렇게 머지소트 트리를 구현하고나서 M번 동안의 예쁜사진을 인지 아닌지를 출력해야한다.
구현한 머지소트 트리를 이용하면 O(logN)만에 해당 모자를 쓴 난쟁이의 숫자를 구할 수 있다.
하지만, 난쟁이들의 모자색은 최대 10,000가지 이므로 만가지를 모두 다 탐색하게 된다면 O(MClogN) 으로 시간초과가 나게된다.
따라서 위에서 찾아낸 규칙을 이용해 과반수일 가능성이 높은 모자색만 탐색하게 된다면 O(M*log2N) 으로 시간복잡도를 줄일 수 있다.
Beta Was this translation helpful? Give feedback.
All reactions