고양이와 코딩

[프로그래머스] 12월04일 ~ 12월10일 본문

javascript

[프로그래머스] 12월04일 ~ 12월10일

ovovvvvv 2023. 12. 4. 22:28
728x90

12월04일

특정 문자열로 끝나는 가장 긴 부분 문자열 찾기

 

내 풀이

function solution(myString, pat) {
    let index = myString.lastIndexOf(pat);
    let answer = myString.substring(0, index + pat.length); 
    return answer;
}

 

 

문자열이 몇 번 등장하는지 세기

 

내 풀이

function solution(myString, pat) {
    let answer = 0;
    let found = myString.indexOf(pat);
    
    while (found !== -1){
        answer++;
        found = myString.indexOf(pat, found + 1);
    }
    return answer;
}

indexOf 사용!! 아직 익숙하진 않지만 생각은 난다..

indexOf 함수는 값이 없으면 -1을 반환하므로 while문에 조건을 저렇게 넣어주고, found + 1로 찾은 인덱스 이후부터
다시 찾는다 ㅎㅎ

 

ad 제거하기

 

첫 번째 풀이

function solution(strArr) {
    
    for (let i = 0; i < strArr.length; i++){
         if(strArr[i].includes("ad")){
             strArr.splice(i, 1);
         }
    }
    return strArr;
}

이렇게 하면 첫 테스트 케이스만 통과하고 나머지는 전부 실패한다.

"ad"가 들어간 문자열이 한 개 이상일수도 있으니 ! splice를 사용하지 말고 다른 방법을 찾아보자

 

제출한 코드

function solution(strArr) {
    return strArr.filter(item => !item.includes("ad"));
}

filter함수로 ad가 들어가지 않은 것만 추출한다.

 

공백으로 구분하기 1

 

내 풀이

function solution(my_string) {
    var arr_str = my_string.split(" ");
    return arr_str;
}

 

공백으로 구분하기 2

 

내 풀이

function solution(my_string) {
    let arr_str = my_string.split(/\s+/).filter(Boolean);
    return arr_str;
}

공백을 나타나는 정규표현식 \s+ 를 사용한다

 

12월05일

x 사이의 개수

 

내 풀이

function solution(myString) {
    var answer = [];
    var splitStr = myString.split("x");
    
    splitStr.forEach((value, index) => {
        answer.push(value.length);
    })
    return answer;
}

 

 

문자열 잘라서 정렬하기

 

내 풀이

function solution(myString) {
    const splitStr = myString.split("x");
    const filteredStr = splitStr.filter(value => value !== "");
    
    return filteredStr.sort();
}

 

간단한 식 계산하기

 

내 풀이

function solution(binomial) {
    const answer = eval(binomial);
    return answer;
}

eval() 함수는 사용을 지양하는 편이 좋습니다...

그래서 다르게도 풀어봤습니다

function solution(binomial) {
    const [a, op, b] = binomial.split(" ");
    const numA = parseInt(a);
    const numB = parseInt(b);
    
    if (op === "+") {
        return numA + numB;
    } else if (op === "-") {
        return numA - numB;
    } else {
        return numA * numB;
    }
}

 

 

문자열 바꿔서 찾기

 

내 풀이

function solution(myString, pat) {
    const splitStr = myString.split("");
    
    splitStr.forEach((value, index) => {
        if(value === "A") {
            splitStr[index] = "B"
        } else {
            splitStr[index] = "A"
        }
    })
    return splitStr.join('').includes(pat) ? 1 : 0;
}

 

 

12월06일

세 개의 구분자

 

첫 번째 풀이

function solution(myStr) {
    const arrStr = myStr.split(/[abc]/)
    return arrStr.length === 0 ? ["EMPTY"] : arrStr.filter(v => v !== "");
}

이렇게 하면 빈 배열일 경우에 ["EMPTY"]가 반환되지 않는다

 

 

제출한 코드

function solution(myStr) {
    const arrStr = myStr.split(/[abc]/);
    const nonEmptyArr = arrStr.filter(v => v !== "");
    return nonEmptyArr.length === 0 ? ["EMPTY"] : nonEmptyArr;
}

 

nonEmptyArr로 한번 더 문자열을 걸러 주어야 제대로 ["EMPTY"] 가 반환된다!

 

배열의 원소만큼 추가하기

 

내 풀이

function solution(arr) {
    var X = [];
    
    for(let i = 0; i < arr.length; i++){
        for(let j = 0; j < arr[i]; j++){
            X.push(arr[i]);
        }
    }
    return X;
}

 

 

빈 배열에 추가, 삭제하기

 

내 풀이

function solution(arr, flag) {
    let X = [];

    flag.forEach((value, index) => {
        if (value) {
            const repeatArr = Array(arr[index] * 2).fill(arr[index]);
            X = [...X, ...repeatArr];
        } else {
            X = X.slice(0, X.length - arr[index]);
        }
    });

    return X;
}

forEach문 안에서 repeatArr 변수를 만들지 않고 !! X에 바로 할당하면 오류가 난다는 것을 기억하자 !!

 

배열 만들기6

 

내 풀이

function solution(arr) {
    let stk = [];

    for (let i = 0; i < arr.length;) {
        if (stk.length === 0) {
            stk.push(arr[i]);
            i++;
        } else if (stk[stk.length - 1] === arr[i]) {
            stk.pop();
            i++;
        } else {
            stk.push(arr[i]);
            i++;
        }
    }

    return stk.length !== 0 ? stk : [-1];
}

 

 

무작위로 K개의 수 뽑기

 

내 풀이

function solution(arr, k) {
    var answer = [];
    
        for (let i = 0; i < arr.length; i++){
            if(!answer.includes(arr[i]) && answer.length < k){
                answer.push(arr[i]);
            }
        }
    let remainArr = k - answer.length;
    if (remainArr > 0){
        answer = answer.concat(new Array(remainArr).fill(-1));
    }
    return answer;
}

처음에는 for문을 while ( answer.length <= k) 이렇게 감싸주었는데, 문제에서도 말했듯 배열이 완성되도 answer의 길이가 k보다 작을 수 있으므로 이렇게 작성하면 안된다 !! (문제를 꼼꼼히 읽자)

대신 if문에 &&로 조건을 추가해주자.

그리고 k보다 길이가 작은 배열은 concat과 fill을 이용해서 -1로 채워서 반환해준다 ㅎㅎ

 

 

배열의 길이를 2의 거듭제곱으로 만들기

 

내 풀이

function solution(arr) {
    let len = arr.length;
    let pows = Math.pow(2, Math.ceil(Math.log2(len)));
    
    while (arr.length < pows) {
        arr.push(0)
    }
    return arr;
}

꼬옥 !! 다시 풀어봅시다 !!
처음에는 arr의 길이가 1000 이하로 제한되어 있어서 pows배열에 [2, 4, 8, 16, 32, 64, 128, 256, 512] 를 담아서 풀려고 했는데,
뭔가 계속 오류가 나서... ㅋ 수학적인 방법을 찾아찾아 풀게 되었다.
Math.log2(len)으로 밑이 2인 로그로 계산하고, Math.ceil()로 소수점 이하를 올림한다. 그리고 Math.pow로 2의 거듭제곱을 구하면

현재 arr.length에서 가장 가까운 2의 거듭제곱을 계산해준다!

 

배열 비교하기

 

내 풀이

function solution(arr1, arr2) {
    const arr1_len = arr1.length;
    const arr2_len = arr2.length;
    let arr1_sum = arr1.reduce((acc, curr) => acc + curr, 0);
    let arr2_sum = arr2.reduce((acc, curr) => acc + curr, 0);
    
    if (arr1.length !== arr2.length){
        return arr1_len > arr2_len ? 1 : -1;
    } else {
        if(arr1_sum !== arr2_sum){
            return arr1_sum > arr2_sum ? 1 : -1;
        } else {
            return 0;
        }
    }
}

 

 

문자열 묶기 

 

내 풀이

function solution(strArr) {
    const groups = strArr.reduce((acc, str) => {
        const len = str.length;
        acc[len] = (acc[len] || 0) + 1;
        return acc;
    }, {});

    return Math.max(...Object.values(groups));
}

객체를 만들어서 { '1' : 1, '2' : 2 , '3' :1 } 이런식으로 키 값쌍으로 저장을 한 뒤 마지막에 그 중 가장 큰 값을 출력합니다 !

 

 

12월08일

배열의 길이에 따라 다른 연산하기

 

내 풀이

function solution(arr, n) {
    return arr.map((value, index) => {
        if((arr.length % 2 !== 0 && index % 2 === 0) || (arr.length % 2 === 0 && index % 2 !== 0)){
            return value + n;
        }
        return value;
    });
}

 

 

뒤에서 5등까지

 

내 풀이

function solution(num_list) {
    const sorted_num = num_list.sort((a, b) => a - b);
    
    return sorted_num.slice(0, 5);
}

 

 

뒤에서 5등 위로

 

내 풀이

function solution(num_list) {
    const sorted_num = num_list.sort((a , b) => a - b);
    return sorted_num.slice(5, sorted_num.length);
}