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
๐ ํ๋ค๊ฒ ์ฑ๊ณตํ๋ค..