๐ŸŒžAlgorithm/๐Ÿ”ฅprogrammers

[programmers] [1์ฐจ] ์บ์‹œ - 2018 KAKAO BLIND RECRUITMENT

๋ฟŒ์•ผ._. 2021. 1. 19. 14:49

์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ์—ฐ์Šต - 2018 KAKAO BLIND RECRUITMENT


<[1์ฐจ] ์บ์‹œ>

๋ฌธ์ œ ์„ค๋ช…

 

์ง€๋„๊ฐœ๋ฐœํŒ€์—์„œ ๊ทผ๋ฌดํ•˜๋Š” ์ œ์ด์ง€๋Š” ์ง€๋„์—์„œ ๋„์‹œ ์ด๋ฆ„์„ ๊ฒ€์ƒ‰ํ•˜๋ฉด ํ•ด๋‹น ๋„์‹œ์™€ ๊ด€๋ จ๋œ ๋ง›์ง‘ ๊ฒŒ์‹œ๋ฌผ๋“ค์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ฝ์–ด ๋ณด์—ฌ์ฃผ๋Š” ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ๋‹ค.
์ด ํ”„๋กœ๊ทธ๋žจ์˜ ํ…Œ์ŠคํŒ… ์—…๋ฌด๋ฅผ ๋‹ด๋‹นํ•˜๊ณ  ์žˆ๋Š” ์–ดํ”ผ์น˜๋Š” ์„œ๋น„์Šค๋ฅผ ์˜คํ”ˆํ•˜๊ธฐ ์ „ ๊ฐ ๋กœ์ง์— ๋Œ€ํ•œ ์„ฑ๋Šฅ ์ธก์ •์„ ์ˆ˜ํ–‰ํ•˜์˜€๋Š”๋ฐ, ์ œ์ด์ง€๊ฐ€ ์ž‘์„ฑํ•œ ๋ถ€๋ถ„ ์ค‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฒŒ์‹œ๋ฌผ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ถ€๋ถ„์˜ ์‹คํ–‰์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.
์–ดํ”ผ์น˜๋Š” ์ œ์ด์ง€์—๊ฒŒ ํ•ด๋‹น ๋กœ์ง์„ ๊ฐœ์„ ํ•˜๋ผ๊ณ  ๋‹ฆ๋‹ฌํ•˜๊ธฐ ์‹œ์ž‘ํ•˜์˜€๊ณ , ์ œ์ด์ง€๋Š” DB ์บ์‹œ๋ฅผ ์ ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์‹œ๋„ํ•˜๊ณ  ์žˆ์ง€๋งŒ ์บ์‹œ ํฌ๊ธฐ๋ฅผ ์–ผ๋งˆ๋กœ ํ•ด์•ผ ํšจ์œจ์ ์ธ์ง€ ๋ชฐ๋ผ ๋‚œ๊ฐํ•œ ์ƒํ™ฉ์ด๋‹ค.

์–ดํ”ผ์น˜์—๊ฒŒ ์‹œ๋‹ฌ๋ฆฌ๋Š” ์ œ์ด์ง€๋ฅผ ๋„์™€, DB ์บ์‹œ๋ฅผ ์ ์šฉํ•  ๋•Œ ์บ์‹œ ํฌ๊ธฐ์— ๋”ฐ๋ฅธ ์‹คํ–‰์‹œ๊ฐ„ ์ธก์ • ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

 

์ž…๋ ฅ ํ˜•์‹

 

- ์บ์‹œ ํฌ๊ธฐ(cacheSize)์™€ ๋„์‹œ ์ด๋ฆ„ ๋ฐฐ์—ด(cities)์„ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.
- cacheSize๋Š” ์ •์ˆ˜์ด๋ฉฐ, ๋ฒ”์œ„๋Š” 0 โ‰ฆ cacheSize โ‰ฆ 30 ์ด๋‹ค.
- cities๋Š” ๋„์‹œ ์ด๋ฆ„์œผ๋กœ ์ด๋ค„์ง„ ๋ฌธ์ž์—ด ๋ฐฐ์—ด๋กœ, ์ตœ๋Œ€ ๋„์‹œ ์ˆ˜๋Š” 100,000๊ฐœ์ด๋‹ค.
- ๊ฐ ๋„์‹œ ์ด๋ฆ„์€ ๊ณต๋ฐฑ, ์ˆซ์ž, ํŠน์ˆ˜๋ฌธ์ž ๋“ฑ์ด ์—†๋Š” ์˜๋ฌธ์ž๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋„์‹œ ์ด๋ฆ„์€ ์ตœ๋Œ€ 20์ž๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

 

 

์ถœ๋ ฅ ํ˜•์‹

 

- ์ž…๋ ฅ๋œ ๋„์‹œ ์ด๋ฆ„ ๋ฐฐ์—ด์„ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•  ๋•Œ, ์ด ์‹คํ–‰์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

์กฐ๊ฑด

 

- ์บ์‹œ ๊ต์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ LRU(Least Recently Used)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
- cache hit์ผ ๊ฒฝ์šฐ ์‹คํ–‰์‹œ๊ฐ„์€ 1์ด๋‹ค.
- cache miss์ผ ๊ฒฝ์šฐ ์‹คํ–‰์‹œ๊ฐ„์€ 5์ด๋‹ค.

 

๋ฌธ์ œ ํ’€์ด

   - my solution

 

def solution(cacheSize, cities):
    answer = 0
    
    result=[]
    
    for i in range(len(cities)):
        cities[i]=cities[i].lower() #๋Œ€๋ฌธ์ž, ์†Œ๋ฌธ์ž ์ƒ๊ด€ x
        if(cacheSize==0): #cacheSize๊ฐ€ 0์ด๋ฉด ๋‹ค ์‹คํ–‰ ์‹œ๊ฐ„ 5
            answer=len(cities)*5
            break
        if(cities[i] in result): #๊ฐ’์ด ์žˆ์œผ๋ฉด
            result.pop(result.index(cities[i]))
            result.append(cities[i]) #๋งจ ๋์œผ๋กœ 
            answer+=1 # 1
        else:
            if(len(result)==cacheSize): #์บ์‹œ ํฌ๊ธฐ๋งŒํผ ๋‹ค ์ฑ„์›Œ์ ธ์žˆ์œผ๋ฉด
                result.pop(0) #์ œ์ผ ์•ˆ์“ฐ๋Š” ๊ฒƒ pop
            answer+=5 #5
            result.append(cities[i])

    return answer

  ์ด ๋ฌธ์ œ์—์„œ ์บ์‹œ ๊ต์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ LRU(Least Recently Used)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 

  LRU ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•˜์ž๋ฉด ์ œ์ผ ์˜ค๋žซ๋™์•ˆ ์ฐธ์กฐ๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ์‹์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

  ์ฒ˜์Œ์—๋Š” ์ด ๋ฌธ์ œ๋ฅผ dict๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•˜๋ ค ํ–ˆ์ง€๋งŒ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋‹ค ๋ณด๋‹ˆ ๋‹จ์ˆœ list๋กœ ๊ฐ€๋Šฅํ•  ๊ฒƒ ๊ฐ™์•„ 

  ๋‹ค์‹œ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

 

  1) cities list ์ˆœํšŒ

     1-1) ๋Œ€๋ฌธ์ž, ์†Œ๋ฌธ์ž ์ƒ๊ด€์ด ์—†์œผ๋ฏ€๋กœ ์†Œ๋ฌธ์ž๋กœ ๋‹ค ๋ฐ”๊ฟ”์„œ ์ €์žฅ

     1-2) cacheSize๊ฐ€ 0์ด๋ฉด ์ €์žฅํ•  ๊ณณ์ด ์—†์–ด ๋‹ค miss์ด๋ฏ€๋กœ cities์˜ ๊ธธ์ด๋งŒํผ 5๋ฅผ ๊ณฑํ•œ ํ›„ ์ข…๋ฃŒ

     1-3) list ์•ˆ์— ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ์ด๋ฏธ ํ•œ๋ฒˆ ์“ด ์ ์ด ์žˆ์–ด ์บ์‹œ ์•ˆ์— ์žˆ๋‹ค๋Š” ๋œป

             -> ์ตœ๊ทผ์— ์‚ฌ์šฉํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ๋ฆฌ์ŠคํŠธ์˜ ๋งจ ๋’ค๋กœ ๋ณด๋ƒ„

             -> hit ์ด๋ฏ€๋กœ ์‹คํ–‰์‹œ๊ฐ„ 1 ์ถ”๊ฐ€

     1-4) list ์•ˆ์— ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ

            1-4-1) ์บ์‹œ ํฌ๊ธฐ๋งŒํผ ์บ์‹œ๊ฐ€ ๋‹ค ์ฐจ์žˆ์œผ๋ฉด -> ์ œ์ผ ์•ˆ ์“ฐ๋Š” ๊ฒƒ์€ ๋งจ ์•ž์„ ์˜๋ฏธํ•˜๋ฏ€๋กœ ๋งจ ์•ž ๊ฐ’ pop

            1-4-2) miss๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฏ€๋กœ ์‹คํ–‰์‹œ๊ฐ„ 5 ์ถ”๊ฐ€

            1-4-3) ์บ์‹œ์— ์ €์žฅ


์ถœ์ฒ˜: ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ์—ฐ์Šต, https://programmers.co.kr/learn/challenges