[프로그래머스] 위클리 챌린지 4주차 파이썬

FFTL:)·2021년 9월 8일

위클리 챌린지 (https://programmers.co.kr/learn/challenges)

문제

문제의 설명이 길어서 이해하는데 조금 어려움을 겪었던 문제입니다. 천천히 읽어보고 이해하면 크게 어렵지 않았습니다.

문제해결

  • 일단 주어진 테이블을 정리하여 담아줄 dictionary를 만들어 주어 각 직업군 별로 언어를 담아줍니다.
  • 그리고 직업군을 하나씩 꺼내어 해당 직업군에 languages에 포함되는 언어가 존재하는지 확인하고, 존재한다면 해당 언어의 preference를 언어의 점수와 곱해서 nowValue에 더해주어 해당 직업군의 언어 점수를 구해줍니다.
  • 마지막으로 총합이 같은 직업군이 존재할 수 있기 때문에 점수별로 정렬한 직업군 중 총합의 최대값을 가지는 직업군을 하나 가져온 뒤, 해당 직업군의 총합과 같은 총합을 가지는 직업군을 모두 뽑아 낸 배열을 다시 직업이름 순으로 정렬하여 정답을 찾아냅니다.
def solution(table, languages, preference):
    dictions = {};	#테이블을 정리하여 담아줄 dictionary
    jobs = [];		#직업군 별 언어점수를 담아줍니다.
    maxJobs = [];	#동일한 언어점수를 가진 직업군을 판단하기위한 배열입니다.
    
    #dictions에 직업군 이름에 언어들을 넣어줍니다.
    for t in table:
        now = t.split();
        dictions[now[0]] = now[1:]; 
     
    #직업군을 하나씩 꺼내어 언어 점수를 얻어줍니다.
    for d in dictions:
        nowValue = 0;
        for i in range(0, len(languages)):
            if languages[i] in dictions[d]:
                nowValue += (5-dictions[d].index(languages[i])) * preference[i];
	#계산이 끝난 직업군은 jobs에 추가해줍니다.
        jobs.append([d, nowValue]);
    
    #만들어진 jobs를 점수 순으로 정렬합니다.
    jobs.sort(key = lambda x:(x[1]), reverse=True);
    #점수가 가장 높은 직업군을 maxJobs에 추가합니다.
    maxJobs.append(jobs.pop(0));
    
    #그리고 jobs를 반복하며 총합이 최대값과 같은 직업군을 찾아 마찬가지로 maxJobs에 넣어줍니다.
    for j in jobs:
        if j[1] == maxJobs[0][1]:
            maxJobs.append(j);
        else:
            break;
    
    #마지막으로 maxJobs를 이름순으로 정렬하여준 뒤 첫번째 항목을 꺼내 반환합니다.
    maxJobs.sort(key = lambda x:(x[0]));
    
    return maxJobs[0][0];
profile
생각하는 개발자가 되자!

0개의 댓글