본문 바로가기
코딩테스트/프로그래머스

[프로그래머스] 위클리 챌린지 > 4주차 - 자바스크립트

by 핸디(Handy) 2021. 8. 23.

[ 문제 설명 ]

 

코딩테스트 연습 - 4주차

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

programmers.co.kr


[ 아이디어 ]

총합을 key, 해당 직군 배열을 value로 하는 scoreMap을 활용.

언어점수 table를 순회하면서 점수를 구하고 scoreMap에 넣는다.

편이성을 위해 가장 큰 점수 maxScore를 별도로 들고 있다가 마지막에 key로 조회하고 같은 점수일 경우를 위해 sort를 한다.

[ 코드 ]

function solution(table, languages, preference) {
  var answer = "";
  let preferenceMap = {};
  let scoreMap = new Map();
  let maxScore = 0;

  languages.forEach((item, index) => {
    return (preferenceMap[item] = preference[index]);
  });

  table.forEach((item) => {
    let [career, ...languages] = item.split(" ");
    let score = 0;
    languages.forEach((language, index) => {
      if (preferenceMap[language] === undefined) return;
      score += preferenceMap[language] * (5 - index);
    });
    if (maxScore < score) maxScore = score;
    if (scoreMap.has(score)) {
      scoreMap.set(score, [career, ...scoreMap.get(score)]);
    } else {
      scoreMap.set(score, [career]);
    }
  });
  answer = scoreMap.get(maxScore).sort()[0];

  return answer;
}

 

[ 팁 ]

1. es6 문법인 비구조화할당을 위해 string에서 career와 langauges를 뽑아와 한번에 분리할 수 있게 되었다.

// 개선 전
let career = item.split(" ")[0]
let languages = item.split(" ").slice(1,6)

// 개선 후
let [career, ...languages] = item.split(" ")

 

2. 비구조화 할당을 이용해 배열을 간단히 합칠 수 있게 되었다.

if (scoreMap.has(score)) {
  scoreMap.set(score, [career, ...scoreMap.get(score)]); // 비구조화 할당
} else {
  scoreMap.set(score, [career]);
}

 


댓글