[JavaScript][Programmers] 직업군 추천하기

조준형·2021년 8월 23일
0

Algorithm

목록 보기
84/142
post-thumbnail

🔎 직업군 추천하기

❓ 문제링크

https://programmers.co.kr/learn/courses/30/lessons/84325

📄 제출 코드

function solution(table, languages, preference) {
  let job = {};

  for (let i = 0; i < table.length; i++) {
    let tmp = table[i].split(' ');
    let sum = 0;
    console.log(`tmp : ${tmp}`);
    for (let j = 0; j < preference.length; j++) {
      for (let k = 0; k < tmp.length; k++) {
        if ( languages[j] == tmp[k]) {
          console.log(languages[j], preference[j])
          sum += (6 - k) * preference[j];
          break;
        }
      }
    }
    job[tmp[0]] = sum;
  }

  let sortedJob=
  Object.keys(job).sort().reduce(
    (newObj,key) => {
      newObj[key] = job[key];
      return newObj;
    },
    {}
  );
  console.log(sortedJob);
  let max = Math.max(...Object.values(sortedJob));
  let answer = Object.keys(sortedJob).find(key => sortedJob[key] === max);
  return answer;
}
let 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"];
let languages = ["JAVA", "JAVASCRIPT"];
let preference =  [7, 5];
console.log(solution(table, languages, preference));

3주차를 풀지못하고, 4주차가 되었다. 4주차문제는 가장 점수가 높은 직업군을 고르는 문제다.
구현보다는 객체로 정렬하고, 최대값찾는거에서 오래걸렸다.
처음에 구현했을 때는 단순히 최대값까지만 찾는걸 구했는데 두번째 테스트케이스에서 오답이 나왔다. 뭐가 잘못됐는가 했는데 SI와 PORTAL이 동점이라 앞에 있는 SI가 답으로 나온것 이였다.
그래서 job객체를 사전순으로 정렬할 필요가 있었다.

Object.keys(객체)로 key만 있는 배열을 가져와 sort()로 정렬한다.
그럼 정렬된 key배열을 reduce를 사용해 새 객체에 job[key]를 넣어 새로운 newObj를 만들어 리턴한다.
그 후 sortedJob의 value들만 모은 배열을 가지고 max값을 찾고, sortedJob에서 max값을 가진 key를 찾았다.

🎲 다른 코드

아무래도 3번 for문을 도는거라 다른 방법이 궁금했다.
다른 사람의 풀이중 you rim님 코드가 되게 깔끔해 보였다.

function solution(table, languages, preference) {
  const scores = table.map(job => {
    const scoreTable = job.split(' ').reverse();

    const score = languages.reduce(
      (acc, language, i) => acc + (scoreTable.indexOf(language) + 1) * preference[i],
      0
    );

    return { name: scoreTable[5], score };
  });

  return scores.sort((job1, job2) => {
    if (job1.score > job2.score) return -1;
    if (job1.score < job2.score) return 1;
    if (job1.name < job2.name) return -1;
    return 0;
  })[0].name;
}

📘 참고

https://velog.io/@try_catch/JS-value값으로-key값-찾기
https://velog.io/@sa02045/JS-Object-Key-기준으로-정렬

profile
깃허브 : github.com/JuneHyung

0개의 댓글