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 |