๐Ÿงฉ Problem Solving/[๋ฐฑ์ค€]

[๋ฐฑ์ค€] 30804 ๊ณผ์ผ ํƒ•ํ›„๋ฃจ (python ํŒŒ์ด์ฌ)

์ œ๋ด‰์•„ 2025. 1. 22. 03:08

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

 

์˜ค๋ฅธ์ชฝ ํฌ์ธํ„ฐ ์œ„์น˜๋งˆ๋‹ค ์ •๋‹ต ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•ด ์ฃผ๋ฉด ๋œ๋‹ค.