알고리즘(with TS)
알고리즘 풀이 4)4-5 (완전탐색-블루투포스) & TS(unknown타입, Set타입)
S_sunny
2023. 1. 29. 13:36
Section4_4번: 졸업선물
function solution4_4(M: number, arr: Array<number[]>): any {
let sortedWish: Array<number[]> = [];
//쿠폰+배송비 적용시 낮은 가격순
sortedWish = arr.sort((a, b) => ((a[0]/2+a[1]) - (b[0]/2+b[1])));
let total = 0;
let count:number = 1;
// 낮은 가격부터 추가하면서 마지막 상품에 쿠폰을 적용시켜보고 예산보다 적으면 다시 빼기
sortedWish.push([100000, 100000])
for (let i=0; i<sortedWish.length; i++) {
const priceNoCoupon = sortedWish[i][0] + sortedWish[i][1] ;
const priceUseCoupon = sortedWish[i+1][0]/2 + sortedWish[i+1][1];
total += priceNoCoupon+priceUseCoupon;
if(total <= M) {
count++;
total -= priceUseCoupon;
}else break;
}
return count;
}
console.log(
solution4_4(28, [[6, 6], [2, 2], [4, 3], [4, 5], [10, 3]])
);
- 쿠폰+배송비 적용시 낮은가격 순으로 정렬 후, 마지막 가격에 쿠폰을 적용해 보면서 예산(M)이랑 비교함
- for문이 돌때마다 새로운 블록스코프가 만들어지기 때문에 const선언이 가능하다.
- for문에서 빠져나가려면 break;
- 배열에서 없는 인덱스 계산하려고 하면 undefined 뜨니까
헤멨던 부분)
4가 나와야 할텐데 왜 7이 나올까 -> while문 동작 다시 이해하기
let sum = 0;
let count = 0;
for (let ele of sortedWish) {
while (sum < M) {
sum += (ele[0] + ele[1]);
count++;
} //while 조건이 맞으니까 이 스코프 안에서만 계~속 반복했다.
}
return count;
Section4_5번: K번째 큰 수
function solution4_5(N: number, K: number, arr: number[]): any {
let answer = 0;
let sumsThreeNum: Set<number> = new Set();
// 타입을 별도로 지정해주지 않으면 Set<unknown> 타입이 된다.
for (let i = 0; i < N; i++) {
for (let j = i + 1; j < N; j++) {
for (let k = j + 1; k < N; k++) {
sumsThreeNum.add(arr[i] + arr[j] + arr[k]);
}
}
}
const sortedSums = [...sumsThreeNum].sort((a, b) => b - a);
return sortedSums[K-1]
}
console.log(solution4_5(10, 3, [13, 15, 34, 23, 45, 65, 33, 11, 26, 42]));
- Set 개체를 중복 제거할때만 사용했었는데 알고보니까 관련된 메소드 들이 있었다.
중복을 제거하는 Set 개체에 add() 메서드를 사용하면 개체의 맨 뒤에 해당 요소가 추가된다.
이번 풀이에서는 .add() 메소드를 사용해서 숫자 3개를 더한 값을 추가하는 식으로 사용했다.
- 타입스크립트 - unknown 타입!
처음에 타입 없이 Set 개체를 선언하고 풀어나갔는데 마지막에 sort를 하려니 타입 오류가 뜨면서 정렬을 할 수 없었다.
당연히 숫자(arr[i]) 가 들어갔으니 연산도 되어야 하는게 아닌가 하고 헤맸는데
unknown 타입의 개체에는 모든 타입이 담겨질 수 있지만,
숫자가 들어와도 number타입이 아닌 unknown타입이라 연산은 불가능 하는 것을 알게 됐다.
Set도 Set<> 이렇게 타입으로 줄 수 있다는것도 이번에 알게 됐다.