[프로그래머스(Programmers)][자바(java)] (Lv1) 4주차 - 직업군 추천하기 <위클리 챌린지>

728x90

 

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

 

코딩테스트 연습 - 4주차

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

programmers.co.kr

 

 

문제 요약

 

직업군 언어 점수를 정리한 문자열 배열 table, 개발자가 사용하는 언어를 담은 문자열 배열 languages, 언어 선호도를 담은 정수 배열 preference가 매개변수로 주어집니다. 개발자가 사용하는 언어의 언어 선호도 x 직업군 언어 점수의 총합이 가장 높은 직업군을 return 하도록 solution 함수를 완성해주세요. 총합이 같은 직업군이 여러 개일 경우, 이름이 사전 순으로 가장 빠른 직업군을 return 해주세요.

 

 

문제 풀이

 

import java.util.*;

public class Solution {
	
	public String solution(String[] table, String[] languages, int[] preference) {
		Arrays.sort(table);
		String t[][] = new String[5][6]; // t : 2 dimensional arr of table[]
		int i, j; StringTokenizer st;
		for (i = 0; i < 5; ++i) {
			st = new StringTokenizer(table[i]);
			t[i][0] = st.nextToken();
			for (j = 5; j >= 1; --j)
				t[i][j] = st.nextToken();
		}
		int s[] = new int[5], k, n = languages.length, p; String l; // s : scores for each occupation
		for (k = 0; k < n; ++k) {
			l = languages[k]; // l : String language
			p = preference[k]; // p : int preference of the language
			loop:
			for (i = 0; i < 5; ++i) {
				for (j = 1; j <= 5; ++j) { // j : int score of the language
					if (l.equals(t[i][j])) {
						s[i] += j * p;
						continue loop;
					}
				}
			}
		}
		int ms = 0, mi = -1; // ms : max score, mi : idx of max score
		for (i = 0; i < 5; ++i) {
			if (ms < s[i]) {
				ms = s[i];
				mi = i;
			}
		}
		return t[mi][0];
	}
}

 

  • 전달받은 table[]( 각 직업군에 대한 언어 점수 순서를 담은 배열 )을 미리 정렬함

       ["CONTENTS JAVASCRIPT JAVA PYTHON SQL C++",
       "GAME C++ C# JAVASCRIPT C JAVA",
       "HARDWARE C C++ PYTHON JAVA JAVASCRIPT",
       "PORTAL JAVA JAVASCRIPT PYTHON KOTLIN PHP",
       "SI JAVA JAVASCRIPT SQL PYTHON C#"]

  • 크기가 5*6인 2차원 배열 String t[][] 생성
    table[]을 기반으로 StringTokenizer를 사용하여 String 문자열을 넣음
    첫 번째 열( 인덱스 0 )의 직업군 이후에는 점수가 5점인 언어가 내림차순으로 있으므로
    두 번째 열( 인덱스 1 )부터는 역순으로 값을 넣음
t[ ][ ] < 직업군 > < 점수 >
i / j 0 1 2 3 4 5
0 CONTENTS C++ SQL PYTHON JAVA JAVASCRIPT
1 GAME JAVA C JAVASCRIPT C# C++
2 HARDWARE JAVASCRIPT JAVA PYTHON C++ C
3 PORTAL PHP KOTLIN PYTHON JAVASCRIPT JAVA
4 SI C# PYTHON SQL JAVASCRIPT JAVA
  • 크기 5인 배열 int s[] 생성
    langages[]을 순회하며( 0 <= k < language.length )
    t[][]에서 각 언어에 대한 직업군 별 총합( 언어 선호도( preference[k] ) * 언어 점수( j ) 들의 합 )을 계산하여 넣음
s[ ] < 점수 총합 >
s[i]
0 36  ( 7*3 + 5*1 + 5*2 )
1 25  ( 5*5 )
2 41  ( 7*3 + 5*4 )
3 21  ( 7*3 )
4 29  ( 7*2 + 5*3 )
  k 0 1 2
< 언어 종류 > languages[k] "PYTHON" "C++" "SQL"
< 선호도 > preference[k] 7 5 5
  • 최댓값( ms : max score )을 구하고 인덱스( mi : max idx )도 같이 구해서
    그 인덱스에 해당하는 직업군 리턴
    ( t[mi][0] )

 

 

반응형