프로그래머스(Java) - 직업군 추천하기(위클리 챌린지 4주차)

민지킴·2021년 9월 9일
0

프로그래머스

목록 보기
40/42
post-thumbnail

문제 링크

https://programmers.co.kr/learn/courses/30/lessons/84325

문제 풀이

직업군과 그 직업군에서 사용하는 언어별로 받는 점수가 다르다.
그래서 직업군을 key값으로 하고 value를 map으로 받으며
그 map의 key는 언어, value를 점수로 가지는
Map<String, Map<String,Integer>>를 사용한다면 쉽게 접근할 수 있을것이라고 생각했다.

map에 원하는 형태로 값들이 저장된다면
이제 점수를 구해줘야한다.
점수를 구하기 위해서 각 직업군에 해당 언어가 포함되어있는지를 체크하고, 포함되어 되지 않으면 0점, 포함되어있다면 가산점을 더해서 점수를 구한다.


코드

import java.util.*;

class TotalScore implements Comparable<TotalScore> {
    //직업군과, 점수
    String field;
    int score;
    
    public TotalScore(String field, int score){
        this.field = field;
        this.score = score;
    }
    
    //점수에 따라서 내림차순, 이름에 따라서 오름차순
    public int compareTo(TotalScore o){
        if(score - o.score>0){
            return -1;
        }else if(score-o.score<0){
            return 1;
        }else{
            if(field.compareTo(o.field)>0){
                return 1;
            }else{
                return -1;
            }
        }
    }
}

class Solution {
    public String solution(String[] table, String[] languages, int[] preference) {
        String answer = "";
        Map<String,Map<String,Integer>>map = new HashMap();

        //직업군
        String [] industry = new String[table.length];
        
        for(int i=0; i<table.length; i++){
            String [] array = table[i].split(" ");
            industry[i] = array[0];
            Map<String,Integer>tempMap = new HashMap();
            int idx = table.length;
            for(int j=1; j<array.length;j++){
                tempMap.put(array[j],Math.max(idx--,0));
            }
            map.put(array[0],tempMap);
        }

        List<TotalScore> list = new ArrayList();
        for(int i=0; i<industry.length; i++){
            int sum = 0;
            for(int j=0; j<languages.length; j++){
                if(map.get(industry[i]).containsKey(languages[j])){
                    sum += map.get(industry[i]).get(languages[j])*preference[j];
                }else{
                    sum +=0;
                }      
            }
            list.add(new TotalScore(industry[i],sum));
        }
        //조건에 따라 정렬
        Collections.sort(list);
           
        //조건에 부합하는 값은 리스트의 0번째 값이므로, 그 값의 직업군 return
        return list.get(0).field;
    }
}
profile
하루하루는 성실하게 인생 전체는 되는대로

0개의 댓글