[ 다먹살 ]/- Coding

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

엉망으로살기 2021. 8. 23. 16:27
반응형

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();
    }
}

 

반응형