라떼는말이야

[프로그래머스 위클리 챌린지] 4주차_직업군 추천하기 본문

알고리즘/코딩 테스트

[프로그래머스 위클리 챌린지] 4주차_직업군 추천하기

MangBaam 2021. 8. 23. 12:04
반응형

캡처를 좀 늦게했지만 8번째로 풀이했습니다!! 1~2단계 수준인 것 같은데 확실히 저번 주 문제보다 쉬웠고, 사람들의 풀이도 빠르네요

[다른 사람 풀이]에서 MANGBAAM을 발견하면 추천 한 번씩 눌러주세요..ㅎ

※ 전체 소스코드는 가장 밑에 있습니다.


문제 설명

개발자가 사용하는 언어와 언어 선호도를 입력하면 그에 맞는 직업군을 추천해주는 알고리즘을 개발하려고 합니다.

아래 표는 5개 직업군 별로 많이 사용하는 5개 언어에 직업군 언어 점수를 부여한 표입니다.

예를 들면, 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" 중 하나입니다.

입출력 예

입출력 예 설명

입출력 예 #1

각 직업군 별로 점수를 계산해보면 아래와 같습니다.

아래 사진은 개발자 언어 선호도 나타낸 표입니다.

아래 사진은 개발자가 선호하는 언어의 직업군 언어 점수를 나타낸 표입니다.

따라서 점수 총합이 41로 가장 높은 "HARDWARE"를 return 해야 합니다.

 

입출력 예 #2

각 직업군 별로 점수를 계산해보면 아래와 같습니다.

아래 사진은 개발자 언어 선호도 나타낸 표입니다.

아래 사진은 개발자가 선호하는 언어의 직업군 언어 점수를 나타낸 표입니다.

점수 총합이 55로 가장 높은 직업군은 "SI" 와 "PORTAL"입니다.
따라서 사전 순으로 먼저 오는 "PORTAL"을 return 해야 합니다.

 


나의 풀이

문제가 좀 기네요. 하지만 차분히 잘 읽어보면 그렇게 어려운 얘기를 하는 것은 아닙니다.

실제 코딩테스트에서도 이렇게 긴 문제가 나와도 시간에 쫓겨서 급하게 읽지 말고 확실히 이해하고 풀어야 실수를 줄일 수 있습니다.

두 번째 예제

이 표가 큰 힌트가 될 것 같습니다.

table

이 표와 비교해서 보면 됩니다.

두 번째 예제입니다.

예제의 표를 보면 직업군 언어별로 점수 총합을 매겨서 정렬하는 문제입니다.

그 전에 직업군 언어별로 점수 총합을 계산 해야겠죠

저는 table을 순회하는데 주어진 table을 보면 하나의 리스트에 직업군별 언어 순위대로 적힌 문자열이 보입니다.

table = [col.split() for col in table]

하나의 문자열로 되어있기 때문에 split() 메소드로 쪼개줄 것입니다.

그리고 점수 식을 보면 언어 선호도 x 직업군 언어 점수 로 계산 됩니다.

우선 언어 선호도에서 사용될 언어와 선호도는 매개변수로 주어집니다. 즉, 같은 개수가 주어지겠죠.

pref = dict(zip(languages, preference)) # 개발자 언어 선호도

저는 사전으로 만들어서 사용했습니다.

직업군 언어 점수는 5 4 3 2 1 순으로 되어있기 때문에 리스트 크기(6) - 인덱스 번호 를 해서 구했습니다.

table

주어진 table 리스트를 보면 각 요소로 리스트가 들어있고, 리스트는 직업군 언어 점수의 하나의 열(직업군)을 뜻합니다.

하나의 문자열로 이루어졌기 때문에 split() 메소드로 하나씩 쪼개면 SI는 0번 인덱스, JAVA는 1번 인덱스 ... C#은 5번 인덱스입니다.

JAVA가 5점, JAVASCRIPT가 4점 ... C#이 1점으로 되어있기 때문에 리스트 크기(6)에서 자신의 인덱스를 빼주면 되겠죠.

언어 선호도 와 직업군 언어 점수를 구했으니 곱해서 저장하면 됩니다.

result = [] # 직업군 언어 점수 저장될 리스트

table = [col.split() for col in table]
    for column in table:
        scores = [] # 직업군별 점수들 저장될 리스트
        for n in range(1, len(column)): # 언어는 제외하고 순회 (언어는 0번째 인덱스)
            if column[n] in languages:
                scores.append((len(column)-n) * pref[column[n]]) # 점수 계산
        result.append((column[0], sum(scores))) # 언어와 점수 저장

그리고 직업군과 점수의 합을 result라는 리스트에 저장합니다.

마지막으로 이 result를 정렬하여 반환하면 정답을 찾을 수 있습니다.

answer = sorted(result, key=lambda x: (-x[1], x[0])) # 결과 정렬

정렬 방법은 총합이 1순위이고, 총합이 같다면 이름을 사전순으로 정렬하는 것이 2순위 입니다.

즉, 총합으로 내림차순 정렬 후 총합이 같다면 직업군 이름오름차순 정렬 하는 것입니다.

한 번에 오름차순과 내림차순을 동시에 정렬하는 방법은 key 값으로 주어진 lambda 에서 첫 번째로 총합인 x[1]에 -를 붙여 -x[1]을 하면 각 결과에 마이너스가 붙어 내림차순으로 정렬되고, x[0]을 뒤에 두면 앞서 정렬한 결과가 동일한 경우x[0]을 기준으로 오름차순 정렬하는 것입니다.

다만 주의할 점은 x[0]에는 - 를 붙일 수 없습니다. 숫자가 아니기 때문이죠.

 

전체 소스코드

def solution(table, languages, preference):
    answer = ''
    pref = dict(zip(languages, preference)) # 개발자 언어 선호도
    result = [] # 직업군 언어 점수 저장될 리스트
    
    table = [col.split() for col in table]
    for column in table:
        scores = [] # 직업군별 점수들 저장될 리스트
        for n in range(1, len(column)): # 언어는 제외하고 순회 (언어는 0번째 인덱스)
            if column[n] in languages:
                scores.append((len(column)-n) * pref[column[n]]) # 점수 계산
        result.append((column[0], sum(scores))) # 언어와 점수 저장
    answer = sorted(result, key=lambda x: (-x[1], x[0])) # 1번 인덱스인 점수는 -를 붙여 내림차순, 0번 인덱스 언어는 오름차순
    
    return answer[0][0]

 

테스트 결과

반응형

'알고리즘 > 코딩 테스트' 카테고리의 다른 글

[백준 2839] 설탕 배달  (6) 2021.08.25
[백준 1744] 수 묶기  (0) 2021.08.25
[백준 2108] 통계학  (0) 2021.08.23
[백준 1931] 회의실 배정  (2) 2021.08.23
[백준 10989] 수 정렬하기 3  (0) 2021.08.23
[백준 1463] 1로 만들기 (DP 문제)  (0) 2021.08.22
[프로그래머스 lv2] 큰 수 만들기  (0) 2021.08.20
[프로그래머스 lv2] H-Index  (0) 2021.08.19
Comments