일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- ChatGPT
- AI 경진대회
- 데이콘
- SW Expert Academy
- gs25
- 자연어처리
- 백준
- github
- Kaggle
- 파이썬
- 캐치카페
- programmers
- 금융문자분석경진대회
- 맥북
- Docker
- Git
- hackerrank
- PYTHON
- 편스토랑
- leetcode
- ubuntu
- 프로그래머스
- Real or Not? NLP with Disaster Tweets
- 편스토랑 우승상품
- 프로그래머스 파이썬
- 더현대서울 맛집
- 우분투
- 코로나19
- dacon
- Baekjoon
- Today
- Total
솜씨좋은장씨
[Programmers] 위클리 챌린지 4주차 - 직업군 추천하기 (Python) 본문
코딩 1일 1문제! 오늘의 문제는 프로그래머스의 위클리 챌린지 4주차 문제! 직업군 추천하기 입니다.
3주차 문제를 먼저 풀고 왔어야했으나!
저의 실력이 아직....
4주차를 먼저! 풀어보기로 했습니다.
Solution
def make_prefer_score_table(languages, preference):
prefer_score = {}
for language, score in zip(languages, preference):
prefer_score[language] = score
return prefer_score
def job_lang_score_table(table):
job_lang_score = {}
for job_score in table:
job_score = job_score.split()
job_lang_score[job_score[0]] = job_score[1:][::-1]
return job_lang_score
def get_job_score(prefer_score, job_lang_score):
job_score_dict = {}
for job in job_lang_score.keys():
job_score = 0
for score, lang in enumerate(job_lang_score[job]):
if lang in prefer_score.keys():
job_score += (score + 1) * prefer_score[lang]
job_score_dict[job] = job_score
return job_score_dict
def solution(table, languages, preference):
answer = ''
prefer_table = make_prefer_score_table(languages=languages,
preference=preference)
job_lang_score = job_lang_score_table(table=table)
job_score_dict = get_job_score(prefer_score=prefer_table,
job_lang_score=job_lang_score)
answer = sorted(job_score_dict.items(), key=lambda x: (-x[1], x[0]))[0][0]
return answer
Solution 풀이
일단 4주차 문제를 풀기는 하였는데 썩 맘에들지는 않습니다.
# make_prefer_score_table
먼저
개발자가 사용하는 언어를 담은 문자열 배열 languages 와 사용하는 각 언어의 선호도 인 prefernce를 활용하여
먼저 각 언어별 선호도 점수를 담고있는 dictoinary를 만들었습니다.
# job_lang_score_table
이번에는 각 직업군 언어 점수 정보인 table을 가져와서 보니
" " ( 공백 )으로 각 단어들이 묶여진 문자열의 형태였고
SI JAVA JAVASCRIPT SQL PYTHON C#
직업 5점 4점 3점 2점 1점
맨 첫번째 값이 직업, 나머지 값이 각 직업별 언어 인데 앞의 값부터 뒤의 값으로 갈 수록 점수가 낮은 언어 였습니다.
이에 리스트의 각 문자열을 split 하고
맨 첫번째 값은 dictionary의 키 값으로 나머지의 값은 리스트의 형태인데
[::-1] 을 활용하여 값의 순서를 반대로 바꾸어 저장해주었습니다.
반대로 바꾸어준 이유는 정렬의 순서가 점수로 이어지기 쉽게 하기 위함입니다.
"SI JAVA JAVASCRIPT SQL PYTHON C#".split()
-> ["SI", "JAVA", "JAVASCRIPT", "SQL", "PYTHON", "C#"]
-> 첫번째 값인 "SI" 은 dictoinary의 key
-> 나머지 값인 ["JAVA", "JAVASCRIPT", "SQL", "PYTHON", "C#"] 은
["JAVA", "JAVASCRIPT", "SQL", "PYTHON", "C#"][::-1]
5점 4점 3점 2점 1점
=> ["C#", "PYTHON", "SQL", "JAVASCRIPT", "JAVA"]
1점 2점 3점 4점 5점
-> { "SI": ["C#", "PYTHON", "SQL", "JAVASCRIPT", "JAVA"] }
# get_job_score
여기서는 개발자가 선호하는 언어의 직업군 언어점수를 구했습니다.
{
"SI": ["C#", "PYTHON", "SQL", "JAVASCRIPT", "JAVA"],
"CONTENTS": ["C++", "SQL", "PYTHON", "JAVA", "JAVASCRIPT"]
...
}
job_lang_score_table에서 만든 각 직업별 언어 점수가 담긴 dictionary를 가져와서
dictionary의 키 들 즉 직업의 개수만큼 반복문을 실행 합니다.
각 리스트의 언어가 담겨있는 순서가 곧 점수이므로 enumerate를 활용하여 점수와 언어 이름을 꺼내옵니다.
만약 해당 언어 이름이 개발자가 선호하는 언어인 prefer_score에 존재할 경우
해당 언어의 개발자 언어 선호도 * 각 직업의 해당 언어점수 를 구해 더합니다.
for job in job_lang_score.keys():
job_score = 0
for score, lang in enumerate(job_lang_score[job]):
if lang in prefer_score.keys():
job_score += (score + 1) * prefer_score[lang]
주의할 점은 enumerate가 0부터 시작이니 + 1을 꼭하고 해야합니다.
이렇게 구하면
[('HARDWARE', 41), ('CONTENTS', 36), ('SI', 29), ('GAME', 25), ('PORTAL', 21)]
위와 같은 결과가 나오고 이를
sorted(job_score_dict.items(), key=lambda x: (-x[1], x[0]))[0][0]
sorted와 lambda를 활용하여 점수순으로 먼저 정렬 > 이름 순 정렬 후에
가장 첫번째 언어를 가져와서 출력하도록 하면 됩니다.
뭔가 풀다보니 코드도, 설명도 복잡해진 것 같은데 한가해지면 다시 풀어봐야 할 것 같습니다.
읽어주셔서 감사합니다.
'Programming > 코딩 1일 1문제' 카테고리의 다른 글
[BaekJoon] 10823번 : 더하기 2 (Python) (0) | 2021.08.26 |
---|---|
[BaekJoon] 11758번 : CCW (Python) (0) | 2021.08.25 |
[BaekJoon] 2755번 : 이번학기 평점은 몇점? (Python) (0) | 2021.08.22 |
[BaekJoon] 14915번 : 진수 변환기 (Python) (0) | 2021.08.21 |
[BaekJoon] 5598번 : 카이사르 암호 (Python) (0) | 2021.08.20 |