URL : https://programmers.co.kr/learn/courses/30/lessons/84325
문제 설명
- 개발자가 사용하는 언어와 언어 선호도를 입력하면 그에 맞는 직업군을 추천해주는 알고리즘을 개발하려고 합니다.
- 아래 표는 5개 직업군 별로 많이 사용하는 5개 언어에 직업군 언어 점수를 부여한 표입니다.
점수 | SI | CONTENTS | HARDWARE | PORTAL | GAME |
---|---|---|---|---|---|
5 | JAVA | JAVASCRIPT | C | JAVA | C++ |
4 | JAVASCRIPT | JAVA | C++ | JAVASCRIPT | C# |
3 | SQL | PYTHON | PYTHON | PYTHON | JAVASCRIPT |
2 | PYTHON | SQL | JAVA | KOTLIN | C |
1 | C# | C++ | JAVASCRIPT | PHP | JAVA |
- 예를 들면, SQL의 SI 직업군 언어 점수는 3점이지만 CONTENTS 직업군 언어 점수는 2점입니다. SQL의 HARDWARE, PORTAL, GAME 직업군 언어 점수는 0점입니다.
- 직업군 언어 점수를 정리한 문자열 배열 table, 개발자가 사용하는 언어를 담은 문자열 배열 languages, 언어 선호도를 담은 정수 배열 preference가 매개변수로 주어집니다. 개발자가 사용하는 언어의 언어 선호도 x 직업군 언어 점수의 총합이 가장 높은 직업군을 return 하도록 solution 함수를 완성해주세요. 총합이 같은 직업군이 여러 개일 경우, 이름이 사전 순으로 가장 빠른 직업군을 return 해주세요.
제한사항
- table의 길이 = 5
- table의 원소는 “직업군 5점언어 4점언어 3점언어 2점언어 1점언어”형식의 문자열입니다. 직업군, 5점언어, 4언어, 3점언어, 2점언어, 1점언어는 하나의 공백으로 구분되어 있습니다.
- table은 모든 테스트케이스에서 동일합니다.
- 1 ≤ languages의 길이 ≤ 9
- languages의 원소는 “JAVA”, “JAVASCRIPT”, “C”, “C++” ,”C#” , “SQL”, “PYTHON”, “KOTLIN”, “PHP” 중 한 개 이상으로 이루어져 있습니다.
- languages의 원소는 중복되지 않습니다.
- preference의 길이 = languages의 길이
- 1 ≤ preference의 원소 ≤ 10
- preference의 i번째 원소는 languages의 i번째 원소의 언어 선호도입니다.
- return 할 문자열은 “SI”, “CONTENTS”, “HARDWARE”, “PORTAL”, “GAME” 중 하나입니다.
문제풀이
- 우선 주어진 table을 split하여 dict 형태로 바꾸어준다, 이때 value를 zip하여 매칭시켜준다.
- 이후 매칭된 dict를 통해 해당 언어의 점수를 가지고와 preference의 점수만큼 곱하며, 기본으로 만들어놓은 점수에 더해준다.
- 이후 가장 높은 점수를 가진 언어를 sorted를 통해 return해준다, 이때 basic_jobs는 이미 알파벳순으로 정렬된 상태로 해야 한다.(같은 점수일경우 알파벳순으로 정렬되게 하기 위함)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def solution(table, languages, preference):
basic_tables = []
basic_values = [5,4,3,2,1]
basic_jobs = {"CONTENTS" : 0, "GAME":0, "HARDWARE":0, "PORTAL":0 , "SI" : 0}
for i in table:
keys = i.split(' ')
temp = {'jobs' : keys[0]}
temp.update(dict(zip(keys[1:], basic_values)))
basic_tables.append(temp)
for tables in basic_tables:
for point ,language in enumerate(languages):
try:
basic_jobs[tables['jobs']] += preference[point] * tables[language]
except:
pass
return sorted(basic_jobs.items(), key=lambda x : x[1], reverse=True)[0][0]
1
2
3
4
table = ["SI JAVA JAVASCRIPT SQL PYTHON C#", "CONTENTS JAVASCRIPT JAVA PYTHON SQL C++", "HARDWARE C C++ PYTHON JAVA JAVASCRIPT", "PORTAL JAVA JAVASCRIPT PYTHON KOTLIN PHP", "GAME C++ C# JAVASCRIPT C JAVA"]
languages = ["PYTHON", "C++", "SQL"]
preference = [7, 5, 5]
solution(table, languages, preference)
1
'HARDWARE'
1
2
3
4
table = ["SI JAVA JAVASCRIPT SQL PYTHON C#", "CONTENTS JAVASCRIPT JAVA PYTHON SQL C++", "HARDWARE C C++ PYTHON JAVA JAVASCRIPT", "PORTAL JAVA JAVASCRIPT PYTHON KOTLIN PHP", "GAME C++ C# JAVASCRIPT C JAVA"]
languages = ["JAVA", "JAVASCRIPT"]
preference = [7, 5]
solution(table, languages, preference)
1
'PORTAL'