프로그래머스 위클리 챌린지 4주차 “직업군 추천하기” 문제를 풀어보았습니다.
여기를 누르면 설명을 건너뛸 수 있습니다.
문제 설명
개발자가 사용하는 언어와 언어 선호도
를 입력하면 그에 맞는 직업군을 추천해주는 알고리즘을 개발하려고 합니다.
아래 표는 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
의 길이 = 5table
의 원소는"직업군 5점언어 4점언어 3점언어 2점언어 1점언어"
형식의 문자열입니다.직업군
,5점언어
,4언어
,3점언어
,2점언어
,1점언어
는 하나의 공백으로 구분되어 있습니다.table
은 모든 테스트케이스에서 동일합니다.
- 1 ≤
languages
의 길이 ≤ 9languages
의 원소는"JAVA"
,"JAVASCRIPT"
,"C"
,"C++"
,"C#"
,"SQL"
,"PYTHON"
,"KOTLIN"
,"PHP"
중 한 개 이상으로 이루어져 있습니다.languages
의 원소는 중복되지 않습니다.
preference
의 길이 =languages
의 길이- 1 ≤
preference
의 원소 ≤ 10
- 1 ≤
preference
의 i번째 원소는languages
의 i번째 원소의언어 선호도
입니다.- return 할 문자열은
"SI"
,"CONTENTS"
,"HARDWARE"
,"PORTAL"
,"GAME"
중 하나입니다.
입출력 예
table | languages | preference | result |
---|---|---|---|
[“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”] | [“PYTHON”, “C++”, “SQL”] | [7, 5, 5] | “HARDWARE” |
[“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”] | [“JAVA”, “JAVASCRIPT”] | [7, 5] | “PORTAL” |
입출력 예 설명
입출력 예 #1
각 직업군 별로 점수를 계산해보면 아래와 같습니다.
아래 사진은 개발자 언어 선호도
나타낸 표입니다.
아래 사진은 개발자가 선호하는 언어의 직업군 언어 점수
를 나타낸 표입니다.
따라서 점수 총합이 41로 가장 높은 "HARDWARE"
를 return 해야 합니다.
입출력 예 #2
각 직업군 별로 점수를 계산해보면 아래와 같습니다.
아래 사진은 개발자 언어 선호도
나타낸 표입니다.
아래 사진은 개발자가 선호하는 언어의 직업군 언어 점수
를 나타낸 표입니다.
점수 총합이 55로 가장 높은 직업군은 “SI” 와 “PORTAL”입니다.
따라서 사전 순으로 먼저 오는
"PORTAL"
을 return 해야 합니다.
Solution
[문제 이해]
- 입력되는 직군별 언어에 대한 점수 할당
- 언어별 총점 계산
- 정렬을 통해 결론 도출
- 점수가 같을 경우 언어의 알파벳 오름차순
마지막 점수가 같을 경우 언어의 알파벳 오름차순
만 조심하면 풀이 자체는 간단했습니다.
이해한 내용을 바탕으로 코드를 작성했습니다.
[1차 풀이 코드]
from collections import Counter, defaultdict
def solution(table, languages, preference):
# 직군별 언어 점수를 할당하기 위한 변수
setTable = defaultdict(dict)
# 선호도 점수 할당
setLang = {l: score for l, score in zip(languages, preference)}
# 직군별 언어 점수를 할당
for row in table:
data = row.split()
setTable[data[0]]
for i, col in enumerate(data[1:]):
setTable[data[0]][col] = 5 - i
# 직군별 점수 계산을 위한 변수
job_score = {}
# 직군별 점수 계산
for job in setTable:
overlap = Counter(setTable[job].keys()) + Counter(languages)
scores = 0
for lang in overlap:
if overlap[lang] == 2:
scores += (setLang[lang] * setTable[job][lang])
else:
job_score[job] = scores
# lambda x의 정렬 기준
# -x[1]: 점수별 오름차순 정렬 -> 마이너스를 붙여 역으로 내림차순 정렬됨
# x[0]: 알파벳별 오름차순 정렬
answer = sorted(job_score.items(), key=lambda x: (-x[1], x[0]))[0][0]
return answer
[여담]
3주차 문제의 비해 난이도가 굉장히 낮아졌다고 생각했습니다.
이번 문제는 풀이 시간 단축에 중점을 두고 풀었습니다.
하지만 생각했던 것 보다는 조금 지체됐습니다.
그리고 효율성을 위해 최적화를 한 번 진행해봤습니다.
[최적화 코드]
def solution(table, languages, preference):
# 직군별 점수 계산을 위한 변수
job_score = {}
for row in table:
data = row.split()
# dictionary 자료형에 key 값으로 직군 할당, value는 0으로 초기화
job_score[data[0]] = 0
for lang, score in zip(languages, preference):
# 직군별 점수 계산
if lang in data:
job_score[data[0]] += (6 - data.index(lang)) * score
# 위와 동일
# -x[1]: 점수별 오름차순 정렬 -> 마이너스를 붙여 역으로 내림차순 정렬됨
# x[0]: 알파벳별 오름차순 정렬
answer = sorted(job_score.items(), key=lambda x: (-x[1], x[0]))[0][0]
return answer
처리 시간도 아주 짧게 나온 최적화 코드였습니다.
처리 시간 비교를 위해서 하단에 1 - (처리 시간)
결과도 첨부했습니다.