๊ฐœ๋ฐœ์ผ์ง€

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] level2. ์ˆœ์œ„ ๊ฒ€์ƒ‰- ํŒŒ์ด์ฌ ๋ณธ๋ฌธ

Algorithm๐Ÿ”จ

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] level2. ์ˆœ์œ„ ๊ฒ€์ƒ‰- ํŒŒ์ด์ฌ

doublejune 2025. 4. 12. 23:53

A. ๋ฌธ์ œ์„ค๋ช…

https://school.programmers.co.kr/learn/courses/30/lessons/72412?language=python3

 


 

๊ฐ ๋ฌธ์˜์กฐ๊ฑด์— ํ•ด๋‹นํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์˜ ์ˆซ์ž๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฐ์—ด์— ๋‹ด์•„ returnํ•˜๋ผ.

 

B. ๋‹ต์•ˆ

from itertools import product

def solution(info, query):
    answer = []
    a= list(product(["cpp","java","python",""],["backend", "frontend",""],["junior","senior",""],["chicken", "pizza",""]))
    a = [''.join(i) for i in a]
    d = {i:[] for i in a}
    
    for i in info:
        arr = i.split(' ')
        l= list(product([arr[0],''], [arr[1],''], [arr[2],''], [arr[3],'']))
        l = [''.join(j) for j in l]
        for j in l:
            d[j].append(int(arr[4]))
            
    for i in d.keys():
        d[i].sort()
    
    for q in query:
        q = q.replace(' and ', '').replace('-','')
        q = q.split(' ')
        
        val = binsearch(d[q[0]], int(q[1]))
        answer.append(len(d[q[0]])-val)
    
    # print(binsearch([1,4,6,9,15,20,36], 39))
    
    return answer

def binsearch(arr, val):
    if len(arr) == 0:
        return 0
    if arr[0] >= val:
        return 0
    start = 0
    end = len(arr)
    while start < end-1:
        mid = (start+end)//2
        if arr[mid] < val:
            start = mid
        else :
            end = mid
    return end

 

C. ํšŒ๊ณ  

์†Œ์š”์‹œ๊ฐ„ : 1์‹œ๊ฐ„ 30๋ถ„

 

์ด ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ํ’€์—ˆ๋‹ค.

 

1.์ง€์›์ž ์ •๋ณด ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ๋Š” ๋”•์…”๋„ˆ๋ฆฌ ์ƒ์„ฑ : 4x3x3x3 ์กฐํ•ฉ์œผ๋กœ .

2.์ง€์›์ž ์ •๋ณด ๊ธฐ๋ก : info ์ˆœํšŒํ•˜๋ฉฐ ์กฐํ•ฉ์ƒ์„ฑํ•˜๊ณ  ๊ธฐ๋ก.

3.์กฐ๊ฑด์— ๋งž๋Š” ์ง€์›์ž ์ˆ˜ ์ฐพ๊ธฐ: query์ˆœํšŒํ•˜๋ฉฐ.

4.์ง€์›์ž ์ˆ˜ ํšจ์œจ์ ์œผ๋กœ ์ฐพ๊ธฐ: ์ด๋ถ„ํƒ์ƒ‰ ์‚ฌ์šฉ.

 

- 1, 2๋ฒˆ์€ product๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ๋‹ค๋งŒ, info๋˜ํ•œ ์กฐํ•ฉ์„ ๊ตฌํ•ด์„œ ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฑธ ๋†“์ณ์„œ ์ข€ ํ•ด๋งธ๋‹ค.

- 4๋ฒˆ์—์„œ ์ข€ ์˜ค๋ž˜ ๊ฑธ๋ ธ๋‹ค. ์ด๋ถ„ํƒ์ƒ‰์„ ์Šค์Šค๋กœ ๊ตฌํ˜„ํ•ด๋ณด์•˜๋‹ค. ๋””๋ฒ„๊น…ํ•ด๊ฐ€๋ฉด์„œ ์˜ˆ์™ธ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•ด ์šด ์ข‹๊ฒŒํ†ต๊ณผํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์ด๋ถ„ํƒ์ƒ‰์„ ์™„๋ฒฝํžˆ ์•„๋Š”๊ฒƒ์ด ์•„๋‹ˆ์–ด์„œ ์ข€ ๋” ์ดํ•ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ํŠนํžˆ, ์˜ˆ์™ธ์ฒ˜๋ฆฌ(arr ๊ธธ์ด๊ฐ€ 0์ผ ๋•Œ, arr์˜ ๋งˆ์ง€๋ง‰ ์›์†Œ๋ณด๋‹ค ์ฐพ์œผ๋ ค๋Š” ๊ฐ’์ด ํด ๋•Œ)๋ถ€๋ถ„์ด ์ œ์ผ ๊นŒ๋‹ค๋กœ์› ๊ณ , ์ด ๋ถ€๋ถ„์€ ๋””๋ฒ„๊น…์ด ์•„๋‹ˆ์—ˆ์œผ๋ฉด ์ฐพ๊ธฐ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ–ˆ์„ ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋ž˜๋„, ์ ์ฐจ ์‹ค๋ ฅ์ด ์ข‹์•„์ง€๊ณ  ์žˆ๋Š”๊ฑธ ๋А๋‚€๋‹ค. '์ด๋ ‡๊ฒŒ ํ’€๋ฉด ๋˜๊ฒ ๋‹ค'๋ผ๊ณ  ๋– ์˜ค๋ฅธ ์•„์ด๋””์–ด๊ฐ€ ๋Œ€๋ถ€๋ถ„ ๋“ค์–ด๋งž๋Š”๋‹ค. ๋ฌธ์ œ ์œ ํ˜•์˜ ํŒจํ„ด์ด ๋ฐ˜๋ณต๋˜์–ด์„œ ๊ทธ๋Ÿฐ ๋“ฏ ํ•˜๋‹ค.

 

D. ๊ฐœ์„ 

 

from itertools import product

def solution(info, query):
    answer = []
    #1.์ง€์›์ž ์ •๋ณด ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ๋Š” ๋”•์…”๋„ˆ๋ฆฌ ์ƒ์„ฑ : 4x3x3x3 ์กฐํ•ฉ์œผ๋กœ 
    a= list(product(["cpp","java","python",""],["backend", "frontend",""],["junior","senior",""],["chicken", "pizza",""]))
    d = {i:[] for i in a}
    
    #2.์ง€์›์ž ์ •๋ณด ๊ธฐ๋ก
    for i in info:
        arr = i.split(' ')
        l= list(product([arr[0],''], [arr[1],''], [arr[2],''], [arr[3],'']))
        
        for j in l:
            d[j].append(int(arr[4]))
            
    for i in d.keys():
        d[i].sort()
    
    #3.์กฐ๊ฑด์— ๋งž๋Š” ์ง€์›์ž ์ˆ˜ ์ฐพ๊ธฐ: query์ˆœํšŒํ•˜๋ฉฐ
    for q in query:
        q = q.replace(' and', '').replace('-','')
        q = tuple(q.split(' '))
        
        arr = d[q[0:4]]
        value = int(q[4])
        #4.์ง€์›์ž ์ˆ˜ ํšจ์œจ์ ์œผ๋กœ ์ฐพ๊ธฐ: ๋ฐ”์ด๋„ˆ๋ฆฌ์„œ์น˜์‚ฌ์šฉ
        index = 0
        if len(arr) == 0:
            1==1
        elif arr[-1] < value:
            index = len(arr)
        else:
            index = binsearch(arr, int(q[4]), 0, len(arr)-1)
        
        answer.append(len(arr)-index)
        
    #๋””๋ฒ„๊น…์šฉ print(binsearch([1, 3, 9, 9, 9, 11, 13, 15, 19, 21, 25, 28], 29, 0, 11))
        
    return answer

def binsearch(arr, score, left, right):
    if left == right:
        return left
    mid = (left+right)//2
    if arr[mid]<score:
        return binsearch(arr, score, mid+1, right)
    else:
        return binsearch(arr, score, left, mid)

 

1. ๋”•์…”๋„ˆ๋ฆฌ์˜ key๊ฐ’์„ ๊ตณ์ด ์ŠคํŠธ๋ง์œผ๋กœ ํ•  ํ•„์š”๊ฐ€ ์—†์—ˆ๋‹ค. key๊ฐ’์œผ๋กœ ๋ถˆ๋ณ€๊ฐ’์€ ๋ชจ๋‘ ๊ฐ€๋Šฅํ•˜๋‹ˆ, tuple์„ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ฝ”๋“œ๊ฐ€ ๋” ๊ฐ„๋‹จํ•ด์ง„๋‹ค.

 

2. ๋ฐ”์ด๋„ˆ๋ฆฌ ์„œ์น˜๋ฅผ ์žฌ๊ท€์‹์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ๋” ๊ฐ„์†Œํ•ด์กŒ๋‹ค. ์ด ๋ถ€๋ถ„์€ ์–ด๋А์ •๋„ ์™ธ์šฐ๋Š”๊ฒŒ ํ•„์š”ํ•ด๋ณด์ธ๋‹ค.

 

3. ๋””๋ฒ„๊น… ํ•ด๋ณด๋ฉด์„œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•ด ๋‚ด๋Š” ๊ณผ์ •์—๋„ ์ต์ˆ™ํ•ด์ ธ์•ผ๊ฒ ๋‹ค.