Learn & Run

[Programmers] 직업군 추천하기 (Java, Kotlin) 본문

Algorithm/Programmers

[Programmers] 직업군 추천하기 (Java, Kotlin)

iron9462 2021. 8. 29. 03:29

https://programmers.co.kr/learn/courses/30/lessons/84325?language=kotlin 

 

코딩테스트 연습 - 4주차

개발자가 사용하는 언어와 언어 선호도를 입력하면 그에 맞는 직업군을 추천해주는 알고리즘을 개발하려고 합니다. 아래 표는 5개 직업군 별로 많이 사용하는 5개 언어에 직업군 언어 점수를 부

programmers.co.kr

문제

직업군 언어 점수를 정리한 문자열 배열 table, 개발자가 사용하는 언어를 담은 문자열 배열 languages, 언어 선호도를 담은 정수 배열 preference가 매개변수로 주어집니다. 개발자가 사용하는 언어의 언어 선호도 X 직업군 언어 점수의 총합이 가장 높은 직업군을 return 하도록 solution 함수를 완성하면 됩니다.

 

접근 아이디어

1. 각 직업군에 대한 언어별 점수를 map을 이용하여 key, value로 저장합니다.

2. languages와 preference를 이용하여 직업군 별 언어점수 합계를 구합니다. 

3. 언어점수에 대해서 최댓값을 가지는 직업군을 결과값으로 반환합니다.

 

조심해야할 점

1. 점수가 가장 높은 직업군을 반환할 때, 같은 점수를 가진 직업에 대해서도 고려를 해야합니다.

2. 이 경우에 사전순으로 정렬후에 첫 번째 값을 반환해야 합니다.

 

 

- Java

import java.util.*;

class Solution {
    public String solution(String[] table, String[] languages, int[] preference) {
        int max = Integer.MIN_VALUE; //점수의 최댓값
        List<String> list = new ArrayList<>(); //점수가 같을 때, 사전 순으로 직업을 찾아야 하기 때문에 사용 
        
        for (int i = 0; i < table.length; i++) {
            String[] info = table[i].split(" ");
            String job = info[0]; //직업군
            Map<String, Integer> map = new HashMap<>();
            for (int score = 5; score >= 1; score--) {
                map.put(info[5 - score + 1], score); //info[1] ~ info[5]는 언어별 점수
            }
            
            int sum = 0;
            for (int idx = 0; idx<languages.length; idx++) {
                if(map.containsKey(languages[idx])) {
                    sum += map.get(languages[idx]) * preference[idx];
                }
            }

            if(max < sum) {
                list.clear();
                list.add(job);
                max = sum;
            } else if(max == sum) {
                list.add(job);
            }
        }

        Collections.sort(list);

        return list.get(0);
    }
}

 

 

- Kotlin

import java.util.*;

class Solution {
    fun solution(table: Array<String>, languages: Array<String>, preference: IntArray): String {
        var max = Int.MIN_VALUE //점수의 최댓값
        val list: MutableList<String> = ArrayList() //점수가 같을 때, 사전 순으로 직업을 찾아야 하기 때문에 사용

        for (i in table.indices) {
            val info: Array<String> = table[i].split(" ".toRegex()).toTypedArray()
            val job = info[0] //직업군
            val map: MutableMap<String, Int> = HashMap()
            for (score in 5 downTo 1) {
                map[info[5 - score + 1]] = score //info[1] ~ info[5]는 언어별 점수
            }
            
            var sum = 0
            for (idx in languages.indices) {
                if (map.containsKey(languages.get(idx))) {
                    sum += map[languages[idx]]!!.times(preference[idx])
                }
            }
            
            if (max < sum) {
                list.clear()
                list.add(job)
                max = sum
            } else if (max == sum) {
                list.add(job)
            }
        }

        list.sort()

        return list[0]
    }
}

 

 

좌(Java 채점 결과), 우(Kotlin 채점 결과)