import collections
N = int(input())
arr = list(map(int,input().split()))
a = collections.Counter(arr)
if max(a.values()) > 2 or len(a.keys()) != max(a.keys())+1:
print(0)
else:
keys = sorted(a.keys())
result = 1
prev_cnt = a[0]
flag = True
onecnt = False
for k in keys:
if prev_cnt < a[k]:
flag = False
break
else:
prev_cnt = a[k]
if a[k] == 2:
result*=2
else:
onecnt = True
if flag:
if onecnt:
print(result*2)
else:
print(result)
else:
print(0)
이 문제는 경우의 수를 구해주면 된다.
이 문제에서 중요한 것은, 연속되는 숫자들만 존재해야하고, 같은 숫자는 3개 이상이 되지 않으며,
뒤의 숫자의 개수가 앞의 숫자보다 많으면 안된다.
그리고 2개씩 존재하는 수의 개수만큼 2의 제곱승이 되고, 2개씩 존재하는 수 외에 1개씩 존재하는 수가 있으면, 2배를 해주면된다.
이 부분만 캐치해주면 코드로 구현해주면 된다.
위의 풀이는 조금 난잡하게 된 코드이다.
좀 더 깔끔한 코드는 밑에 올린다.
total = [0]*41
n = int(input())
arr = list(map(int,input().split()))
for num in arr:
total[num] += 1
prev_cnt = 2
flag = False
for cnt in total:
if cnt > prev_cnt:
flag = True
break
prev_cnt = cnt
if flag:
print(0)
else:
result = 2**(total.count(2) + (1 in total))
print(result)
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ] 11559 puyo puyo (0) | 2021.01.12 |
---|---|
[BOJ] 3055 탈출 (0) | 2021.01.11 |
[BOJ] 17472 다리 만들기 2 (0) | 2021.01.10 |
[BOJ] 18352 특정 거리의 도시 찾기 (0) | 2021.01.10 |
[BOJ] 20055 컨베이어 벨트 위의 로봇 (0) | 2021.01.10 |