πŸ“Œ 파이썬 μœΌλ‘œ 풀이

 

πŸ“Œ λ¬Έμ œ 링크 :

 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

μ½”λ“œ μ€‘μ‹¬μ˜ 개발자 μ±„μš©. μŠ€νƒ 기반의 ν¬μ§€μ…˜ λ§€μΉ­. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ 개발자 λ§žμΆ€ν˜• ν”„λ‘œν•„μ„ λ“±λ‘ν•˜κ³ , λ‚˜μ™€ 기술 ꢁ합이 잘 λ§žλŠ” 기업듀을 λ§€μΉ­ λ°›μœΌμ„Έμš”.

programmers.co.kr

 

πŸ“Œ λ¬Έμ œ μ„€λͺ… :

μ§€λ„κ°œλ°œνŒ€μ—μ„œ κ·Όλ¬΄ν•˜λŠ” μ œμ΄μ§€λŠ” μ§€λ„μ—μ„œ λ„μ‹œ 이름을 κ²€μƒ‰ν•˜λ©΄ ν•΄λ‹Ή λ„μ‹œμ™€ κ΄€λ ¨λœ λ§›μ§‘ κ²Œμ‹œλ¬Όλ“€μ„ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 읽어 λ³΄μ—¬μ£ΌλŠ” μ„œλΉ„μŠ€λ₯Ό κ°œλ°œν•˜κ³  μžˆλ‹€.
이 ν”„λ‘œκ·Έλž¨μ˜ ν…ŒμŠ€νŒ… 업무λ₯Ό λ‹΄λ‹Ήν•˜κ³  μžˆλŠ” μ–΄ν”ΌμΉ˜λŠ” μ„œλΉ„μŠ€λ₯Ό μ˜€ν”ˆν•˜κΈ° μ „ 각 λ‘œμ§μ— λŒ€ν•œ μ„±λŠ₯ 츑정을 μˆ˜ν–‰ν•˜μ˜€λŠ”λ°, μ œμ΄μ§€κ°€ μž‘μ„±ν•œ λΆ€λΆ„ 쀑 λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ κ²Œμ‹œλ¬Όμ„ κ°€μ Έμ˜€λŠ” λΆ€λΆ„μ˜ μ‹€ν–‰μ‹œκ°„μ΄ λ„ˆλ¬΄ 였래 κ±Έλ¦°λ‹€λŠ” 것을 μ•Œκ²Œ λ˜μ—ˆλ‹€.
μ–΄ν”ΌμΉ˜λŠ” μ œμ΄μ§€μ—κ²Œ ν•΄λ‹Ή λ‘œμ§μ„ κ°œμ„ ν•˜λΌκ³  λ‹¦λ‹¬ν•˜κΈ° μ‹œμž‘ν•˜μ˜€κ³ , μ œμ΄μ§€λŠ” DB μΊμ‹œλ₯Ό μ μš©ν•˜μ—¬ μ„±λŠ₯ κ°œμ„ μ„ μ‹œλ„ν•˜κ³  μžˆμ§€λ§Œ μΊμ‹œ 크기λ₯Ό μ–Όλ§ˆλ‘œ ν•΄μ•Ό νš¨μœ¨μ μΈμ§€ λͺ°λΌ λ‚œκ°ν•œ 상황이닀.
μ–΄ν”ΌμΉ˜μ—κ²Œ μ‹œλ‹¬λ¦¬λŠ” μ œμ΄μ§€λ₯Ό 도와, DB μΊμ‹œλ₯Ό μ μš©ν•  λ•Œ μΊμ‹œ 크기에 λ”°λ₯Έ μ‹€ν–‰μ‹œκ°„ μΈ‘μ • ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

πŸ“Œ μ œν•œ 사항

  • μΊμ‹œ 크기(cacheSize)와 λ„μ‹œμ΄λ¦„ λ°°μ—΄(cities)을 μž…λ ₯λ°›λŠ”λ‹€.
  • cacheSizeλŠ” μ •μˆ˜μ΄λ©°, λ²”μœ„λŠ” 0 ≦ cacheSize β‰¦ 30 이닀.
  • citiesλŠ” λ„μ‹œ μ΄λ¦„μœΌλ‘œ 이뀄진 λ¬Έμžμ—΄ λ°°μ—΄λ‘œ, μ΅œλŒ€ λ„μ‹œ μˆ˜λŠ” 100,000κ°œμ΄λ‹€.
  • 각 λ„μ‹œ 이름은 곡백, 숫자, 특수문자 등이 μ—†λŠ” 영문자둜 κ΅¬μ„±λ˜λ©°, λŒ€μ†Œλ¬Έμž ꡬ뢄을 ν•˜μ§€ μ•ŠλŠ”λ‹€. λ„μ‹œ 이름은 μ΅œλŒ€ 20자둜 이루어져 μžˆλ‹€.

πŸ“Œ 좜λ ₯ ν˜•μ‹

  • μž…λ ₯된 λ„μ‹œμ΄λ¦„ 배열을 μˆœμ„œλŒ€λ‘œ μ²˜λ¦¬ν•  λ•Œ, "총 μ‹€ν–‰μ‹œκ°„"을 좜λ ₯ν•œλ‹€.

πŸ“Œ μ‘°κ±΄

  • μΊμ‹œ ꡐ체 μ•Œκ³ λ¦¬μ¦˜μ€ LRU(Least Recently Used)λ₯Ό μ‚¬μš©ν•œλ‹€.
  • cache hit일 경우 μ‹€ν–‰μ‹œκ°„μ€ 1이닀.
  • cache miss일 경우 μ‹€ν–‰μ‹œκ°„μ€ 5이닀.

 

πŸ“Œ μž…μΆœλ ₯ 예

 


μΆ”μΈ‘) 

μ•— 이번 λ¬Έμ œλŠ” 일단 μΊμ‹œ ꡐ체 μ•Œκ³ λ¦¬μ¦˜ LRU(Least Recently Used) 이거 λΆ€ν„° μ•Œμ•„μ•Ό ν•  κ±° κ°™μ•„μ„œ 곡뢀! 

 

LRUλŠ” νŽ˜μ΄μ§• κΈ°λ²•μœΌλ‘œ λ©”λͺ¨λ¦¬λ₯Ό κ΄€λ¦¬ν•˜λŠ” μš΄μ˜μ²΄μ œμ—μ„œ νŽ˜μ΄μ§€ λΆ€μž¬κ°€ λ°œμƒν–ˆμ„ λ•Œ μƒˆλ‘œμš΄ νŽ˜μ΄μ§€λ₯Ό ν• λ‹Ήν•˜κΈ° μœ„ν•΄ ν˜„μž¬ ν• λ‹Ήλœ νŽ˜μ΄μ§€ 쀑 μ–΄λŠκ²ƒκ³Ό ꡐ체 ν• μ§€λ₯Ό κ²°μ •ν•˜λŠ” 방법이닀. 

LRUλŠ” κ°€μž₯ μ˜€λž«λ™μ•ˆ μ°Έμ‘°λ˜μ§€ μ•Šμ€ νŽ˜μ΄μ§€λ₯Ό κ΅μ²΄ν•˜λŠ” 방식을 λ§ν•œλ‹€. 

 

μ˜ˆμ‹œλ‘œ 

cacheSize = 3 

cities = ["Jeju", "Pangyo", "Seoul", "Jeju", "New york", "Seoul", "Busan", "Chuncheon", "Jeju"]

1 2 3 4 5
Jeju Jeju Jeju Jeju Jeju
  Pangyo Pangyo Pangyo New york
    Seoul Seoul Seoul
  1. 일단 처음 Jejuλ₯Ό μ°Έμ‘°λ₯Ό ν•˜λ €κ³  ν•˜λŠ”λ° νŽ˜μ΄μ§€λ“€μ΄ ν……ν…… λΉ„μ–΄μžˆλ‹€. (cache miss λ°œμƒ, μ‹œκ°„+5 = μ΄μ‹œκ°„ 5)
    Jejuλ₯Ό ν• λ‹Ήν•œλ‹€. 
  2. Pangyo λ˜ν•œ μ—†λ‹€ (cache miss λ°œμƒ, μ‹œκ°„+5 = μ΄μ‹œκ°„ 10)
  3. Seoul λ˜ν•œ μ—†λ‹€ (cache miss λ°œμƒ, μ‹œκ°„+5 = μ΄μ‹œκ°„ 15)
  4. νŽ˜μ΄μ§€λ“€ 3κ°œκ°€ ν• λ‹Ήλ˜κ³  λ‚˜μ„œ Jejuλ₯Ό μ‘°νšŒν•˜λ € ν•˜λ‹ˆ 였! μΌμΉ˜ν•˜λŠ” 게 μžˆλ‹€. (cache hit λ°œμƒ, μ‹œκ°„+1 = μ΄μ‹œκ°„ 16)
    이미 μΊμ‹±λ˜μ–΄ 있던걸 μ°Έμ‘°ν–ˆμœΌλ‹ˆ νŽ˜μ΄μ§€μ— λ³€ν™”λŠ” μ—†λ‹€. 
  5. 이제 New york을 μ‘°νšŒν•˜λ € ν•˜λŠ”λ° νŽ˜μ΄μ§€μ— New york이 μ—†λ‹€. (cache miss λ°œμƒ, μ‹œκ°„+5 = μ΄μ‹œκ°„ 21)
    μ΄μ œλΆ€ν„°κ°€ 문제인데 μ—¬κΈ°μ„œ New york을 μƒˆλ‘œμš΄ νŽ˜μ΄μ§€λ‘œ 할당을 ν•΄μ€˜μ•Ό ν•˜λŠ”λ° μ–΄λ–€κ±°λž‘ λ°”κΎΈμ§€? κ°€ μ€‘μš”ν•œκ±°λ‹€.
    그리고 μ‘°κ±΄μ—μ„œ κ·Έκ±Έ LRU둜 μ •ν•΄μ€€κ±°κ³ .. LRUλŠ” κ°€μž₯ μ˜€λž«λ™μ•ˆ μ°Έμ‘°λ˜μ§€ μ•Šμ€ νŽ˜μ΄μ§€λž‘ κ΅μ²΄ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ νŽ˜μ΄μ§€λ“€ 쀑 κ°€μž₯ 였래된 νŽ˜μ΄μ§€λ₯Ό μ°ΎλŠ”λ‹€. 
    Jejuκ°€ λ¨Όμ € λ“€μ–΄μ™”μœΌλ‹ˆ Jejuκ°€ κ°€μž₯ 였래된 걸까? No! 4λ²ˆμ—μ„œ JejuλŠ” ν•œλ²ˆ μƒˆλ‘­κ²Œ μ°Έμ‘°λ˜μ–΄ μ‹œκ°„μ΄ 갱신됬닀. κ·Έλž˜μ„œ ν˜„μž¬ κ°€μž₯ 빨리 참쑰된 νŽ˜μ΄μ§€λ‘œ λ°”λ€Œμ–΄ κ²°κ΅­ 2번째둜 듀어와 ν•œλ²ˆλ„ μ°Έμ‘° μ•ˆλœ Pangyoκ°€ κ°€μž₯ 였래된 νŽ˜μ΄μ§€κ°€ λœλ‹€.
    λ”°λΌμ„œ Pangyo > New york이 λœλ‹€. 

μ΄λŸ°μ‹μœΌλ‘œ μΊμ‹œκ°€ λΉ„μ–΄μžˆμ„ 땐 λͺ¨λ‘ μ±„μ›Œμ£Όκ³ , λͺ¨λ‘ μ±„μ›Œμ§„ μ΄ν›„μ—λŠ” 졜근 참쑰된 μ‹œκ°„μ„ 비ꡐ해 κ΅μ²΄ν•΄μ£ΌλŠ” λ°©μ‹μœΌλ‘œ μ§„ν–‰ν•˜λ©΄ λœλ‹€. 

 


이걸 이제 둜직으둜 짜보자.

배열을 μ‚¬μš©ν•΄ 배열이 0번이 κ°€μž₯ 였래된 νŽ˜μ΄μ§€μ— ν•΄λ‹Ήν•˜λ„λ‘ 짜보렀고 ν•œλ‹€. 

 

  1. + μΊμ‹œκ°€ 0이면 cities 수만큼 *5 ν•΄μ„œ λ°”λ‘œ 리턴
  2. 일단 빈 μΊμ‹œ 배열을 ν•˜λ‚˜ λ§Œλ“ λ‹€.
  3. cities둜 for문을 λŒλ¦°λ‹€.
  4. λ„μ‹œ 이름을 λ°°μ—΄μ—μ„œ ν•˜λ‚˜ μ”© κ°€μ Έμ˜€κ³  μΊμ‹œ 배열에 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•œλ‹€.
  5. 있으면, μ‹œκ°„+1 ν•˜κ³ , ν•΄λ‹Ή 인덱슀λ₯Ό pop λ°°μ—΄ 끝에 λ‹€μ‹œ append ν•œλ‹€. (μ°Έμ‘°μ‹œκ°„ μ—…λ°μ΄νŠΈ κ°œλ…μœΌλ‘œ)
  6. μ—†μœΌλ©΄, μ‹œκ°„+5 ν•˜κ³ 
    1. μΊμ‹œ 배열이 μΊμ‹œ μ‚¬μ΄μ¦ˆ 보닀 μž‘μ€ 경우, μƒˆλ‘œμš΄ λ„μ‹œλ₯Ό 배열에 κ·Έλƒ₯ append ν•œλ‹€.
    2. μΊμ‹œ 배열이 μΊμ‹œ μ‚¬μ΄μ¦ˆ 보닀 큰 경우, 0번 인덱슀λ₯Ό popν•΄ μ—†μ• κ³ , μƒˆλ‘œμš΄ λ„μ‹œλ₯Ό 배열에 append ν•œλ‹€.
  7. 이런 μ‹μœΌλ‘œ for문을 μ’…λ£Œν•˜λ©΄ λˆ„μ  μ‹œκ°„μ„ λ¦¬ν„΄ν•œλ‹€.

 

 

μ†ŒμŠ€μ½”λ“œ) 

* 1μ°¨) 

def firstCache(cacheSize, cities):

    if cacheSize == 0 :
        return len(cities) * 5

    cache_list = []
    time = 0
    for city in cities:
        city = city.lower()
        if city in cache_list:
            time += 1
            cache_list.append(cache_list.pop(cache_list.index(city)))
        else :
            time += 5

            if len(cache_list) < cacheSize :
                cache_list.append(city)
            else :
                cache_list.pop(0)
                cache_list.append(city)

    return time

 

리뷰) 

CS μ§€μ‹κΉŒμ§€ ν•„μš”ν–ˆλ˜ 문제 ν—ˆν—ˆν—›

덕뢄에 지식 ν•˜λ‚˜ 더 μΆ”κ°€ ν–ˆλ‹€.

LRU 방식을 κ³΅λΆ€ν•˜κ³  슀슀둜 μ˜ˆμ‹œλ₯Ό ν•œλ²ˆ λ§Œλ“€μ–΄λ³΄λ‹ˆ 둜직 μ§œλŠ” 건 μ‰¬μ—ˆλ‹€. 

'Coding Test > Algorithm' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

μˆœμ—΄  (0) 2023.03.18
Programmers] 멀리 λ›°κΈ°  (0) 2023.03.18
Programmers] κ΄„ν˜Έ νšŒμ „ν•˜κΈ°  (0) 2023.03.14
Programmers] μ΅œμ†Ÿκ°’ λ§Œλ“€κΈ°  (0) 2023.03.13
Programmers] N개의 μ΅œμ†Œκ³΅λ°°μˆ˜  (0) 2023.03.07

+ Recent posts