[Programmers/ level3] ๋ณด์„ ์‡ผํ•‘๐Ÿ™„

3 ๋ถ„ ์†Œ์š”


๐Ÿ‘ฉ๋ฌธ์ œ

[๋ณธ ๋ฌธ์ œ๋Š” ์ •ํ™•์„ฑ๊ณผ ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ ๊ฐ๊ฐ ์ ์ˆ˜๊ฐ€ ์žˆ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.]

๊ฐœ๋ฐœ์ž ์ถœ์‹ ์œผ๋กœ ์„ธ๊ณ„ ์ตœ๊ณ ์˜ ๊ฐ‘๋ถ€๊ฐ€ ๋œ ์–ดํ”ผ์น˜๋Š” ์ŠคํŠธ๋ ˆ์Šค๋ฅผ ๋ฐ›์„ ๋•Œ๋ฉด ์ด๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด ์˜คํ”„๋ผ์ธ ๋งค์žฅ์— ์‡ผํ•‘์„ ํ•˜๋Ÿฌ ๊ฐ€๊ณค ํ•ฉ๋‹ˆ๋‹ค. ์–ดํ”ผ์น˜๋Š” ์‡ผํ•‘์„ ํ•  ๋•Œ๋ฉด ๋งค์žฅ ์ง„์—ด๋Œ€์˜ ํŠน์ • ๋ฒ”์œ„์˜ ๋ฌผ๊ฑด๋“ค์„ ๋ชจ๋‘ ์‹น์“ธ์ด ๊ตฌ๋งคํ•˜๋Š” ์Šต๊ด€์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋Š ๋‚  ์ŠคํŠธ๋ ˆ์Šค๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด ๋ณด์„ ๋งค์žฅ์— ์‡ผํ•‘์„ ํ•˜๋Ÿฌ ๊ฐ„ ์–ดํ”ผ์น˜๋Š” ์ด์ „์ฒ˜๋Ÿผ ์ง„์—ด๋Œ€์˜ ํŠน์ • ๋ฒ”์œ„์˜ ๋ณด์„์„ ๋ชจ๋‘ ๊ตฌ๋งคํ•˜๋˜ ํŠน๋ณ„ํžˆ ์•„๋ž˜ ๋ชฉ์ ์„ ๋‹ฌ์„ฑํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

์ง„์—ด๋œ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๋ณด์„์„ ์ ์–ด๋„ 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)์˜ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.


  • ์ ‘๊ทผ ๋ฐฉ๋ฒ•(ํ•ด๋‹ต) : ๐Ÿ””ํˆฌ ํฌ์ธํ„ฐ๐Ÿ””
    1. ์‹œ์ž‘ํ•˜๋Š” ๋ฒ”์œ„(left)์™€ ๋ ๋ฒ”์œ„(right)๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋‘ ๊ฐœ์˜ ํฌ์ธํ„ฐ๋ฅผ ๋‘๊ณ , ๋ชจ๋‘ ์ง„์—ด๋Œ€ ์ฒ˜์Œ์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•œ๋‹ค.
    2. ๊ตฌ๊ฐ„ ์•ˆ์˜ ๋ณด์„์˜ ์ข…๋ฅ˜๋ฅผ ํŒŒ์•…ํ•œ๋‹ค.
      • ์ด๋•Œ ๋ฐฐ์—ด ์Šฌ๋ผ์ด์‹ฑ์„ ์ด์šฉํ•  ๊ฒฝ์šฐ, ์Šฌ๋ผ์ด์‹ฑ ๋ฒ”์œ„๋งŒํผ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ข…๋ฅ˜๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ๋ณด์„์˜ ์ข…๋ฅ˜๋ฅผ key๋กœ ๊ฐ–๋Š” ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
      • 2-1. ๋ฒ”์œ„ ์•ˆ์— ์žˆ๋Š” ๋ณด์„์˜ ์ข…๋ฅ˜๊ฐ€ ์ „์ฒด ๋ณด์„์˜ ์ข…๋ฅ˜๋ณด๋‹ค ๊ฐ™์„ ๊ฒฝ์šฐ, left ๊ฐ’์„ 1์”ฉ ์ฆ๊ฐ€ํ•˜๋ฉฐ ํ•ด๋‹น right์—์„œ์˜ ์ตœ์†Œ ๊ตฌ๊ฐ„(best)์„ ๊ตฌํ•ด ํ›„๋ณด๊ฐ’(result)์— ์ถ”๊ฐ€์‹œํ‚จ๋‹ค.
      • 2-2. ๋ฒ”์œ„ ์•ˆ์— ์žˆ๋Š” ๋ณด์„์˜ ์ข…๋ฅ˜๊ฐ€ ์ „์ฒด ๋ณด์„์˜ ์ข…๋ฅ˜๋ณด๋‹ค ์ ์„ ๊ฒฝ์šฐ, right๋ฅผ 1 ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
      • 2-3. left, right ๊ฐ’์ด ๋ฐฐ์—ด์„ ๋„˜๊ธฐ ์ „๊นŒ์ง€ 2๋ฒˆ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.
    3. ํ›„๋ณด๊ฐ’ ์ค‘ ๊ตฌ๊ฐ„์˜ ํฌ๊ธฐ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๊ฐ’์ด ์ •๋‹ต์ด ๋œ๋‹ค. (๊ตฌ๊ฐ„์˜ ํฌ๊ธฐ๊ฐ€ ๋™์ผํ•  ๊ฒฝ์šฐ, ์‹œ์ž‘์ด ๋น ๋ฅธ ๊ตฌ๊ฐ„์ด ์ •๋‹ต์ด ๋œ๋‹ค.)


๐Ÿ™‹โ€โ™€๏ธ์ฝ”๋“œ

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): ์ดˆ๊ธฐ ๊ฐ’ ()
  • ๋ฐฐ์—ด์˜ ๊ตฌ๊ฐ„๋งˆ๋‹ค ํŠน์ • ๊ณ„์‚ฐ์„ ์ง„ํ–‰ํ•ด์•ผ ํ•  ๋•Œ ํˆฌ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํšจ๊ณผ์ ์ด๋‹ค.


๐Ÿ™‡โ€โ™€๏ธํ’€์ด์— ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ๋ง์”€ํ•ด์ฃผ์„ธ์š”! ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!


๐Ÿ“ƒ ์ฐธ๊ณ 

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ