본문 바로가기

문제풀이/백준

백준 1071번 소트

http://icpc.me/1071

 

1071번: 소트

N개의 정수가 주어지면, 이것을 연속된 두 수가 연속된 값이 아니게 정렬(A[i] + 1 ≠ A[i+1])하는 프로그램을 작성하시오. 가능한 것이 여러 가지라면 사전순으로 가장 앞서는 것을 출력한다.

www.acmicpc.net

풀이

간단한 그리디 문제입니다.

사전순으로 앞선 배열을 만들어야 하기 때문에 앞에서 최대한 작은 수를 사용해야 합니다.

앞서 $i$개의 수를 최적으로 출력했다고 가정할 때 가능하다면 무조건 출력하지 않은 수 중 최솟값을 출력해야 하며, 최솟값을 출력할 수 없다면 두 번째로 작은 값을 출력해야 합니다. 최솟값을 출력할 수 없는 경우는 두 가지입니다.

 

1) $i$번째로 출력한 수 + 1 == 최솟값일 때

2) 출력하지 않은 수에서 중복을 제거하면 두 개의 수만 남을 때

 

1번 경우는 문제의 조건과 같으며, 2번 경우는 문제의 두 번째 예제에서 확인할 수 있습니다. 

배열을 비내림차순으로 정렬했을 때 인접한 두 원소의 차가 1이라면 둘 사이에 다음으로 작은 값을 하나 끼워넣는다고 생각할 수도 있습니다. 2번 경우에는 끼워넣을 값이 없기 때문에 부득이하게 큰 값을 먼저 모두 출력하고 작은 값들을 출력해야 합니다.

 

위 과정을 $N$번 반복하면 정답을 구할 수 있습니다.

 

코드

다양한 방법으로 구현할 수 있습니다.

저는 우선순위 큐를 사용하여 구현했습니다.

시간복잡도는 $O(NlogN)$입니다.

 

 

사족

N제한이 매우 작은데 왜 그런지는 잘 모르겠습니다. 

덕분에 백트래킹으로도 풀 수 있다고 합니다.

잘만 구현한다면 $O(N)$ 시간복잡도로도 풀 수 있을 것 같습니다.

'문제풀이 > 백준' 카테고리의 다른 글

백준 4828번 XML  (0) 2021.10.29
백준 20051번 Zagrade  (0) 2021.07.03
백준 20442번 ㅋㅋ루ㅋㅋ  (1) 2021.04.24
백준 4195번 친구 네트워크  (0) 2020.11.30
백준 1422번 숫자의 신  (0) 2020.11.23