⭐ intro : 문제를 생각해나간 방식
이번에도 얼추 중복문제 추리는 문제일것으로 예상하고 Set() 쓰면 되려나 싶었는데 key, value값이 다 필요하더이다... 겸사겸사 다시 Map() 유형도 다시 파악할 수 있겠다 싶었다.
일단 문제는 금방 파악되었다. 첫줄에 브실이가 수강한 과목수 N, 대입전형에 필요한 과목수 M, 브실대학에서 공개한 과목수 K가 주어지고, 아래에는 N개수만큼 브실이의 성적들이 나열되고, 이어서 K개 개수만큼 필요한 과목수가 나열되어있다. 여기서 얼추 내가 생각한 방향은 다음과 같다
- input에 들어오는 매개변수의 정리
- 브실이가 수강한 과목들을 오름차순으로 정렬
- 정렬하면서 대학의 필수과목들을 각각 최소, 최대값에 저장해두고 Map에서 제거
- 제거된 Map에서 최소, 최대값을 더하되 공개한 과목수에서 필수과목수만큼 뺀만큼 index를 순회하면서 최소, 최대값 넣어주
- 최소최대값 같은 경우는 오름차순으로 정렬되어 있으므로 위에서부터 더하면 최소값들을 더하는거고 맨 뒤에서부터 더하면 최대값들을 더하는 것으로 인지.
위의 과정대로 흐름을 살펴보자
⭐ 풀이과정
먼저 input에 들어오는 매개변수들을 정리해주었다. 먼저 크게 조건문 부분과 항목 부분을 nums, rest로 나누고, nums같은 경우는 계속 아래에서 숫자값으로 활용되어야 하므로 새롭게 Number를 씌워준 배열로 뱉어내도록 map을 돌렸다. 그리고 브실이의 수강과목들은 위 nums가 제거된 항목기준으로 K미만으로 slice해주고 필수과목들은 K이상 K+N개 미만으로 slice해주어서 기본 input 재료다지기를 완료했다.
// input 들어오는거 싹 정리
const [nums, ...rest] = input;
const [K, M, N] = nums.map(Number);
const subject = rest.slice(0, K);
const must = rest.slice(Number(K, K + N));
다음으로 return값으로 최소,최대값 변수를 설정해두고 브실이가 수강한 과목들을 오름차순으로 정렬한 후, 정렬한 과목들을 Map에다 넣어둔다.
let min = 0;
let max = 0;
const sort = subject.sort((a, b) => Number(a[1]) - Number(b[1]));
const arr = new Map();
sort.forEach((value) => {
arr.set(value[0], Number(value[1]));
});
필수항목인 must를 순회하면서 정렬한 Map 과목들과 일치하는 과목들을 min,max 변수에 값을 더해주고 Map에서 제거한다. Map의 전용 메서드인 has(), get(), delete()를 이용한다.
must.forEach((value) => {
if (arr.has(value[0])) {
min += arr.get(value[0]);
max += arr.get(value[0]);
arr.delete(value[0]);
}
});
마지막으로 중복값이 제거된 Map을 일반 배열로 만들어 둔뒤, 오름차순으로 되어있는것을 이용해서 공개한 과목수에서 필수과목수를 제외한 값만큼 0번째에서부터 돌고, 필수값이 제거된 정렬된 값 길이에서부터 마찬가지의 값을 제거해준다.
// 제거된 과목들을 다시 배열로 만들어서 index번호로 넣을 수 있게 만들기
const setArr = Array.from(arr);
let viewNum = M - N;
// 최소값 더하기
for (let i = 0; i < viewNum; i++) {
min += setArr[i][1];
}
// 최대값 더하기
for (let i = K - N; i > K - N - viewNum; i--) {
max += setArr[i - 1][1];
}
말을 좀 어렵게 했는데 사실 이 부분을 조금 더 편하게 다뤄볼 수 있을 법 하다... reduce 메서드를 이용하면 배열의 값을 더할 수 있었던것 같은데 일단 우겨넣기라도 이렇게해서 구현해보았다. 암튼 이렇게해서 작업하면, 코드 데끼-아가릿!
⭐ 제출답안
// input 들어오는거 싹 정리
const [nums, ...rest] = input;
const [K, M, N] = nums.map(Number);
const subject = rest.slice(0, K);
const must = rest.slice(Number(K, K + N));
function solution(K, M, N, subject, must) {
let min = 0;
let max = 0;
const sort = subject.sort((a, b) => Number(a[1]) - Number(b[1]));
// 맵 할당해서 현 기준 필수과목 점수에 넣어두고, 필수과목 항목 제외
const arr = new Map();
sort.forEach((value) => {
arr.set(value[0], Number(value[1]));
});
must.forEach((value) => {
if (arr.has(value[0])) {
min += arr.get(value[0]);
max += arr.get(value[0]);
arr.delete(value[0]);
}
});
// 최소, 최대값 구하기
const setArr = Array.from(arr);
let viewNum = M - N;
for (let i = 0; i < viewNum; i++) {
min += setArr[i][1];
}
for (let i = K - N; i > K - N - viewNum; i--) {
max += setArr[i - 1][1];
}
return console.log(min, max);
}
solution(K, M, N, subject, must);
⭐ 공부했던 개념들
맵과 셋
ko.javascript.info
'Algorithm' 카테고리의 다른 글
99클럽 코테 스터디 16일차 TIL - Intersection of Two Arrays (리트코드 349 / JavaScript) (0) | 2025.04.22 |
---|---|
99클럽 코테 스터디 15일차 TIL - 학생 인기도 측정 (백준 25325 / JavaScript) (0) | 2025.04.21 |
99클럽 코테 스터디 13일차 TIL - 단어 정렬(백준 1181 / JavaScript) (0) | 2025.04.17 |
99클럽 코테 스터디 12일차 TIL - 임스와 함께하는 미니게임 (백준 25757 / JavaScript) (0) | 2025.04.16 |
99클럽 코테 스터디 11일차 TIL - Repeated DNA Sequences (리트코드 187 / JavaScript) (2) | 2025.04.15 |