개발자가 사용하는 언어와 언어 선호도를 입력하면 그에 맞는 직업군을 추천해주는 알고리즘을 개발하려고 합니다.
아래 표는 5개 직업군 별로 많이 사용하는 5개 언어에 직업군 언어 점수를 부여한 표입니다.
점수 | SI | CONTENTS | HARDWARE | PORTAL | GAME |
---|---|---|---|---|---|
5 | JAVA | JAVASCRIPT | C | JAVA | C++ |
4 | JAVASCRIPT | JAVA | C++ | JAVASCRIPT | C# |
3 | SQL | PYTHON | PYTHON | PYTHON | JAVASCRIPT |
2 | PYTHON | SQL | JAVA | KOTLIN | C |
1 | C# | C++ | JAVASCRIPT | PHP | JAVA |
직업군 언어 점수를 정리한 문자열 배열 table, 개발자가 사용하는 언어를 담은 문자열 배열 languages, 언어 선호도를 담은 정수 배열 preference가 매개변수로 주어집니다. 개발자가 사용하는 언어의 언어 선호도 x 직업군 언어 점수의 총합이 가장 높은 직업군을 return 하도록 solution 함수를 완성해주세요. 총합이 같은 직업군이 여러 개일 경우, 이름이 사전 순으로 가장 빠른 직업군을 return 해주세요.
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]
}
결론은 더 다양한 메서드들을 공부해서 익숙하게 쓸수 있도록 연습하자...
화이팅...🥲