๐๋ฌธ์ ํ์ํ๊ธฐ
- ๊ธธ์ด๊ฐ N์ธ ์์ด์ด ์ฃผ์ด์ง
- ์์ด์์ ์ฐ์ํ 1๊ฐ ์ด์์ ์๋ฅผ ๋ฝ์์ ๋ ๊ฐ์ ์๊ฐ ์ฌ๋ฌ ๋ฒ ๋ฑ์ฅํ์ง ์๋ ๊ฒฝ์ฐ์ ์ ๊ตฌํ๊ธฐ
์ ๋ ฅ
- ์์ด์ ๊ธธ์ด N (1 ≤ N ≤ 100,000)
- ์์ด์ ๋ํ๋ด๋ N๊ฐ์ ์ ์ (1 ≤ ์์ด์ ๋ํ๋๋ ์ ≤ 100,000)
์ถ๋ ฅ
- ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฒฝ์ฐ์ ์
ํ์ด ๋ฐฉ๋ฒ ์๊ฐํด๋ณด๊ธฐ
์ฐ์ํ 1๊ฐ ์ด์์ ์๋ฅผ ๋ฝ์์ผ ํ๋ฏ๋ก, ํฌ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํด์ ๋ฝ์ ์๋ค์ ์ฒซ๋ฒ ์งธ ์์น์ ๋ง์ง๋ง ์์น๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํ๋ค. ์ฒซ ๋ฒ์งธ ์์น๋ฅผ ์ค์ ํ๊ณ , ๋ง์ง๋ง ์์น๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ฅผ ํ์นธ ์ฉ ์ฎ๊ฒจ์ ์ค๋ณต๋ ์๊ฐ ์๋์ง ์๋์ง ํ๋จํ๊ณ , ์ค๋ณต๋ ์๊ฐ ์๋ค๋ฉด ๋ค์ ์ฒซ๋ฒ์งธ ์์น๋ฅผ ํ ์นธ ์ฎ๊ฒจ ๊ฒฝ์ฐ์ ์๋ฅผ ์ธ๋ฉด ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ ์ ์๋ค.
์ด๋, ์ฒซ๋ฒ์งธ ์์น๊ฐ 1์ด๊ณ , ๋ง์ง๋ง ์์น๋ฅผ 1๋ถํฐ 5๊น์ง ํ์ํ์ ๋ ๊ฒฝ์ฐ์ ์๊ฐ 5๋ผ๋ฉด, ์ฒซ๋ฒ์งธ ์์น๊ฐ 2๊ณ , ๋ง์ง๋ง ์์น๋ฅผ 2๋ถํฐ 5๊น์ง ํ์ํ์ ๋ ๊ฒฝ์ฐ์ ์๋ 4๊ฐ ๋๋ค. ์ด๋ฅผ ํ์ฉํ์ฌ ํ์ ์๊ฐ์ ์ค์ผ ์ ์๋ค.
๐์ฝ๋ ์ค๊ณํ๊ธฐ
- ์์ด์ ๊ธธ์ด N์ ์ ๋ ฅ๋ฐ๋๋ค.
- numbers ๋ฆฌ์คํธ๋ฅผ ์์ฑํด ์์ด์ ๋ํ๋ด๋ ์ ์๋ค์ ์ ๋ ฅ๋ฐ์ ์ ์ฅํ๋ค.
- left๋ฅผ 0, right๋ฅผ 0์ผ๋ก ์ค์ ํ๋ค.
- ๊ฒฝ์ฐ์ ์๋ฅผ ์ ์ฅํ ๋ณ์ counts๋ฅผ ์์ฑํ๊ณ 0์ผ๋ก ์ด๊ธฐํํ๋ค.
- ํ์ฌ ์ค์ ๋ left๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฐ๋ฅํ ๊ฒฝ์ฐ์ ์๋ฅผ ์ ์ฅํ cur_count๋ฅผ ์์ฑํ๊ณ 1๋ก ์ด๊ธฐํํ๋ค.
- ํ์ฌ ์กฐ์ฌํ ๋ฒ์์์ ํน์ ์ซ์์ ๋ฑ์ฅ ํ์๋ฅผ ๊ธฐ๋กํ ๋ํดํธ๋ํธ count_dict๋ฅผ ์์ฑํ๊ณ , count_dict[numbers[right]]๋ฅผ 1๋ก ์ด๊ธฐํํ๋ค.
- left๊ฐ N๋ณด๋ค ์์ ๋๊น์ง ์๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
- right+1 >= N (์์ด ๋ฒ์ ๋ฒ์ด๋จ)์ด๊ฑฐ๋, counts_dict[number[right+1]] (์ค๋ณต ์ซ์ ๋ฑ์ฅ)์ด๋ผ๋ฉด counts์ cur_count๋ฅผ ๋ํ๊ณ , cur_count์์ 1์ ๋นผ์ค๋ค. ๊ทธ๋ฆฌ๊ณ count_dict[numbers[left]]์์ 1์ ๋นผ๊ณ left์ 1์ ๋ํ๋ค.
- 1์ ์กฐ๊ฑด์ ๊ฑธ๋ฆฌ์ง ์๋๋ค๋ฉด, right์ 1์ ๋ํ๊ณ count_dict[numbers[right]]์ cur_count์ 1์ ๋ํ๋ค.
- counts๋ฅผ ์ถ๋ ฅํ๋ค.
๐์ ๋ต ์ฝ๋
from collections import defaultdict
import sys
input = sys.stdin.readline
N = int(input())
numbers = list(map(int, input().split()))
left = right = counts = 0
cur_count = 1
count_dict = defaultdict(int)
count_dict[numbers[right]] = 1
while left < N:
if right+1 >= N or count_dict[numbers[right+1]]:
counts += cur_count
cur_count -= 1
count_dict[numbers[left]] -= 1
left += 1
else:
right += 1
count_dict[numbers[right]] += 1
cur_count += 1
print(counts)
728x90