Front-End

프로그래머스 기초트레이닝 20일차 본문

알고리즘

프로그래머스 기초트레이닝 20일차

jeongsso 2023. 10. 27. 13:40

이제 곧 기초 트레이닝이 끝납니다 ..!!!
이제 100문제가 넘었습니다.

 

 

 

문제 98.  수열과 구간 쿼리 4


문제 설명

정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [s, e, k] 꼴입니다.
각 query마다 순서대로 s ≤ i ≤ e인 모든 i에 대해 i가 k의 배수이면 arr[i]에 1을 더합니다.
위 규칙에 따라 queries를 처리한 이후의 arr를 return 하는 solution 함수를 완성해 주세요.

입출력 예

arr queries result
[0, 1, 2, 4, 3] [[0, 4, 1],[0, 3, 2],[0, 3, 3]] [3, 2, 4, 6, 4]

 

입출력 예 설명

 

 

저의 풀이!

function solution(arr, queries) {
 
    for (let i = 0; i < queries.length; i++) {
        const [s, e, k] = queries[i];

        for (let j = s; j <= e; j++) {
            if (j % k === 0) {
                arr[j] += 1;
            }
        }
    }
    return arr;
}
 
console.log(
    solution(
        [0, 1, 2, 4, 3],
        [
            [0, 4, 1],
            [0, 3, 2],
            [0, 3, 3],
        ]
    )
);

 

 

메모

일단 문제를 읽고 조건을 찾아봤습니다.
그리고 이중배열인 쿼리스를 s, e, k로 변수에 담아서 쓰면 편하겠다고 생각하고 구조분해를 사용했습니다.
일단 for로 queries의 구조분해를 적용하기 위해 queries만큼 배열으ㅜㄹ 순회하게끔 했습니다.

그리고 그안에 한번더 반복을 돌리되, 

조건에서 말했듯이 arr의 s부터 e까지 인덱스의 인수중에 j가 k의 배수이면 arr[i]에 1을 더하라 하였습니다.

그래서 그 반복문안에 반복문에서 조건을 k의 배수인지 확인한 후 그 부분을 +1을 하게끔했습니다!

 

 

 

 

 

문제 99.  2의 영역


문제 설명

정수 배열 arr가 주어집니다. 배열 안의 2가 모두 포함된 가장 작은 연속된 부분 배열을 return 하는 solution 함수를 완성해 주세요.
단, arr에 2가 없는 경우 [-1]을 return 합니다.


입출력 예

arr result
[1, 2, 1, 4, 5, 2, 9] [2, 1, 4, 5, 2]
[1, 2, 1] [2]
[1, 1, 1] [-1]
[1, 2, 1, 2, 1, 10, 2, 1] [2, 1, 2, 1, 10, 2]

 

 

입출력 예 설명

2가 있는 인덱스는 1번, 5번 인덱스뿐이므로 1번부터 5번 인덱스까지의 부분 배열인 [2, 1, 4, 5, 2]를 return 합니다.

2가 한 개뿐이므로 [2]를 return 합니다.

2가 배열에 없으므로 [-1]을 return 합니다.

2가 있는 인덱스는 1번, 3번, 6번 인덱스이므로 1번부터 6번 인덱스까지의 부분 배열인 [2, 1, 2, 1, 10, 2]를 return 합니다.

 

저의 풀이!

function solution(arr) {
    let 첫번째 = arr.indexOf(2);
    let 마지막 = arr.lastIndexOf(2);

    // if (arr.includes(2)) return arr.slice(첫번째, 마지막 + 1);
    // else return [-1];

    return 첫번째 === -1 ? [-1] : arr.slice(첫번째, 마지막 + 1);
}

console.log(solution([1, 2, 1]));

 

 

메모

일단 문제를 봤을 때 처음 2가나온 부분과 마지막에 나온 2까지 잘라서 내보내면됩니다!
그리고 slice를 할 때마다 주의할것은 마지막 인덱스를 적을때는 그부분이 포함되지 않게 잘리니까
포함되게끔하고싶으면 +1을 꼭해야한다!

 

 

 

문제 100.  리스트 자르기


문제 설명

정수 n과 정수 3개가 담긴 리스트 slicer 그리고 정수 여러 개가 담긴 리스트 num_list가 주어집니다. slicer에 담긴 정수를 차례대로 a, b, c라고 할 때, n에 따라 다음과 같이 num_list를 슬라이싱 하려고 합니다.

n = 1 : num_list의 0번 인덱스부터 b번 인덱스까지
n = 2 : num_list의 a번 인덱스부터 마지막 인덱스까지
n = 3 : num_list의 a번 인덱스부터 b번 인덱스까지
n = 4 : num_list의 a번 인덱스부터 b번 인덱스까지 c 간격으로
올바르게 슬라이싱한 리스트를 return하도록 solution 함수를 완성해주세요.


 

입출력 예

n slicer num_list result
3 [1, 5, 2] [1, 2, 3, 4, 5, 6, 7, 8, 9] [2, 3, 4, 5, 6]
4 [1, 5, 2] [1, 2, 3, 4, 5, 6, 7, 8, 9] [2, 4, 6]

 

 

입출력 예 설명

[1, 2, 3, 4, 5, 6, 7, 8, 9]에서 1번 인덱스부터 5번 인덱스까지 자른 리스트는 [2, 3, 4, 5, 6]입니다.

[1, 2, 3, 4, 5, 6, 7, 8, 9]에서 1번 인덱스부터 5번 인덱스까지 2개 간격으로 자른 리스트는 [2, 4, 6]입니다.

 

 

저의 풀이!

function solution(n, slicer, num_list) {
 
    const [a, b, c] = slicer; // 상수선언
    let array = [];

    if (n === 1) {
        array = num_list.slice(0, b + 1);
    } else if (n === 2) {
        array = num_list.slice(a);
    } else if (n === 3) {
        array = num_list.slice(a, b + 1);
    } else if (n === 4) {
        // return num_list.slice(a, b + 1).filter((_, i) => i % c === 0);
        for (let i = a; i <= b; i += c) {
            array.push(num_list[i]);
        }
    }
    return array;
}

console.log(solution(4, [1, 5, 2], [1, 2, 3, 4, 5, 6, 7, 8, 9]));
 
function solution1(n, slicer, num_list) {
let array = [];
const [a, b, c] = slicer; // 상수선언

switch (n) {
case 1:
array = num_list.slice(0, b + 1);
break;
case 2:
array = num_list.slice(a);
break;
case 3:
array = num_list.slice(a, b + 1);
break;
case 4:
for (let i = a; i <= b; i += c) {
array.push(num_list[i]);
}
}
return array;
}

console.log(solution1(4, [1, 5, 2], [1, 2, 3, 4, 5, 6, 7, 8, 9]));

 

 

메모

조건이 정확히 나열되어 있고, 그거에 맞게 끔만 조건문을 쓰면된다.
그리고 slicer는 구조분해를 이용해서 변수로 담아준다.
if 문으로도 해도되긴하는데, switch문으로도 가능하다 하여 

 

function solution1(n, slicer, num_list) {
    let array = [];
    const [a, b, c] = slicer; // 상수선언

    switch (n) {
        case 1:
            array = num_list.slice(0, b + 1);
            break;
        case 2:
            array = num_list.slice(a);
            break;
        case 3:
            array = num_list.slice(a, b + 1);
            break;
        case 4:
            for (let i = a; i <= b; i += c) {
                array.push(num_list[i]);
            }
    }
    return array;
}

console.log(solution1(4, [1, 5, 2], [1, 2, 3, 4, 5, 6, 7, 8, 9]));

 

 

 

문제 101.  문자열 묶기


문제 설명

문자열 배열 strArr이 주어집니다. 
strArr의 원소들을 길이가 같은 문자열들끼리 그룹으로 묶었을 때 
가장 개수가 많은 그룹의 크기를 return 하는 solution 함수를 완성해 주세요.

 

 

입출력 예

strArr result
["a","bc","d","efg","hi"] [1, 2, 3, 4, 5, 6, 0, 0]

 

입출력 예 설명

 

 

 

저의 풀이!

function solution(strArr) {
    let 그룹 = strArr.map(a => a.length);    
    let count = {};

    for (let i = 0; i < 그룹.length; i++) {
        count[그룹[i]] = count[그룹[i]] ? count[[그룹[i]]] + 1 : 1;
    }
    return Object.values(count).sort((a, b) => b - a)[0];
}

console.log(solution(['a', 'bc', 'd', 'efg', 'hi']));

 

 

메모

일단 배열에 있는 글자들의 개수를 확인해서 배열로 변경했습니다.
그리고 반복하며 다시 순회하면서 중복된 글자 개수숫자를 확인해서 +1씩하고 
그중 제일 큰 수를 뽑아냈습니다.

이 아래있는 거는 for let Of 라는 메서드를 사용해서
하나씩 순회하게끔 했습니다.

function solution1(strArr) {
    let answer = Array(31).fill(0);
    // console.log(answer);
    for (let str of strArr) {
        answer[str.length]++;
        console.log(answer);
    }
    return Math.max(...answer);
}

console.log(solution1(['a', 'bc', 'd', 'efg', 'hi']));
Comments