프로그래머스 위클리 챌린지 4주차

2021. 9. 2. 12:25CodingTest

문제

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

 

코딩테스트 연습 - 4주차

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

programmers.co.kr

 

문제요약

1. 개발자가 사용하는 언어와 언어에 대한 선호도를 입력으로 하여 해당 개발자의 추천 직업군을 매칭시켜 줍니다.

2. 추천 직업군의 기준은 개발자가 사용하는 언어의 언어선호도*직업군 언어 점수의 총합이 가장 높은 직업군입니다.

 

소스코드

import java.util.HashMap;
import java.util.Map;

class Solution {
	static class Table{
		// key : 직업군, value : 직업군에 대한 언어 기준 map
		Map<String, Map<String,Integer>> map = new HashMap<String, Map<String,Integer>>();
		
		public Table(String[] table)
		{
			String[] str = null; // str : ["직업군", "5점언어", "4점언어", ... , "1점언어"]
			for(String t : table)
			{
				str = t.split(" ");
				
				String job = str[0];	// 직업군
				Map<String,Integer> dummy = new HashMap<String, Integer>();	// 직업군에 대한 언어 기준 map
				
				// 각각의 언어에 대한 점수 삽입 (5점 ~ 1점 순서)
				for(int i=1;i<str.length;i++)
				{
					dummy.put(str[i], str.length-i);
				}
				
				map.put(job, dummy);
			}	
		}

		// 참여자에 대한 추천 직업군 매칭
		public String getRecommandJob(Participant p) {
			int maxScore = 0;			// 최고 점수
			String recommandJob = "";	// 추천 직업군
			
			for(String job : map.keySet())
			{
				int sum = 0;
				for(String lang : p.lang_map.keySet())
				{ 
					sum += ((map.get(job).containsKey(lang) ? 
								map.get(job).get(lang) : 0) 
							* p.lang_map.get(lang));
				}
				
				// 점수 총합이 최고점수와 동일하고 recommandJob이 job보다 사전순으로 낮은경우
				if(sum==maxScore && recommandJob.compareTo(job)>0)
				{
					recommandJob = job;
				}
				else if(sum>maxScore)
				{
					maxScore = sum;
					recommandJob = job;
				}
				
			}
			
			return recommandJob;
		}
	}
	
	static class Participant{
		Map<String,Integer> lang_map = new HashMap<>();	// key : 사용언어, value : 언어 선호도 점수
		
		public Participant(String[] languages, int[] preference)
		{
			// 사용언어에 대한 언어 선호도 값 저장
			for(int i=0;i<languages.length;i++)
			{
				lang_map.put(languages[i], preference[i]);
			}
		}
	}
	
    public String solution(String[] table, String[] languages, int[] preference) {
		Participant p = new Participant(languages, preference);	// 참여자 정보 초기화
		Table t = new Table(table);	// 직업군 추천 테이블 초기화
		
        return t.getRecommandJob(p); // 참여자에 대한 직업군 추천
    }
}

'CodingTest' 카테고리의 다른 글

프로그래머스 위클리 챌린지 6주차  (0) 2021.09.08
백준 11726, 2 x n 타일링  (0) 2021.09.06
프로그래머스 위클리 챌린지 2주차  (0) 2021.09.01
백준 10987, 모음의 개수  (0) 2021.08.16
백준(Backjoon) 9625, BABBA  (0) 2021.07.23