https://www.acmicpc.net/problem/30804
์ค๋ฒ2 ๋ผ๋ ๊ฒ ๋ฏฟ๊ธฐ์ง ์๋ ๋ฌธ์ . ๋ด๊ฐ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ๊ฐ๋ ์ ๋ชฐ๋๋ค๋ฉด ๋ชป ํ์์ ๊ฑฐ ๊ฐ๋ค.
์ด๊ฑด ์ ์ค๋ฒ์ ์์๊น
์์ด๋์ด
- ๋ฌธ์ ์์ ์ ์ํ๋ ๊ณผ์ผ ๋๊ฐ๋ก ๋ง๋ค ์ ์๋ ์ต๋ ๊ธธ์ด๋ฅผ ๊ตฌํ๊ธฐ ์ํด ํฌ ํฌ์ธํธ ๊ฐ๋ ์ ์ฌ์ฉํ๋ค.
์๊ฐ๋ณด๋ค ์์ N์ ํฌ๊ธฐ(200000), ๋๋ํ ์๊ฐ์ ํ(2์ด), ๊ทธ๋ฆฌ๊ณ ์ ์ ๊ณผ์ผ ๊ฐ์(์ต๋ 9๊ฐ)๋ฅผ ๋ณด๊ณ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ์ฐํด๋ ๊ด์ฐฎ๋ค๊ณ ์๊ฐํ๋ค. ๊ทธ๋์ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ๋ฅผ ์๊ฐํ๋ฉฐ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ํ์ํ๋ฉด์ ๊ฐ์ฅ ๊ธธ์ด๊ฐ ๊ธด ๊ฒฝ์ฐ๋ฅผ ์ฐพ์๋ค.
- ๊ณผ์ผ ์ข ๋ฅ์ ๊ฐ์๋ฅผ ๊ตฌํ ๋ ํธํ๋ ค๊ณ ๋์ ๋๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค.
์ ์ฒด ์ฝ๋
N = int(input())
tangList = list(map(int, input().split()))
visited = {}
maxLen = 0
leftPoint = 0
rightPoint = 0
while rightPoint < N:
nowTang = tangList[rightPoint]
if nowTang in visited:
visited[nowTang] += 1
else:
visited[nowTang] = 1
while len(visited) > 2:
removeTang = tangList[leftPoint]
visited[removeTang] -= 1
if visited[removeTang] == 0:
del visited[removeTang]
leftPoint += 1
maxLen = max(maxLen, rightPoint - leftPoint + 1)
rightPoint += 1
print(maxLen)
์ฝ๋ ์ค๋ช
if nowTang in visited:
visited[nowTang] += 1
else:
visited[nowTang] = 1
๊ณผ์ผ์ด ์ด๋ฏธ ๋์ ๋๋ฆฌ์ ์์ผ๋ฉด ๊ณผ์ผ ๊ฐ์๋ง ๋๋ ค์ฃผ๊ณ ์์ผ๋ฉด ๋์ ๋๋ฆฌ์ ๊ณผ์ผ์ ์ถ๊ฐํด ์ค๋ค.
while len(visited) > 2:
removeTang = tangList[leftPoint]
visited[removeTang] -= 1
if visited[removeTang] == 0:
del visited[removeTang]
leftPoint += 1
์ค๋ฅธ์ชฝ ํฌ์ธํฐ๋ฅผ ์ ์ ๋๋ ค์ฃผ๋ค๊ฐ ๊ณผ์ผ์ด 3๊ฐ๊ฐ ๋๋ฉด while๋ฌธ์ผ๋ก ๊ณผ์ผ ๊ฐ์๋ฅผ ์ค์ฌ์ค๋ค. ์ผ์ชฝ ํฌ์ธํฐ๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ํ ์นธ์ฉ ๋น๊ธฐ๋ฉฐ ๊ณผ์ผ ๊ฐ์๋ฅผ ์ค์ฌ์ค๋ค. ๊ณผ์ผ ๊ฐ์๊ฐ 0์ด ๋ ๊ณผ์ผ์ ์ฌ์ ์์ ์ง์์ฃผ๋ฉด ๋๋ค.
maxLen = max(maxLen, rightPoint - leftPoint + 1)
rightPoint += 1
์ค๋ฅธ์ชฝ ํฌ์ธํฐ ์์น๋ง๋ค ์ ๋ต ๊ฐ์ ์ ๋ฐ์ดํธํด ์ฃผ๋ฉด ๋๋ค.
'๐งฉ Problem Solving > [๋ฐฑ์ค]' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 1244 ์ค์์น ์ผ๊ณ ๋๊ธฐ (python ํ์ด์ฌ) (0) | 2025.01.26 |
---|---|
[๋ฐฑ์ค] 4963 ์ฌ์ ๊ฐ์ (python ํ์ด์ฌ) (1) | 2025.01.24 |
[๋ฐฑ์ค] 2563 ์์ข ์ด (python ํ์ด์ฌ) (0) | 2024.04.01 |
[๋ฐฑ์ค] 7579 ์ฑ (python ํ์ด์ฌ) (0) | 2024.03.28 |
[๋ฐฑ์ค] 4179 ๋ถ! (python ํ์ด์ฌ) (0) | 2024.03.28 |