[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()
λκΈλ¨κΈ°κΈ°