[220212] TIL

릿·2022년 2월 12일
0

TIL

목록 보기
2/28

1. 정보처리기사 필기공부

  1. 프로그래밍 언어 활용
    1) 서버프로그램 구현
    2) 프로그래밍 언어 활용

2. 코테

졸업 선물 (완전탐색)

  1. 문제: 학생들이 각자 선물가격, 배송비를 적어서 냈고, 선생님은 한정된 예산을 가지고 최대한 많은 학생에게 선물을 사주고 싶다. 선생님은 하나의 선물가격을 반값에 살 수 있는 쿠폰을 가지고 있다.(배송비X) 최대 학생수를 출력하라. (2차원 배열)

  2. 고민했던 점
    -선물가격과 배송비를 합친 금액을 오름차순으로 정렬하고 싶었는데 합친 금액을 임시배열에 넣고 정렬하면 반값 선물가격금액을 뺄 수가 없음. 그럴려면 2차원 배열을 정렬해야하는데 그건 방법을 모름...

-선물가격이 제일 비싼 걸 반값으로 해야하나, 하나하나를 다 시도 해야하나, sum변수에 들어가있는 걸 하나씩 반값을 빼보고 다음 선물을 살 수 있을때까지 시도해보고 안되면 제일 비싼거 빼고....어흑ㅠㅠ..2중 for문인 건 알겠는데 변수를 썼다 지웠다 썼다 지웠다... 아무튼 말로 다 할 수 없는 어려움이었다. 결국 못 품...

  1. 쌤 풀이
    -상품가격, 배송비 더한 값을 오름차순으로 정렬을 한다.(sort내장함수 사용)
    -> 2차원배열의 sort함수 정렬방법에 대해서 알게 되었다.
    -굳이 제일 비싼 상품가격을 반값으로 할인할 필요는 없다. 모든 경우를 다 시도해보아야 한다.
function solution(m, product){
    let answer=0;
    let n=product.length;
    product.sort((a, b) => (a[0]+a[1])-(b[0]+b[1]));

    for(let i=0; i<n; i++){
        let money=m-(product[i][0]/2+product[i][1]);
        let cnt=1;
        for(let j=0; j<n; j++){
            if(j!==i && (product[j][0]+product[j][1])>money) break;
            if(j!==i && (product[j][0]+product[j][1])<=money) {
                money-=(product[j][0]+product[j][1]);
                cnt++;
            }
        }
        answer=Math.max(answer, cnt);
    }
    
    
    
    return answer;
}

let arr=[[6, 6], [2, 2], [4, 3], [4, 5], [10, 3]];
console.log(solution(28, arr));
  1. 느낀점
    완전탐색 어려워ㅠ...
profile
항상 재밌는 뭔가를 찾고 있는 프론트엔드 개발자

0개의 댓글