코딩테스트

[프로그래머스] 위클리 챌린지 4주차 - 직업군 추천하기

☆_★ 2021. 9. 1. 21:08

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차원 배열을 사용하지 않는 아이디어가 있으시면 공유 해주시면 감사하겠습니다.