베스트셀러

문제

언어

  • JavaScript

순서도

  1. Map 을 이용해서 책의 이름을 key 값으로 해서 판매한 책의 개수를 value 값으로 세어줍니다.
  2. 그와 동시에, 가장 많이 판매한 책의 개수를 세어줍니다.
  3. Map 에서 value 값이 가장 많이 판매한 책의 개수와 동일한 책들을 모아서 배열에 넣어줍니다.
  4. 배열을 사전순으로 정렬하고, 가장 앞에 있는 값을 출력합니다.

문제 풀이 step 1

  • 김형택은 탑문고에서 계산을 하는 직원입니다. 근무가 끝나면 오늘 판매한 책 중에서 가장 많이 팔린 책의 제목을 칠판에 적어야 합니다.
  • 오늘 하루 동안 팔린 책의 제목이 입력으로 들어올 때, 김형택을 도와서 오늘 가장 많이 팔린 책을 찾아주는 문제입니다.
  • 우선 Map 을 선언합니다.
  • 오늘 하루 동안 팔린 책들의 제목들을 순회하며, Map 에 책의 제목을 key 값으로 팔린 책의 개수를 value 값으로 해서 기록하며, 가장 많이 팔린 책의 개수를 알아냅니다.
  • Map 을 순회하며 value 값이 가장 많이 팔린 책의 개수와 동일한 책들의 제목을 모아서 배열에 넣어줍니다.
  • 그 배열을 사전순으로 정렬하고, 가장 앞에 있는 값을 출력하면 정답이 됩니다.
  • 추가 설명은 주석으로 작성하겠습니다.

소스 코드

const input = require("fs")
	.readFileSync("/dev/stdin")
	.toString()
	.trim()
	.split("\n");

const solution = (input) => {
	const n = Number(input[0]);

	// Map 선언
	const map = new Map();
	let max = 0;
	// 오늘 하루 팔린 책들의 제목들을 순회하며
	for (let i = 1; i < n + 1; i++) {
		const key = input[i];
		// map 에 key 값은 책의 제목, value 값은 팔린 책의 개수를 저장합니다.
		map.set(key, map.get(key) ? map.get(key) + 1 : 1);

		// 팔린 책의 개수의 최댓값을 갱신합니다.
		max = Math.max(max, map.get(key));
	}

	const res = [];
	// map 에서 value 값이 팔린 책의 개수의 최댓값과 같은 책의 제목들을 모아서 배열에 넣습니다.
	for (let [key, value] of map) {
		if (value === max) res.push(key);
	}

	// 배열을 사전순으로 정렬하고 가장 앞에 있는 값을 출력합니다.
	return res.sort()[0];
};

console.log(solution(input));