https://www.acmicpc.net/problem/13144
13144번: List of Unique Numbers
길이가 N인 수열이 주어질 때, 수열에서 연속한 1개 이상의 수를 뽑았을 때 같은 수가 여러 번 등장하지 않는 경우의 수를 구하는 프로그램을 작성하여라.
www.acmicpc.net
풀이 과정
수열의 왼쪽에서부터 순차적으로 진행한다.
- 현재의 숫자가 존재하지 않는다면 큐에 넣어준다.
- 현재의 숫자가 큐에 존재한다면, 현재 숫자가 나올때 까지 큐에서 빼내준 다음 현재 숫자를 넣는다.
현재 큐의 길이를 따로 저장해 둔다.
- 이유는 현재 숫자가 5고, 큐에 [2, 3, 5]가 들어있다면 경우의 수는 [2, 3, 5], [3, 5], [5] 3가지 즉, 큐의 길이만큼의 경우의 수가 나올 수 있다.
저장해둔 큐의 길이의 합계를 출력해주면 된다
- 전체 경우의 수를 구해야 하므로
소스 코드
import sys
from collections import deque
input = lambda : sys.stdin.readline().rstrip()
n = int(input())
sequence = list(map(int, input().split()))
dp = [0] * len(sequence)
queue = deque()
current = set()
for i in range(len(sequence)):
if sequence[i] in current:
while queue:
pos, value = queue.popleft()
current.remove(value)
if value == sequence[i]:
break
queue.append([i, sequence[i]])
current.add(sequence[i])
dp[i] = len(current)
print(sum(dp))
'알고리즘[Python] > 백준 알고리즘' 카테고리의 다른 글
[ 7795 ] [ 이진 탐색 ] 먹을 것인가 먹힐 것인가 (0) | 2021.09.22 |
---|---|
[ 2615 ] [ Brute-Force ] 오목 (0) | 2021.09.21 |
[ 2461 ] [ Two-Pointer ] 대표 선수 (0) | 2021.09.20 |
[ 5567 ] [ DFS ] 결혼식 (0) | 2021.09.17 |
[ 14588 ] [ Floyd ] Line Friends (Small) (0) | 2021.09.17 |