๐Ÿค–/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค | Lv2] ์ˆœ์œ„ ๊ฒ€์ƒ‰ (Python) - 2021 KAKAO BLIND RECRUITMENT

sssbin 2023. 3. 5. 15:46

 

https://school.programmers.co.kr/learn/courses/30/lessons/72412

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

๊ฐ info์— ๋Œ€ํ•ด ํƒ์ƒ‰๋  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด [java, backend, junior, pizza]์˜ ์„ ํƒ์„ ๊ฐ€์ง„ ์‚ฌ๋žŒ์ด ์žˆ๋‹ค๋ฉด,

[java, backend, junior, pizza],

[-, backend, junior, pizza],

[java, -, junior, pizza],

...

[-, -, -, -]

๐Ÿ‘†์œ„์˜ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

 

๊ทธ ํ›„ query๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ์ •๋‹ต์„ ํ•˜๋‚˜์”ฉ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

# ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค 72412: ์ˆœ์œ„ ๊ฒ€์ƒ‰ (2021 KAKAO BLIND RECRUITMENT)

from itertools import combinations

def solution(info, query):
    answer = [0] * len(query)
    
    dic = {("-", "-", "-", "-"): []}
    for i in info:
        i = i.split()

        pick = tuple(i[:4])
        score = int(i[4])
        
        if pick in dic:
            dic[pick].append(score)            
        else:
            dic[pick] = [score]

        dic[("-", "-", "-", "-")].append(score)

        for j in range(1, 4):
            combi = list(combinations(range(4), j))
            for c in combi:
                tmp = ["-"] * 4
                for k in list(c):
                    tmp[k] = i[k]
                tmp = tuple(tmp)
                
                if tmp in dic:
                    dic[tmp].append(score)
                else:
                    dic[tmp] = [score]
    
    for i in range(len(query)):
        q = query[i].replace("and", "").split()
        con = tuple(q[:4])
        sc = int(q[4])
        
        if con in dic:
            for s in dic[con]:
                if s >= sc:
                    answer[i] += 1
        
    return answer

 

์ •ํ™•์„ฑ ํ…Œ์ŠคํŠธ๋Š” ํ†ต๊ณผํ–ˆ์ง€๋งŒ, ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ์—์„œ ์‹คํŒจํ–ˆ๋‹ค.

 

๊ฐ info์— ๋Œ€ํ•ด ํƒ์ƒ‰๋  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋ถ€๋ถ„์„ ์กฐ๊ธˆ ๋‹ค๋“ฌ์—ˆ๊ณ ,

(before - ์ง์ ‘ ("-", "-", "-", "-") ๋“ฑ์˜ ํŠœํ”Œ์„ ๋งŒ๋“ค์–ด์„œ ๋„ฃ์–ด์คŒ

after - combinations์˜ ๋ฒ”์œ„๋ฅผ ๋Š˜๋ ค ํ•ด๋‹น ํŠœํ”Œ ์ž์ฒด๋ฅผ ๋„ฃ์–ด์คŒ)

๋”•์…”๋„ˆ๋ฆฌ ๋‚ด์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ

๋ชฉํ‘œ ์ ์ˆ˜๋ณด๋‹ค ์ž‘์œผ๋ฉด ๋ฐ”๋กœ ๋ฐ˜๋ณต๋ฌธ์„ ๋น ์ ธ๋‚˜์˜ค๋„๋ก ํ–ˆ๋‹ค.

 

# ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค 72412: ์ˆœ์œ„ ๊ฒ€์ƒ‰ (2021 KAKAO BLIND RECRUITMENT)

 from itertools import combinations

 def solution(info, query):
     answer = [0] * len(query)

     dic = {}
     for i in info:
         i = i.split()
         pick = tuple(i[:4])
         score = int(i[4])

         for j in range(5):
             combi = list(combinations(pick, j))
             for c in combi:
                 if c in dic:
                     dic[c].append(score)
                 else:
                     dic[c] = [score]

     for key in dic:
         dic[key].sort(reverse = True)

     for i in range(len(query)):
         q = query[i].replace("and", "").replace("-", "").split()

         if len(q) == 1:
             con = ()
         else:
             con = tuple(q[:-1])

         sc = int(q[-1])

         if con in dic:
             for s in dic[con]:
                 if s < sc:
                     break
                 answer[i] += 1

     return answer

 

์—ฌ์ „ํžˆ ์‹œ๊ฐ„ ์ดˆ๊ณผ

๊ทธ๋ž˜์„œ ์ด์ง„ ํƒ์ƒ‰์„ ๋„์ž…ํ–ˆ๋‹ค.

์ ์ˆ˜ ์ด์ƒ์˜ ๊ฐ’์„ ์ฐพ์œผ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ด์ฌ์˜ bisec_left ๋ชจ๋“ˆ์„ ์ด์šฉํ–ˆ๋‹ค.

 

# ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค 72412: ์ˆœ์œ„ ๊ฒ€์ƒ‰ (2021 KAKAO BLIND RECRUITMENT)

from itertools import combinations
from bisect import bisect_left

def solution(info, query):
    answer = [0] * len(query)
    
    dic = {}
    for i in info:
        i = i.split()
        pick = tuple(i[:4])
        score = int(i[4])

        # ๊ฐ info์— ๋Œ€ํ•ด ํƒ์ƒ‰๋  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋”•์…”๋„ˆ๋ฆฌ์— ์ถ”๊ฐ€ {(query):[score]}
        for j in range(5):
            combi = list(combinations(pick, j))
            for c in combi:
                if c in dic:
                    dic[c].append(score)
                else:
                    dic[c] = [score]
    
    for key in dic: # ์ด์ง„ ํƒ์ƒ‰์„ ์œ„ํ•œ ์ •๋ ฌ
        dic[key].sort()

    for i in range(len(query)):
        q = query[i].replace("and", "").replace("-", "").split()
        
        # query
        if len(q) == 1:
            con = ()
        else:
            con = tuple(q[:-1])
        
        # score
        sc = int(q[-1])

        # Lower Bound
        if con in dic:
            pos = bisect_left(dic[con], sc)
            answer[i] = len(dic[con]) - pos
        
    return answer

 

๐Ÿ˜‚ ํž˜๋“ค๊ฒŒ ์„ฑ๊ณตํ–ˆ๋‹ค..