[TIL] 24.09.29 SUN

GDORI·2024년 9월 29일
0

TIL

목록 보기
56/79
post-thumbnail

오늘 푼 알고리즘 코드카타

42578. 의상

풀이

이 문제는 경우의 수로 풀 수 있다. 의상종류 중 하나는 무조건 착용해야 하며(전체 다 미착용 불가) 동일한 종류의 옷은 못입는다. 그러면 각 의상 종류의 수에 안 입는 경우 한가지를 추가하고 그 수들을 곱한 후 전체 안입는 경우의 수를 빼주면 원하는 답이 나온다.

예시 상의 2벌과 하의 1벌이 있을 경우

  • 계산식
    (상의 갯수 + 1) * (하의 갯수 + 1) -(아예 안입는 것 = 1)
  • 결과
    3 * 2 - 1 = 5

결과는 5가지의 경우의 수가 나오게 된다. 근데 여기서 만약 옷의 종류가 한벌이라면?
한 종류는 무조건 입어야 하며 같은 종류는 중복되지 않는다는 조건이 있기 때문에 가진 옷의 수량이 경우의 수가 된다.

JS 코드

function solution(clothes) {
    const deduplicationClothes = new Set(clothes); // 중복된 옷의 종류를 제거한다. 제한사항에 들어있기 때문에 굳이 안넣어도 된다.
    const clothesMap = new Map(); // 옷의 종류와 벌수를 체크하기 위하여 Map 객체를 이용한다.
    
    [...deduplicationClothes].map((cloth) => {
        // 만약 clothesMap 안에 같은 종류의 옷이 있다면 +1을 없다면 새로 추가해준다.
        if(clothesMap.has(cloth[1])){
            clothesMap.set(cloth[1],clothesMap.get(cloth[1])+1);
        }else{
            clothesMap.set(cloth[1],1);
        }
    });
    // Map.values()는 iterater 객체로 반환되기 때문에 reduce를 사용하기 위하여 스프레드 연산자로 배열화 시켜준다.
    const clothesValues = [...clothesMap.values()];
    // 만약 한 종류의 옷만 가지고 있다면, 즉시 그 종류의 벌수를 반환한다.
    if(clothesValues.length === 1) return clothesValues[0];
    // 경우의 수를 reduce를 이용하여 구한다.
    const result = clothesValues.reduce((acc,cur)=>acc*(cur+1),1);
    // 전체 안입는 경우를 빼준 경우의 수를 반환한다.
    return result - 1;
    
}

131127. 할인 행사

풀이

위 문제는 슬라이딩 윈도우 기법으로 풀면 되는 문제이지만, 비슷한 방법으로 구현해보았다. 방식에 대하여 코드에서 설명하겠다.
문제는 일정 금액을 지불하면 10일동안 회원의 자격을 부여하고 회원은 하루마다 정해져있는 세일 상품을 하나씩 구매할 수 있다. 알뜰대왕 좀현이는 자신이 원하는 제품들을 10일 연속 내로 구매할 수 있을 경우 회원가입을 하려고 한다. 여기서 원하는 제품 모두를 할인 받을 수 있는 날짜의 총 일수를 구해서 반환하고 없으면 0을 반환하라는 문제이다.

js코드

function solution(want, number, discount) {
    // 계산하기 좋게 원하는 아이템과 수량을 맵으로 관리하기 위하여 생성해준다.
    const wantItemMap = new Map();
    // 총 구매를 희망하는 수량이 몇개인지 구한다. 어차피 10개인데 아닐 경우를 활용하기 위하여 써준다.
    const wantItemAmount = number.reduce((acc, cur) => acc + cur, 0);
    // 연속 10일 내 구매 가능한 일수가 얼마나 되는지 체크하기 위하여 변수를 선언한다.
    let result = 0;
    
    // for문을 통하여 원하는 아이템 - 수량 Map을 셋팅해준다.
    for (let i = 0; i < want.length; i++) {
        wantItemMap.set(want[i], number[i]);
    }
    // 원하는 수량만큼 반복문 돌릴 횟수를 빼준다. 사유는 어차피 원하는 수량보다 낮으면 해당되지 않기 때문이다.
    for (let i = 0; i <= discount.length - wantItemAmount; i++) {
        // 원본 Map의 데이터를 보존하기 위하여 새로운 Map 객체에 복사한다.
        const ItemMap = new Map(wantItemMap);
        // 현재 위치부터 원하는 수량만큼까지 반복문을 돌려 원하는 아이템이 Map에서 다 제거되는지 확인한다.
        for (let j = i; j < i + wantItemAmount; j++) {
            // 만약 해당 아이템이 Map에 있으면 1개를 줄이고 0이라면 목록을 삭제한다.
            if (ItemMap.has(discount[j])) {
                ItemMap.set(discount[j], ItemMap.get(discount[j]) - 1);
                if (ItemMap.get(discount[j]) === 0) {
                    ItemMap.delete(discount[j]);
                }
            }
        }
        // 원하는 아이템 구매목록 Map이 다 비워졌다면 연속된 일 수 내에 구매 가능하다는 뜻으로 result를 하나 추가한다.
        if (ItemMap.size === 0) {
            result ++;
        }
    }
    
    // 최종 가능한 일수를 반환한다.
    return result;
}

오늘 푼 SQL 코드카타

131529. 카테고리 별 상품 개수 구하기

59409. 중성화 여부 파악하기

59040. 고양이와 개는 몇 마리 있을까

DECODE (원하는 컬럼, 1순위, 2순위, ....)

만약 ORDER BY 를 이용할 때 원하는 컬럼을 1순위로 하고 나머지는 오름차순 하고 싶을 때 DECODE를 이용하면 된다.

ORDER BY FIELD(ANIMAL_TYPE,'Cat') DESC, ANIMAL_TYPE ASC
profile
하루 최소 1시간이라도 공부하자..

0개의 댓글