링크> programmers.co.kr/learn/courses/30/lessons/72412
문제>
지원자가 지원서에 입력한 4가지의 정보와 획득한 코딩테스트 점수를 하나의 문자열로 구성한 값의 배열 info, 개발팀이 궁금해하는 문의조건이 문자열 형태로 담긴 배열 query가 매개변수로 주어질 때,
각 문의조건에 해당하는 사람들의 숫자를 순서대로 배열에 담아 return 하도록 solution 함수를 완성해 주세요.
풀이>
문제 자체는 어렵지 않지만, 효율성에서 걸리기 쉬운 문제다. 하지만 의외로 해결책은 간단하다. for 반복문을 돌면서 일일이 n점 이상인 응시자를 찾지 말고, 일단 정렬을 한다음에 이진탐색을 하면 쉽게 통과된다.
응시자가 속할 수 있는 16개의 그룹을 어떻게 구할까 처음에는 많이 고민했는데, combinations 로 하나 내가 직접 입력하나 그게 그거일거같아서 직접 16개의 케이스를 만들어줬다. 이 부분을 수정하면 코드가 더 예뻐질 거같긴 하다.
코드>
from collections import defaultdict
from bisect import bisect_left
def solution(info, query):
answer = []
group = defaultdict(list)
for i in info:
i = i.split()
score = int(i.pop())
group['----'].append(score)
group[''.join(i)].append(score)
cases = [['-', '', '-', '-'], ['-', '-', '-', ''], ['', '-', '-', '-'], ['-', '-', '', '-'], ['', '-', '', '-'],
['', '', '-', '-'], ['', '-', '-', ''], ['-', '-', '', ''], ['-', '', '-', ''], ['-', '', '', '-'],
['', '-', '', ''], ['-', '', '', ''], ['', '', '', '-'], ['', '', '-', '']]
for case in cases:
for j in range(4):
if not case[j]:
case[j] = i[j]
group[''.join(case)].append(score)
for key in group:
group[key] = sorted(group[key])
for q in query:
q = q.split(' and ')
food, score = q.pop().split()
q.append(food)
score = int(score)
q = ''.join(q)
if q in group.keys():
answer.append(len(group[q])-bisect_left(group[q], score))
else:
answer.append(0)
return answer
'Algorithm > Python' 카테고리의 다른 글
[파이썬/프로그래머스]방금그곡 (0) | 2021.05.12 |
---|---|
[파이썬/백준 1270]전쟁 - 땅따먹기 (0) | 2021.05.11 |
[파이썬/프로그래머스]수식최대화 (0) | 2021.05.08 |
파이썬 변수 이름의 길이가 프로그램의 효율성에 영향을 줄까? (0) | 2021.05.07 |
[파이썬/백준 1991]트리 순회 (0) | 2021.04.17 |