본문 바로가기
Algorithm

99클럽 코테 스터디 15일차 TIL - 학생 인기도 측정 (백준 25325 / JavaScript)

by 륜곰 2025. 4. 21.

오늘의 문제 링크

 

⭐ intro : 문제를 생각해나간 방식

배열 반복문 문제이되 중복을 허용하는 방식으로 이해했었다. 애초에 문제에서 '내가 나를 좋아하는 예는 없다'라고 못밖아두었으니 한사람당 누구를 몇번 호출했는지 갯수를 세는 방식으로 생각했다. 

 

⭐ 풀이과정

 항상 input요소를 어떻게 분할할지가 문제의 첫번째 해결방안이 되는것 같다. 주어진 문제 조건이 크게 3종류로 나뉠 수 있으므로 3종류에 맞춰서 input을 자르도록 했고 앞 부분의 몇명인지 표기하는거는 굳이 쓰지 않을것 같아서 (왜냐하면 학생수 전체를 반복문 돌면 그 숫자니까...) 두번째, 세번째 부분만 구조분해할당으로 가져오도록 했다. (참고로 배열순서 기준으로 쓰지 않을 부분은 ' ,' 공백으로 남겨놓으면 된다) 변수명은 다음과 같은 기준으로 칭했다. 학생들의 종류, kind student라 해서 'kindStu', 그리고 살짝 낯부끄럽지만 인기도 적은 부분은 좋아하는 사람들...로 칭해서... lovers...❤️

// input 들어오는거 싹 정리
const [, kindStu, ...lovers] = input;

 

첫번째 kindStu를 순회해서 해당 key값을 가지는 Map을 생성해주도록 한다. 그 후 해당 Map의 key값을 토대로 반복문을 돌되 이 key값에 한해서 lovers로 한번 더 반복문을 순회하도록 했다. (해당부분에 있어서 런타임에러가 발생했었는데 아래 공부한 부분에 추가해두었다) lovers 배열 안 요소의 값이 kindStu 값을 가지면 임의의 변수 sum에 값을 넣고, 다 돌고나면 그 값을 Map의 value값에 넣도록 했다. 해당 두번째 반복문이 돌면 다시 sum은 0으로 초기화 해서 다음 해당값에 대응할 수 있도록 만들었다.

for (let value of result.keys()) {
  let sum = 0;
  lovers.forEach((value2) => {
    if (value2.includes(value)) {
      sum++;
      result.set(value, sum);
    }
  });
}

 

마지막으로 호출된 값을 예시에 맞게끔 sort 메서드를 이용하여 뒷값에서 앞값을 빼는 내림차순으로 정렬한 후, map으로 새로운 구조의 배열로 리턴하도록 만들어서 item의 첫번째, 두번째값을 호출하도록 만들었다. 해당 결과값으로 현재 함수의 리턴값으로 지정하면 해결 완!

const sort = Array.from(result)
  .sort((a, b) => b[1] - a[1])
  .map((item) => console.log(item[0], item[1]));

return sort;

 

⭐ 제출답안

const [, kindStu, ...lovers] = input;

function solution(kindStu, lovers) {
  const result = new Map();
  kindStu.forEach((value) => result.set(value, 0));

  for (let value of result.keys()) {
    let sum = 0;
    lovers.forEach((value2) => {
      if (value2.includes(value)) {
        sum++;
        result.set(value, sum);
      }
    });
  }

  const sort = Array.from(result)
    .sort((a, b) => b[1] - a[1])
    .map((item) => console.log(item[0], item[1]));

  return sort;
}

solution(kindStu, lovers);

 

⭐ 공부했던 개념들

- Map의 values()는 forEach로는 런타임 에러가 생긴다.

흠 iterable이니까 forEach로도 돌 수 있지 않나....? 어쨋든 예제에서는 for of로 반복문 돌리고 있었기에, 그리 썼지만 이 부분은 좀 더 공부해봐야 할것 같다.