알고리즘(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<> 이렇게 타입으로 줄 수 있다는것도 이번에 알게 됐다.