C.R 2 | programmers - 직업군 추천하기

Yonghyun·2021년 8월 24일
0

CodeReview

목록 보기
2/2

programmers 위클리 챌린지 4주차

직업군 추천하기 - JavaScript

문제 설명

개발자가 사용하는 언어와 언어 선호도를 입력하면 그에 맞는 직업군을 추천해주는 알고리즘을 개발하려고 합니다.

아래 표는 5개 직업군 별로 많이 사용하는 5개 언어에 직업군 언어 점수를 부여한 표입니다.

점수SICONTENTSHARDWAREPORTALGAME
5JAVAJAVASCRIPTCJAVAC++
4JAVASCRIPTJAVAC++JAVASCRIPTC#
3SQLPYTHONPYTHONPYTHONJAVASCRIPT
2PYTHONSQLJAVAKOTLINC
1C#C++JAVASCRIPTPHPJAVA

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

제한사항

  • 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" 중 하나입니다.

첫번째로 내가 작성한 코드!

function solution(table, languages, preference) {
    let point= [[],[],[],[],[]];
    let table2 = [];
    var answer = '';

    
    for(let i = 0; i< table.length; i ++){
        table2.push(table[i].split(' '));
    }
  	for(let j = 0; j<languages.length; j++ ){
         for(let k =0; k <5 ; k++){
             for(let w = 1; w < 6; w++){
                if(languages[j]===table2[k][w]) {
                    point[k].push(preference[j]*(6-w));
                 } 
             }
         }
     }
  let sumList = [];
    for(let e = 0; e<point.length; e++){
        sumList.push(point[e].reduce((a,b) => (a+b)));
    }

    let max = sumList.reduce((a,b)=>a>b ? a : b);

	let dic = [5,1,3,4,2];

	let maxIndex = [];
	for(let z = 0; z<sumList.length; z++){
    	if(max === sumList[z]){
    		maxIndex.push(z);
    	}
	}

	let minDic = [];

	if(maxIndex.length === 1){
    	answer = table2[maxIndex[0]][0];
	}else {
    	for(let c =0; c<maxIndex.length; c++){
        	minDic.push(dic[maxIndex[c]]);
    	}
    let max2 = minDic.reduce((a,b)=>a>b ? b : a);
    answer = table2[dic.indexOf(max2)][0];
	}
return answer;
}

결과


테스트 케이스는 모두 성공으로 나왔는데 채점하기를 누르면 테스트9가 계속 런타임에러가 떴다. 정확히 어떤 오류인지도 모르겠고 아무리 봐도 안보여서 몇시간동안 같은 코드만 뚫어져라 쳐다보고 있었다...😭 (그래도 덕분에 런타임에러에 대해서 공부할수 있었다..오히려 좋아🙏🏻)
런타임에러에 관해서 보고 또보고 이것저것 바꾸고하다가 일단은 코드 길이를 조금 줄여봤는데

두번째로 내가 실패한 코드!

// for(let j = 0; j<languages.length; j++ ){
    //     for(let k =0; k <5 ; k++){
    //         for(let w = 1; w < 6; w++){
    //             if(languages[j]===table2[k][w]) {
    //                 point[k].push(preference[j]*(6-w));
    //             } 
    //         }
    //     }
    // }
    for(let j = 0; j<languages.length;j++){
        for(let k =0; k<5;k++){
            if(table2[k].indexOf(languages[j])!== -1){
            point[k].push(preference[j]*(6-	table2[k].indexOf(languages[j])));
            }
        }
    }

잡아야할 런타임 에러는 그대로 못잡고 for문이 너무 중복되어있어서 혹시 그러진 않을까라고 되도 않는 추측을 하고 수정해봤다... 그러나 결론은 똑같고 다시한번 런타임에러에 대해 공부...✏️
그러던중...

이걸보고 순간 혹시...? 하는 생각이 들었다고 한다...

저 선언해주면서도 생긴게 썩 맘에 들지 않았던 저 2차원 배열...저기가 문제였다...💥
선호 언어에 대한 점수가 하나도 해당되지 않는 경우가 생기면 빈배열이 생기게 되면서
이부분에서 각 배열안 값들의 합을 구할때 빈배열을 더해야하는 상황이 되면서 런타임에러가 발생하는 이유처럼 할당된 크기를 넘어서게 되지 않았을까 조심스럽게 예상해본다...아직 확실하진 않다🤷🏻‍♂️
그래서 결론은 빈배열은 생기지 않게 하면서 합을 구하는 결과에는 영향을 주지 않도록
0을 모든 배열에 넣어주었다. 그렇게 런타임에러를 잡았다...😀

최종 코드

function solution(table, languages, preference) {
    let point= [[0],[0],[0],[0],[0]];
    let table2 = [];
    var answer = '';

    for(let i = 0; i< table.length; i ++){
        table2.push(table[i].split(' '));
    } // 각 직업별 언어우선순위 배열로 만들기
    for(let j = 0; j<languages.length;j++){
        for(let k =0; k<5;k++){
            if(table2[k].indexOf(languages[j])!== -1){
            point[k].push(preference[j]*(6-table2[k].indexOf(languages[j])));
            }
        }
    }
	let sumList = [];
    for(let e = 0; e<point.length; e++){
        sumList.push(point[e].reduce((a,b) => (a+b)));
    }
    let max = sumList.reduce((a,b)=>a>b ? a : b);
    let dic = [5,1,3,4,2];

    let maxIndex = [];
    for(let z = 0; z<sumList.length; z++){
        if(max === sumList[z]){
        maxIndex.push(z);
        }
    }
    let minDic = [];

    if(maxIndex.length === 1){
        answer = table2[maxIndex[0]][0];
    }else {
        for(let c =0; c<maxIndex.length; c++){
            minDic.push(dic[maxIndex[c]]);
        }
        let max2 = minDic.reduce((a,b)=>a>b ? b : a);
        answer = table2[dic.indexOf(max2)][0];
    }
    return answer;
}

다른 사람들의 풀이

function solution(table, languages, preference) {
    return table.map((r) => r.split(' '))
                .map((t) => [...t.splice(0, 1), t])
                .map(([t, arr]) => [t,
                     languages.reduce((acc, l, i)=> {
                        acc += (5 - (arr.indexOf(l) === -1 ? 5 : arr.indexOf(l)))
                                    * preference[i];
                        return acc;
                     }, 0)])
                .sort((a, b) => b[1] - a[1] - (a[0] < b[0]))[0][0]
}

결론은 더 다양한 메서드들을 공부해서 익숙하게 쓸수 있도록 연습하자...
화이팅...🥲

profile
Life is all about timing.

0개의 댓글