Skip to content

Commit 2d74445

Browse files
committed
feat: [프로그래머스][greedy] 체육복 - 배열 버전 추가
1 parent 1411e89 commit 2d74445

File tree

2 files changed

+97
-3
lines changed

2 files changed

+97
-3
lines changed

ts-programmers/greedy/001_체육복.ts

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,51 @@
11
// https://school.programmers.co.kr/learn/courses/30/lessons/42862
22

33
{
4+
// 세번째 풀이 배열 버전
5+
function solution4(n: number, lost: number[], reserve: number[]): number {
6+
let answer = 0;
7+
8+
const studentArr: number[][] = [];
9+
10+
for (let i = 0; i < n; i++) {
11+
studentArr.push([i + 1, 1]);
12+
}
13+
14+
// 잃은개수 빼기
15+
for (const student of lost) {
16+
const idx = studentArr.findIndex(([num]) => num === student);
17+
if (idx !== -1) studentArr[idx][1] -= 1;
18+
}
19+
20+
// 여유분 더하기
21+
for (const student of reserve) {
22+
const idx = studentArr.findIndex(([num]) => num === student);
23+
if (idx !== -1) studentArr[idx][1] += 1;
24+
}
25+
26+
for (let i = 0; i < studentArr.length; i++) {
27+
const [, count] = studentArr[i];
28+
29+
if (count === 0) {
30+
// 왼쪽 학생
31+
if (i > 0 && studentArr[i - 1][1] === 2) {
32+
studentArr[i - 1][1] -= 1;
33+
studentArr[i][1] += 1;
34+
}
35+
// 오른쪽 학생
36+
else if (i < n - 1 && studentArr[i + 1][1] === 2) {
37+
studentArr[i + 1][1] -= 1;
38+
studentArr[i][1] += 1;
39+
}
40+
}
41+
}
42+
43+
return studentArr.filter(([, v]) => v >= 1).length;
44+
}
45+
46+
// test
47+
console.log(solution4(5, [2, 2, 2, 4], [1, 2, 3, 3, 5])); // 4
48+
449
// 세번째 풀이 - 여러 벌 도난 / 여러 벌 보유의 경우
550
// ex) lost = [2, 2, 4] / reserve = [1, 2, 3, 3, 5]
651

@@ -19,6 +64,7 @@
1964
for (let i = 1; i <= n; i++) {
2065
studentMap.set(i, 1);
2166
}
67+
console.log(studentMap);
2268

2369
// 잃은개수 빼기
2470
for (const student of lost) {
@@ -51,7 +97,7 @@
5197
}
5298

5399
// test
54-
console.log(solution3(5, [2, 2, 4], [1, 2, 3, 3, 5])); // 5
100+
// console.log(solution3(5, [2, 2, 4], [1, 2, 3, 3, 5])); // 5
55101

56102
// 두번째 풀이
57103
function solution2(n: number, lost: number[], reserve: number[]): number {

ts-programmers/greedy/003_큰_수_만들기.ts

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@
77
for (const char of number) {
88
const num = Number(char);
99

10+
// 이름 붙이기
11+
// 스택의 마지막 숫자가 현재 숫자보다 작으면 제거한다 (더 큰 숫자를 앞으로 배치)
12+
// 제거 가능한 기회(k)가 남아있는 동안 반복한다.
1013
while (k > 0 && answer.length && answer.at(-1)! < num) {
1114
answer.pop();
1215
k--;
1316
}
14-
15-
answer.push(num);
1617
}
1718

1819
// 만약 k 가 남았을 경우 뒤에서 잘라줘야함
@@ -25,4 +26,51 @@
2526

2627
// test
2728
console.log(solution('4177252841', 4)); // 775841
29+
30+
// solution2 - 함수형으로 분할해보고 assert 까지 적용해보기
31+
function isDescending(arr: number[]): boolean {
32+
for (let i = 0; i < arr.length - 1; i++) {
33+
if (arr[i] < arr[i + 1]) return false;
34+
}
35+
return true;
36+
}
37+
38+
function optimizeStack(stack: number[], num: number, k: number): number {
39+
// while 없애면 assert 터트릴 수 있음
40+
while (k > 0 && stack.length && stack.at(-1)! < num) {
41+
stack.pop();
42+
k--;
43+
}
44+
stack.push(num);
45+
console.assert(
46+
isDescending(stack),
47+
'스택의 숫자는 항상 내림차순이어야 함당'
48+
);
49+
return k;
50+
}
51+
52+
function solution2(number: string, k: number): string {
53+
const answer: number[] = [];
54+
55+
for (const char of number) {
56+
const num = Number(char);
57+
k = optimizeStack(answer, num, k);
58+
}
59+
60+
if (k > 0) {
61+
answer.splice(-k);
62+
}
63+
64+
return answer.join('');
65+
}
66+
67+
// test
68+
console.log(solution2('4177252841', 4)); // 775841
2869
}
70+
// // ok, k > 0
71+
// [4]
72+
// [4, 1]
73+
74+
// // not ok
75+
// [7, 2, 5]
76+
// [1,2,3]

0 commit comments

Comments
 (0)