[Programmers/ level3] ๋ณด์ ์ผํ๐
๐ฉ๋ฌธ์
[๋ณธ ๋ฌธ์ ๋ ์ ํ์ฑ๊ณผ ํจ์จ์ฑ ํ ์คํธ ๊ฐ๊ฐ ์ ์๊ฐ ์๋ ๋ฌธ์ ์ ๋๋ค.]
๊ฐ๋ฐ์ ์ถ์ ์ผ๋ก ์ธ๊ณ ์ต๊ณ ์ ๊ฐ๋ถ๊ฐ ๋ ์ดํผ์น๋ ์คํธ๋ ์ค๋ฅผ ๋ฐ์ ๋๋ฉด ์ด๋ฅผ ํ๊ธฐ ์ํด ์คํ๋ผ์ธ ๋งค์ฅ์ ์ผํ์ ํ๋ฌ ๊ฐ๊ณค ํฉ๋๋ค. ์ดํผ์น๋ ์ผํ์ ํ ๋๋ฉด ๋งค์ฅ ์ง์ด๋์ ํน์ ๋ฒ์์ ๋ฌผ๊ฑด๋ค์ ๋ชจ๋ ์น์ธ์ด ๊ตฌ๋งคํ๋ ์ต๊ด์ด ์์ต๋๋ค. ์ด๋ ๋ ์คํธ๋ ์ค๋ฅผ ํ๊ธฐ ์ํด ๋ณด์ ๋งค์ฅ์ ์ผํ์ ํ๋ฌ ๊ฐ ์ดํผ์น๋ ์ด์ ์ฒ๋ผ ์ง์ด๋์ ํน์ ๋ฒ์์ ๋ณด์์ ๋ชจ๋ ๊ตฌ๋งคํ๋ ํน๋ณํ ์๋ ๋ชฉ์ ์ ๋ฌ์ฑํ๊ณ ์ถ์์ต๋๋ค.
์ง์ด๋ ๋ชจ๋ ์ข
๋ฅ์ ๋ณด์์ ์ ์ด๋ 1๊ฐ ์ด์ ํฌํจํ๋ ๊ฐ์ฅ ์งง์ ๊ตฌ๊ฐ์ ์ฐพ์์ ๊ตฌ๋งค
์๋ฅผ ๋ค์ด ์๋ ์ง์ด๋๋ 4์ข ๋ฅ์ ๋ณด์(RUBY, DIA, EMERALD, SAPPHIRE) 8๊ฐ๊ฐ ์ง์ด๋ ์์์ ๋๋ค.
์ง์ด๋ ๋ฒํธ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
๋ณด์ ์ด๋ฆ | DIA | RUBY | RUBY | DIA | DIA | EMERALD | SAPPHIRE | DIA |
์ง์ด๋์ 3๋ฒ๋ถํฐ 7๋ฒ๊น์ง 5๊ฐ์ ๋ณด์์ ๊ตฌ๋งคํ๋ฉด ๋ชจ๋ ์ข ๋ฅ์ ๋ณด์์ ์ ์ด๋ ํ๋ ์ด์์ฉ ํฌํจํ๊ฒ ๋ฉ๋๋ค.
์ง์ด๋์ 3, 4, 6, 7๋ฒ์ ๋ณด์๋ง ๊ตฌ๋งคํ๋ ๊ฒ์ ์ค๊ฐ์ ํน์ ๊ตฌ๊ฐ(5๋ฒ)์ด ๋น ์ง๊ฒ ๋๋ฏ๋ก ์ดํผ์น์ ์ผํ ์ต๊ด์ ๋ง์ง ์์ต๋๋ค.
์ง์ด๋ ๋ฒํธ ์์๋๋ก ๋ณด์๋ค์ ์ด๋ฆ์ด ์ ์ฅ๋ ๋ฐฐ์ด gems๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง๋๋ค. ์ด๋ ๋ชจ๋ ๋ณด์์ ํ๋ ์ด์ ํฌํจํ๋ ๊ฐ์ฅ ์งง์ ๊ตฌ๊ฐ์ ์ฐพ์์ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์. ๊ฐ์ฅ ์งง์ ๊ตฌ๊ฐ์ ์์ ์ง์ด๋ ๋ฒํธ์ ๋ ์ง์ด๋ ๋ฒํธ๋ฅผ ์ฐจ๋ก๋๋ก ๋ฐฐ์ด์ ๋ด์์ return ํ๋๋ก ํ๋ฉฐ, ๋ง์ฝ ๊ฐ์ฅ ์งง์ ๊ตฌ๊ฐ์ด ์ฌ๋ฌ ๊ฐ๋ผ๋ฉด ์์ ์ง์ด๋ ๋ฒํธ๊ฐ ๊ฐ์ฅ ์์ ๊ตฌ๊ฐ์ return ํฉ๋๋ค.
๐ฉ์ ํ์ฌํญ
- gems ๋ฐฐ์ด์ ํฌ๊ธฐ๋ 1 ์ด์ 100,000 ์ดํ์
๋๋ค.
- gems ๋ฐฐ์ด์ ๊ฐ ์์๋ ์ง์ด๋์ ๋์ด๋ ๋ณด์์ ๋ํ๋ ๋๋ค.
- gems ๋ฐฐ์ด์๋ 1๋ฒ ์ง์ด๋๋ถํฐ ์ง์ด๋ ๋ฒํธ ์์๋๋ก ๋ณด์์ด๋ฆ์ด ์ฐจ๋ก๋๋ก ์ ์ฅ๋์ด ์์ต๋๋ค.
- gems ๋ฐฐ์ด์ ๊ฐ ์์๋ ๊ธธ์ด๊ฐ 1 ์ด์ 10 ์ดํ์ธ ์ํ๋ฒณ ๋๋ฌธ์๋ก๋ง ๊ตฌ์ฑ๋ ๋ฌธ์์ด์ ๋๋ค.
๐ฉ์ ์ถ๋ ฅ ์
gems | result |
---|---|
[โDIAโ, โRUBYโ, โRUBYโ, โDIAโ, โDIAโ, โEMERALDโ, โSAPPHIREโ, โDIAโ] | [3, 7] |
[โAAโ, โABโ, โACโ, โAAโ, โACโ] | [1, 3] |
[โXYZโ, โXYZโ, โXYZโ] | [1, 1] |
[โZZZโ, โYYYโ, โNNNNโ, โYYYโ, โBBBโ] | [1, 5] |
์ ์ถ๋ ฅ์ ๋ํ ์ค๋ช ์ ํด๋น ์ฌ์ดํธ๋ฅผ ํ์ธํด์ฃผ์ธ์!
๐โโ๏ธ์ ๊ทผ ๋ฐฉ๋ฒ
- ๋์ ์ ๊ทผ ๋ฐฉ๋ฒ(์ค๋ต)
-
์ฒ์ ๋๋ ๊ฐ ๋ณด์๋ง๋ค ์ง์ด๋ ์์ ์์น์ ๋์์น๋ฅผ ๊ตฌํด ๋ฌด์กฐ๊ฑด ํฌํจ๋๋ ๊ตฌ๊ฐ์ ๊ตฌํ๋ ๋ฐฉ์์ผ๋ก ์ ๊ทผํ๋ค.
์ง์ด๋ ๋ฒํธ 1 2 3 4 5 6 7 8 ๋ณด์ ์ด๋ฆ DIA RUBY RUBY DIA DIA EMERALD SAPPHIRE DIA -
์๋ฅผ ๋ค์ด ์ ์์์์ EMERALD์ SAPPHIRE๋ ๊ฐ๊ฐ 1๊ฐ๋ฐ์ ์กด์ฌํ์ง ์์ผ๋ฏ๋ก ํด๋น ์์น๋ ๋ฌด์กฐ๊ฑด ํฌํจ๋์ด์ผ ํ๋ค.
-
์ด๋ ๊ฒ ์ ๊ทผํ์ ๋ ๋ฌธ์ ์ ์ gems ๋ฐฐ์ด์ ๋ชจ๋ ๋์ ๊ฐ ๋ณด์์ ์์น๋ฅผ ํ์ ํด์ผ ํ์ ๋ฟ ์๋๋ผ ๊ฐ ๋ณด์์ ์์, ๋ ์์น๋ฅผ ๋ด์ ๋ฐฐ์ด(str, end)์์ ์ต๋๊ฐ, ์ต์๊ฐ์ ๋น๊ตํด ๊ตฌํ ๊ตฌ๊ฐ์ด ์๋ gems ๋ฐฐ์ด์ ํฌ๊ธฐ๋ณด๋ค ํฌ๊ฒ ์ค์ด๋ค์ง ์์๋ค. ๊ฒฐ๊ตญ gems ๋ฐฐ์ด ์ ์ฒด๋ฅผ ์์ ํ์ํ๋ ๊ฒฐ๊ณผ์ ๋น์ทํ O(N^2)์ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๊ฒ ๋๋ค.
-
- ์ ๊ทผ ๋ฐฉ๋ฒ(ํด๋ต) :
๐ํฌ ํฌ์ธํฐ๐
- ์์ํ๋ ๋ฒ์(left)์ ๋ ๋ฒ์(right)๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ ๊ฐ์ ํฌ์ธํฐ๋ฅผ ๋๊ณ , ๋ชจ๋ ์ง์ด๋ ์ฒ์์ ๊ฐ๋ฆฌํค๊ฒ ํ๋ค.
- ๊ตฌ๊ฐ ์์ ๋ณด์์ ์ข
๋ฅ๋ฅผ ํ์
ํ๋ค.
์ด๋ ๋ฐฐ์ด ์ฌ๋ผ์ด์ฑ์ ์ด์ฉํ ๊ฒฝ์ฐ, ์ฌ๋ผ์ด์ฑ ๋ฒ์๋งํผ์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ ์ข ๋ฅ๋ฅผ ํ์ ํ๊ธฐ ์ํด ๋ณด์์ ์ข ๋ฅ๋ฅผ key๋ก ๊ฐ๋ ๋์ ๋๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค.- 2-1. ๋ฒ์ ์์ ์๋ ๋ณด์์ ์ข ๋ฅ๊ฐ ์ ์ฒด ๋ณด์์ ์ข ๋ฅ๋ณด๋ค ๊ฐ์ ๊ฒฝ์ฐ, left ๊ฐ์ 1์ฉ ์ฆ๊ฐํ๋ฉฐ ํด๋น right์์์ ์ต์ ๊ตฌ๊ฐ(best)์ ๊ตฌํด ํ๋ณด๊ฐ(result)์ ์ถ๊ฐ์ํจ๋ค.
- 2-2. ๋ฒ์ ์์ ์๋ ๋ณด์์ ์ข ๋ฅ๊ฐ ์ ์ฒด ๋ณด์์ ์ข ๋ฅ๋ณด๋ค ์ ์ ๊ฒฝ์ฐ, right๋ฅผ 1 ์ฆ๊ฐ์ํจ๋ค.
- 2-3. left, right ๊ฐ์ด ๋ฐฐ์ด์ ๋๊ธฐ ์ ๊น์ง 2๋ฒ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
- ํ๋ณด๊ฐ ์ค ๊ตฌ๊ฐ์ ํฌ๊ธฐ๊ฐ ๊ฐ์ฅ ์งง์ ๊ฐ์ด ์ ๋ต์ด ๋๋ค. (๊ตฌ๊ฐ์ ํฌ๊ธฐ๊ฐ ๋์ผํ ๊ฒฝ์ฐ, ์์์ด ๋น ๋ฅธ ๊ตฌ๊ฐ์ด ์ ๋ต์ด ๋๋ค.)
๐โโ๏ธ์ฝ๋
from collections import defaultdict
def solution(gems):
num = len(set(gems))
result = []
dic = defaultdict(int)
left = 0
best = 0 # ์ต์ ๊ตฌ๊ฐ์ธ์ง๋ฅผ ๋ํ๋ด๋ ๊ฐ, 0 ๋๋ 1
for right in range(len(gems)):
dic[gems[right]] += 1 # right+1๋ก ์ถ๊ฐ๋๋ ๋ณด์ ํฌํจ
right += 1
while len(dic) == num: # ๊ตฌ๊ฐ์ ๋ณด์ ์ข
๋ฅ๊ฐ ์ ์ฒด ๋ณด์ ์ข
๋ฅ์ ๋์ผํ ๋
dic[gems[left]] -= 1 # left+1์ ์ํด ํด๋น ์์น ๋ณด์ ์ ์ธ
if dic[gems[left]] == 0: # ์๋ ๋ณด์์ ๊ฒฝ์ฐ ์ข
๋ฅ์์ ์ ๊ฑฐ
del dic[gems[left]]
left += 1 # left+1 ์งํ
best = 1 # ์ต์ ๊ตฌ๊ฐ์์ ํ์
if best:
result.append([left, right]) # right์์์ ์ต์ ๊ตฌ๊ฐ์ ํ๋ณด์ ์ถ๊ฐ
best = 0
return sorted(result, key = lambda x: (x[1]-x[0], x[0]))[0]
๐ฉโ๐ป๋ฐฐ์ด ์
collections.defaultdict()
: ๋์ ๋๋ฆฌ ๊ธฐ๋ณธ๊ฐ/์ด๊ธฐ๊ฐ ์ค์ - defaultdict(int): ์ด๊ธฐ ๊ฐ 0
- defaultdict(list): ์ด๊ธฐ ๊ฐ []
- defaultdict(set): ์ด๊ธฐ ๊ฐ ()
- ๋ฐฐ์ด์ ๊ตฌ๊ฐ๋ง๋ค ํน์ ๊ณ์ฐ์ ์งํํด์ผ ํ ๋ ํฌ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ๊ณผ์ ์ด๋ค.
๐โโ๏ธํ์ด์ ๋ถ์กฑํ ๋ถ๋ถ์ด ์๋ค๋ฉด ๋ง์ํด์ฃผ์ธ์! ๊ฐ์ฌํฉ๋๋ค!
๐ ์ฐธ๊ณ
- ๋ฌธ์ ๊ด๋ จ ์ฐธ๊ณ ์๋ฃ
- defaultdict()
๋๊ธ๋จ๊ธฐ๊ธฐ