[프로그래머스] 위클리챌린지 4주 직업군 추천하기
https://programmers.co.kr/learn/courses/30/lessons/84325?language=java
코딩테스트 연습 - 4주차
개발자가 사용하는 언어와 언어 선호도를 입력하면 그에 맞는 직업군을 추천해주는 알고리즘을 개발하려고 합니다. 아래 표는 5개 직업군 별로 많이 사용하는 5개 언어에 직업군 언어 점수를 부
programmers.co.kr
사실 3주차 위클리챌린지가 업데이트 된걸 봤는데 보라색이어서 레벨3 정도일 것 같아서 일단 스킵했다. 주차가 넘어갈수록 어려워질줄 알았는데 저번주보다 이번주가 쉬운걸 보니 그것도 아닌가보다.
일단 이 문제는 인덱스와 정렬에 대한 이해만 있으면 해결할 수 있는 문제였다. 그리고 내가 문제해결을 유독 이렇게 많이 하는지는 모르겠지만, 자료구조에 대한 이중 정렬이 많이 필요해서 계속 구글링을 하는데 이건 무조건 익혀야 할 것 같다.
1. solution 함수로 입력받고 있는 변수(table, languages, preference)가 뭔지 살펴보고 사용법을 생각한다.
2. table 변수는 직업군과 점수를 직간접적으로 모두 포함하고 있다는 것을 알았다.
2-1. 따라서 table 변수를 각각 sector, score_table=>score_result로 나눠서 저장했다.
2-2. 이 과정에서 최대한 시간복잡도를 낮춰보기 위해 break문도 써보고 했으나 생각해보니 최대 시간복잡도는 겨우 5*9*10 밖에 되지 않았다.
3. 처리한 변수를 이용해 직업군에 따른 총점을 구한다.
3-1. 이 때, 언어별 선호도 preference를 추가로 곱해줘야 한다.
3-2. 결과는 (직업군, 점수)를 각각 key와 value 쌍으로 HashMap에 저장시킨다.
4. Collections sort를 오버라이드 해서 value 기준 내림차순 + value가 같을 시 key 오름차순 최종 정렬한 후, 결과를 출력한다.
문제 설명
제한사항 및 입출력 예시
코드
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
class Solution
{
public String solution(String[] table, String[] languages, int[] preference)
{
String[] sector = new String[5]; // 직업군 배열(5개 고정)
HashMap<String, Integer> map = new HashMap<String, Integer>(); // 직업군별 합산점수
String[][] score_table = new String[5][5]; // table 변수 전처리용
int[][] score_result = new int[5][languages.length]; // 직업/언어별 선호점수
// table => score_table + sector배열로 처리
for(int i=0; i<table.length; i++)
{
String[] temp = table[i].split(" ");
sector[i] = temp[0]; // 첫 번째 변수 : 무조건 직업군
for(int j=0; j<=4; j++) // 그 외 변수 : 앞에 나온 언어부터 5~1점 차등부여
{
score_table[i][4-j] = temp[j+1];
}
}
// 언어별 점수계산
for(int k=0; k<languages.length; k++)
{
String lang = languages[k];
for(int i=0; i<score_table.length; i++)
{
for(int j=0; j<score_table[i].length; j++)
{
// 일치하는 언어가 있으면 점수를 업데이트하고 멈춰!
if(score_table[i][j].equals(lang))
{
score_result[i][k] = j+1;
break;
}
}
}
}
// Map 자료형에 (직업군, 점수) 짝으로 넣기
for(int i=0; i<score_result.length; i++)
{
int sum = 0;
for(int j=0; j<preference.length; j++)
{
sum += (preference[j] * score_result[i][j]);
}
map.put(sector[i], sum);
}
// 정렬을 위한 리스트 구조 선언
List<Entry<String, Integer>> list = new LinkedList<Entry<String, Integer>>(map.entrySet());
// 점수 - 직업군 순으로 정렬 실행
Collections.sort(list, new Comparator<Map.Entry<String, Integer>>(){
@Override
public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2){
if(o2.getValue()==o1.getValue()) // 점수가 같을 때 직업군의 사전 순으로 오름차순 정렬
{
return o1.getKey().compareTo(o2.getKey());
}
else // 점수가 다르면 점수에 따른 내림차순 정렬
{
return o2.getValue().compareTo(o1.getValue());
}
}
});
return list.get(0).getKey();
}
}