글 작성자: bbangson
반응형

 

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

 

코딩테스트 연습 - 4주차_직업군 추천하기

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

programmers.co.kr

직업군 추천하기


 

난이도 : Level 1

 

 각 직업군에 맞는 점수를 계산하고 사전순 정렬에 고민할 순 있지만, 크게 난이도가 높은 문제는 아니라고 생각합니다. 

 

 저는 다음과 같은 로직으로 문제를 해결하고자 했습니다.

1. Map 자료구조를 활용하여 언어별 점수 저장.

2. Comparator를 이용하여 사전순 정렬.

3. table 배열을 돌면서 직업군 별 총점 계산.

4. 문자열 split.

5. max값 갱신.

 

 

- static HashMap<String, Integer> map = new HashMap<>();

 Key에는 languages 배열의 값을 저장하고, value에는 preference 배열의 값을 저장합니다.

 

 

 

- String solution(String[] table, String[] languages, int[] preference)

 setMap() 함수를 통해 Map 자료구조를 설정합니다. Comparator 인터페이스와 compareTo 메소드로 사전순 파라미터로 들어오는 table 배열을 사전순 정렬합니다. 그 다음 table 배열을 돌면서 문자열을 분리하고 그에 따라, 직업군 별 총점을 구합니다. 그리고 총점을 비교하여 max 값을 갱신합니다. 사전순으로 이미 정렬을 해놨기에, max 값이 갱신될 때마다 사전순으로는 뒤로 가게 됩니다.

 

 

 

- int calculate(String split[], int point, int sum)

 각 직업군 별 총점을 계산하는 함수입니다. Map 자료구조에 저장되어 있는 언어와 점수를 활용합니다. 

 

 

 

-void setMap(String[] languages,int[] preference)

 Map 자료 구조를 설정합니다. Key는 선호 언어이고, Value는 언어별 점수입니다. 

 

 

  코드
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;

class Solution {
	// PM / 84325번 / 위클리 챌린지 / 구현, 정렬 / 4주차 
    
	// 선호 언어, 점수 저장 
	static HashMap<String, Integer> map = new HashMap<>();
    
    public String solution(String[] table, String[] languages, int[] preference) {
        String answer = "";
        int max = Integer.MIN_VALUE;
        
        setMap(languages, preference);

        // 사전순 정렬.
        Arrays.sort(table, new Comparator<>() {
			@Override
			public int compare(String o1, String o2) {
				String[] o1_split = o1.split(" ");
				String[] o2_split = o2.split(" ");
				return o1_split[0].compareTo(o2_split[0]);
			}
        });
        
        // 각 직업군 별 총점 계산.
        for(int i=0; i<table.length; i++) {
        	String []split = table[i].split(" ");
        	String part = split[0];
        	int sum = 0;
        	int point = 5;
            	// 총점 계산
        	sum = calculate(split, point, sum);
        	
        	if(sum > max) {
        		max = sum;
        		answer = part;
        	}
        }
        return answer;
    }
    
    public int calculate(String split[], int point, int sum) {
    	for(int j=1; j<split.length; j++) {
    		String lang = split[j];
    		if(map.containsKey(lang)) {
    			sum += (point * map.get(lang)); 
    		}
    		point--;
    	}
    	
    	return sum;
    }
    
    public void setMap(String[] languages,int[] preference) {
        for(int i=0; i<languages.length; i++) {
        	map.put(languages[i], preference[i]);
        }
    }
}

 

 

 

 

 

피드백 환영합니다.

반응형