N = int(input())
arr = list(map(int,input().split()))

num_cnt = [0]*1005

for num in arr:
    num_cnt[num] += 1


cur = 0
result = []
while sum(num_cnt)>0:
    if num_cnt[cur]:
        if num_cnt[cur+1]:
            for next_num in range(cur+2,1001):
                if num_cnt[next_num]:
                    result.extend(num_cnt[cur]*[cur])
                    result.append(next_num)
                    num_cnt[cur] = 0
                    num_cnt[next_num] -= 1
                    break
            else:
                result.extend(num_cnt[cur+1]*[cur+1])
                result.extend(num_cnt[cur]*[cur])
                num_cnt[cur] = 0
                num_cnt[cur+1] = 0

        else:
            while num_cnt[cur]:
                result.append(cur)
                num_cnt[cur] -= 1
    cur += 1

print(*result)

 

플래티넘 문제로 어려웠던 문제였다. 

 

이 문제를 푸는 방법은 구분을 하는 것이다.

 

현재 숫자를 CUR이라고 하겠다. CUR+1의 숫자가 있는 경우와 없을때를 비교를 해서, 정렬을 해주면된다.

 

만약 CUR + 1의 숫자가 없을때에는 CUR의 값을 전부 출력시키면 된다.

 

 

그러나 CUR+1의 값이 존재할때는 2가지 경우가 있다.

 

CUR 보다 2이상 큰 값들이 존재하는지와 없는지 이다.

 

만약 없을때에는 CUR+1의 값들을 전부 출력한뒤에 CUR 값들을 출력시키면 된다.

 

그게 아니라 CUR보다 2이상 큰 값이 존재를 한다면,

 

CUR의 값들을 전부 출력시키고 그 다음에 CUR보다 2이상 큰 값을 한개 출력해주면 된다.

 

그러면 CUR과 CUR+1 사이에 CUR+2(이상)의 값이 들어가줘서 문제의 조건대로 출력이 가능해진다.

 

 

'알고리즘 > 백준' 카테고리의 다른 글

[BOJ/백준] 2933 미네랄  (0) 2021.05.10
[BOJ/백준] 1126 같은 탑  (0) 2021.05.02
[BOJ/백준] 1062 가르침  (0) 2021.05.02
[BOJ/백준] 1976 여행 가자  (0) 2021.04.08
[BOJ/백준] 7576 토마토  (0) 2021.04.08

+ Recent posts