[프로그래머스] 위클리 챌린지 4주차 - 직업군 추천하기
https://programmers.co.kr/learn/courses/30/lessons/84325
코딩테스트 연습 - 4주차
개발자가 사용하는 언어와 언어 선호도를 입력하면 그에 맞는 직업군을 추천해주는 알고리즘을 개발하려고 합니다. 아래 표는 5개 직업군 별로 많이 사용하는 5개 언어에 직업군 언어 점수를 부
programmers.co.kr
안녕하세요, 문제 푸는 과정을 기록하고자 합니다.
3주차는 난이도가 어려워 풀지 못한 관계로 4주차를 풀게 되었습니다..
제한사항
- table의 길이 = 5
- table의 원소는 "직업군 5점언어 4점언어 3점언어 2점언어 1점언어"형식의 문자열입니다. 직업군, 5점언어, 4언어, 3점언어, 2점언어, 1점언어는 하나의 공백으로 구분되어 있습니다.
- table은 모든 테스트케이스에서 동일합니다.
- 1 ≤ languages의 길이 ≤ 9
- languages의 원소는 "JAVA", "JAVASCRIPT", "C", "C++" ,"C#" , "SQL", "PYTHON", "KOTLIN", "PHP" 중 한 개 이상으로 이루어져 있습니다.
- languages의 원소는 중복되지 않습니다.
- preference의 길이 = languages의 길이
- 1 ≤ preference의 원소 ≤ 10
- preference의 i번째 원소는 languages의 i번째 원소의 언어 선호도입니다.
- return 할 문자열은 "SI", "CONTENTS", "HARDWARE", "PORTAL", "GAME" 중 하나입니다.
SI | CONTENTS | HARDWARE | PORTAL | GAME | |
5 | JAVA | JAVA | |||
4 | JAVASCRIPT | JAVASCRIPT | |||
3 | SQL | PYTHON | |||
2 | PYTHON | KOTLIN | |||
1 | C# | PHP |
주어진 형식은 2차원 배열로 보여줘 2차원 배열로 만들어야 할 것만 같았지만 2차원 배열을 만들지 않아도 가능한 문제였습니다.
처음 들었던 생각은 테이블인 2차원 배열 이중 for문(6*5), 각 셀마다의 비교 for문(languages의 크기) => 3차원 배열을 써도 시간은 문제가 없을 것이라 생각했습니다.
String[] languages = {"JAVA", "JAVASCRIPT"};
int[] preference = {7, 5};
직업군별로 위의 JAVA : 7, JAVASCRIPT : 5가 있는 곳의 배점을 곱하고 더해준 결과 값을 비교하는 문제입니다.
SI : JAVA 선호도 7 * 점수 5 = 35, JAVASCRIPT 선호도 5 * 점수 4 = 20 => 55
PORTAL : JAVA 선호도 7 * 점수 5 = 35, JAVASCRIPT 선호도 5 * 점수 4 = 20 => 55
두 직업군의 총합이 같은 결과를 확인하였습니다.
총합이 같은 직업군이 여러 개일 경우, 이름이 사전 순으로 가장 빠른 직업군을 return 해주세요.
위의 요구사항을 어떻게 할 것인가였습니다.
매 열 비교할 수 있는 sum의 값과 직업군들 중의 max값을 설정하여 열마다 비교 후에 같은 경우일 경우만 리스트에 담아 Collections.sort를 사용하여 오름차순으로 정리하여, List에 담긴 첫번째 값을 찾아와 리턴해주었습니다.
package weeklyChallenge;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;
public class Solution {
public static void main(String[] args) {
String[] table = {"SI JAVA JAVASCRIPT SQL PYTHON C#", "CONTENTS JAVASCRIPT JAVA PYTHON SQL C++", "HARDWARE C C++ PYTHON JAVA JAVASCRIPT", "PORTAL JAVA JAVASCRIPT PYTHON KOTLIN PHP", "GAME C++ C# JAVASCRIPT C JAVA"};
String[] languages = {"JAVA", "JAVASCRIPT"};
int[] preference = {7, 5};
String result = "PORTAL";
System.out.println(solution(table, languages, preference).equals(result));
}
public static String solution(String[] table, String[] languages, int[] preference) {
String answer = "";
StringTokenizer st = null;
String map[][] = new String[6][5];
int max = Integer.MIN_VALUE;
ArrayList<String> list = new ArrayList<>();
for (int i = 0; i < 5; i++) {
st = new StringTokenizer(table[i]);
for (int j = 0; j < map.length; j++) {
map[j][i] = st.nextToken();
}
int sum = 0;
for (int j = 1; j < map.length; j++) {
loop:
for (int l = 0; l < languages.length; l++) {
if (map[j][i].equals(languages[l])) {
sum += (6 - j) * preference[l];
break loop;
}
}
}
if (max < sum) {
list.clear();
max = sum;
list.add(map[0][i]);
} else if (max == sum) {
list.add(map[0][i]);
}
}
Collections.sort(list);
answer = list.get(0);
return answer;
}
}
코드를 완성하고 나니 단순 3차원 배열을 사용하여 푼 문제가 되었습니다.
3차원 배열을 사용하지 않는 아이디어가 있으시면 공유 해주시면 감사하겠습니다.
