- 발행일
99클럽 코테 스터디 18일차 TIL + 오늘의 학습 키워드: 탐욕법
99클럽 코테 스터디 18일차 TIL + 오늘의 학습 키워드: 탐욕법
이 글은 네이버 블로그에 2025년 3월 7일에 올렸던 것을 그대로 옮겨온 것입니다.
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let N, K;
let input = [];
rl.on("line", function (line) {
if (!N) {
N = +line;
} else if (!K) {
K = +line;
} else {
input = line.split(" ").map(Number);
rl.close();
}
}).on("close", function () {
let result = 0; // 정답을 담을 변수
input.sort((a, b) => a - b);
let D = []; // 거리 격차를 담을 배열
for (let i = 1; i < N; i++) {
const gap = input[i] - input[i - 1];
D.push([i - 1, gap]);
}
// 집중국의 수신 가능 영역을 나눌 특정 위치를 담을 배열
// K - 1번 나누어 주면 K개 영역으로 나눌 수 있으므로 K - 1번
// 나누어 주고, 위치를 기준으로 오름차순 정렬
// 수신 가능 영역별로 거리를 구하기 위해 반드시 마지막 위치또한
// 포함되어 있어야 하므로, [마지막 위치, 의미없는 값]을 push
S = [...D]
.sort((a, b) => b[1] - a[1])
.slice(0, K - 1)
.sort((a, b) => a[0] - b[0]);
S.push([N - 1, 0]);
let index = 0;
let start = 0;
while (index < S.length) {
const [end, _] = S[index++];
for (let i = start; i < end; i++) {
// D배열은 센서들의 거리 격차를 담고 있는 배열입니다.
// S에 담긴 수신 가능 영역으로 나눌 위치를 기준으로
// 수신 가능 영역별로 거리를 정답에 더해줍니다.
result += D[i][1];
}
start = end + 1;
}
console.log(result);
process.exit();
});
공부한 내용 본인의 언어로 정리하기
오늘의 회고
어떤 문제가 있었고, 나는 어떤 시도를 했는지
어떻게 해결했는지
무엇을 새롭게 알았는지
내일 학습할 것은 무엇인지
• 비기너: https://www.acmicpc.net/problem/26042 (45분)
• 미들러: https://www.acmicpc.net/problem/2212 (1시간 30분)
• 챌린저: https://school.programmers.co.kr/learn/courses/30/lessons/214288 (1시간 30분)
비기너(스택/큐) / 다리를 지나는 트럭 : https://school.programmers.co.kr/learn/courses/30/lessons/42583
미들러 (그리디 ) / 단속카메라 : https://school.programmers.co.kr/learn/courses/30/lessons/42884
챌린저(카카오 인턴 쉽) / 행렬과 연산 : https://school.programmers.co.kr/learn/courses/30/lessons/118670
필수 해시태그: #99클럽 #코딩테스트준비 #개발자취업 #항해99 #TIL
