관리 메뉴

솜씨좋은장씨

[Programmers] 위클리 챌린지 4주차 - 직업군 추천하기 (Python) 본문

Programming/코딩 1일 1문제

[Programmers] 위클리 챌린지 4주차 - 직업군 추천하기 (Python)

솜씨좋은장씨 2021. 8. 23. 19:40
728x90
반응형



코딩 1일 1문제! 오늘의 문제는 프로그래머스의 위클리 챌린지 4주차 문제! 직업군 추천하기 입니다.

3주차 문제를 먼저 풀고 왔어야했으나!

저의 실력이 아직.... 

4주차를 먼저! 풀어보기로 했습니다.

 

코딩테스트 연습 - 4주차

개발자가 사용하는 언어와 언어 선호도를 입력하면 그에 맞는 직업군을 추천해주는 알고리즘을 개발하려고 합니다. 아래 표는 5개 직업군 별로 많이 사용하는 5개 언어에 직업군 언어 점수를 부

programmers.co.kr

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를 활용하여 점수순으로 먼저 정렬 > 이름 순 정렬 후에

가장 첫번째 언어를 가져와서 출력하도록 하면 됩니다.

 

뭔가 풀다보니 코드도, 설명도 복잡해진 것 같은데 한가해지면 다시 풀어봐야 할 것 같습니다.

 

읽어주셔서 감사합니다.

 

GitHub - SOMJANG/CODINGTEST_PRACTICE: 1일 1문제 since 2020.02.07

1일 1문제 since 2020.02.07. Contribute to SOMJANG/CODINGTEST_PRACTICE development by creating an account on GitHub.

github.com

Comments