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 |