Front-End

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

알고리즘

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

jeongsso 2023. 9. 12. 18:33

 

 

문제 73.  특별한 이차원 배열 1


문제 설명

정수 n이 매개변수로 주어질 때, 다음과 같은 n × n 크기의 이차원 배열 arr를 return 하는 solution 함수를 작성해 주세요.
arr[i][j] (0 ≤ i, j < n)의 값은 i = j라면 1, 아니라면 0입니다.

입출력 예

n result
3 [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
6 [[1, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0], [0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 1]]
1 [[1]]

 

 

입출력 예 설명

 

저의 풀이!

function solution(n) {
    let answer = [];
    for (let i = 0; i < n; i++) {
        let inArr = [];

        for (let j = 0; j < n; j++) {
            i === j ? inArr.push(1) : inArr.push(0);
        }
        answer.push(inArr);
    }

    return answer;
}

console.log(solution(3));

 

 

메모

일단 이중배열을 만들어서 i와 j 가 같다면 1을 푸쉬하게끔 코드를 짰다.

new Array 로도 하는 법이있다고 다른사람들 풀이에 있지만,

조건문과 반복문을 사용해서 문제를 풀었다 .

 

 

 

 

 

문제 74.  콜라츠 수열 만들기


문제 설명

모든 자연수 x에 대해서 현재 값이 x이면 x가 짝수일 때는 2로 나누고, x가 홀수일 때는 3 * x + 1로 바꾸는 계산을 계속해서 반복하면 언젠가는 반드시 x가 1이 되는지 묻는 문제를 콜라츠 문제라고 부릅니다.
그리고 위 과정에서 거쳐간 모든 수를 기록한 수열을 콜라츠 수열이라고 부릅니다.
계산 결과 1,000 보다 작거나 같은 수에 대해서는 전부 언젠가 1에 도달한다는 것이 알려져 있습니다.
임의의 1,000 보다 작거나 같은 양의 정수 n이 주어질 때 초기값이 n인 콜라츠 수열을 return 하는 solution 함수를 완성해 주세요.

 

입출력 예

n result
10 [10, 5, 16, 8, 4, 2, 1]

 

 

입출력 예 설명

 

 

저의 풀이!

function solution(n) {
    let answer = [n];

    for (let i = 0; i < n; i++) {
        if (answer[i] % 2 === 0) {
            answer.push(answer[i] / 2);
        } else {
            if (answer[i] === 1) {
                break;
            }
            answer.push(3 * answer[i] + 1);
        }
    }

    return answer;
}

console.log(solution(10));

 

 

메모

반복문을 돌려 조건문으로 문제를 풀었다.

만약 1이 될 경우 break되도록 조건을 걸었고, 배열에 i 인덱스에 있는 숫자에서 계산을 해야하기때문에
빈배열에서 시작이아니고, n을 담고있는 배열에서 시작하게끔해서 계산을 유도하였다.

 

while문은 잘 사용해보지 않아서 풀어보지않았는데 

while문으로도 가능하다.

function solution1(n) {
    let answer = [n];

    // 조건식이 트루일 경우에 계속 반복해주는 반복문!
    // for 문은 정해진 횟수가 존재하지만, while은 조건식만 맞으면 계속 해줌
    while (n !== 1) {
        n % 2 === 0 ? (n = n / 2) : (n = 3 * n + 1);
        answer.push(n);
    }

    return answer;
}

 

 

 

문제 75.  간단한 식 계산하기


문제 설명

문자열 binomial이 매개변수로 주어집니다. 

binomial은 "a op b" 형태의 이항식이고 a와 b는 음이 아닌 정수, op는 '+', '-', '*' 중 하나입니다.

주어진 식을 계산한 정수를 return 하는 solution 함수를 작성해 주세요.

입출력 예

binomial result
"43 + 12" 55
"0 - 7777" -7777
"40000 * 40000" 1600000000

 

 

입출력 예 설명

예제 1번의 binomial은 "43 + 12"로 이 식을 계산한 결과인 43 + 12 = 55를 return 합니다.

예제 2번의 binomial은 "0 - 7777"로 이 식을 계산한 결과인 0 - 7777 = -7777을 return 합니다.

예제 3번의 binomial은 "40000 * 40000"으로 이 식을 계산한 결과인 40000 × 40000 = 1600000000을 return 합니다.

 

 

저의 풀이!

function solution(binomial) {
    var answer = new Function(`return ${binomial}`)();
    return answer;
}

console.log(solution('43 + 12'));

 

 

메모

new Function 을 이용해서 풀었습니다.

new Function 인자로 넣어주면 식 풀이가 가능하게됩니다.

 

 

switch로도 풀 수 있는데,

많이 써보지않아 익숙하지는 않지만 풀어보았습니다.

function solution1(binomial) {
    const 문자 = binomial.split(' ');

    const 문자1 = Number(문자[0]);
    const 문자2 = Number(문자[2]);

    switch (문자[1]) {
        case '-':
            return 문자1 - 문자2;
        case '+':
            return 문자1 + 문자2;
        case '*':
            return 문자1 * 문자2;
    }
}

console.log(solution1('0 - 7777'));

 

 

문제 76.  ad 제거하기


문제 설명

문자열 배열 strArr가 주어집니다. 

배열 내의 문자열 중 "ad"라는 부분 문자열을 포함하고 있는 모든 문자열을 제거하고 

남은 문자열을 순서를 유지하여 배열로 return 하는 solution 함수를 완성해 주세요.

입출력 예

strArr result
["and","notad","abcd"] ["and","abcd"]
["there","are","no","a","ds"] ["there","are","no","a","ds"]

 

 

입출력 예 설명

1번 인덱스의 문자열인 "notad"는 부분 문자열로 "ad"를 가집니다. 따라서 해당 문자열을 제거하고 나머지는 순서를 유지하여 ["and","abcd"]를 return 합니다.

"ad"가 부분 문자열로 들어간 문자열이 존재하지 않습니다. 따라서 원래 배열을 그대로 return 합니다.

 

 

저의 풀이!

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

console.log(solution(['and', 'notad', 'abcd']));

 

 

메모

이제 filter로 쉽게 풀어나갈 수 있습니다!

 

 

 

 

문제 77.  접미사 배열


문제 설명

어떤 문자열에 대해서 접미사는 특정 인덱스부터 시작하는 문자열을 의미합니다. 

예를 들어, "banana"의 모든 접미사는 "banana", "anana", "nana", "ana", "na", "a"입니다.
문자열 my_string이 매개변수로 주어질 때, 

my_string의 모든 접미사를 사전순으로 정렬한 문자열 배열을 return 하는 solution 함수를 작성해 주세요.

 

입출력 예

myString result
"banana" ["a", "ana", "anana", "banana", "na", "nana"]
"programmers" ["ammers", "ers", "grammers", "mers", "mmers", "ogrammers", "programmers", "rammers", "rogrammers", "rs", "s"]

 

 

입출력 예 설명

예제 1번의 my_string는 "banana"로 모든 접미사는 문제의 설명과 같습니다. 이를 사전순으로 정렬하면 "a", "ana", "anana", "banana", "na", "nana"이므로 ["a", "ana", "anana", "banana", "na", "nana"]를 return 합니다.

예제 2번의 my_string는 "programmers"이고 모든 접미사는 "programmers", "rogrammers", "ogrammers", "grammers", "rammers", "ammers", "mmers", "mers", "ers", "rs", "s"입니다. 이를 사전순으로 정렬한 문자열 배열 ["ammers", "ers", "grammers", "mers", "mmers", "ogrammers", "programmers", "rammers", "rogrammers", "rs", "s"]를 return 합니다.

 

 

저의 풀이!

function solution(my_string) {
    let answer = [];

    for (let i = 0; i < my_string.length; i++) {
        answer.push(my_string.slice(-(my_string.length - i)));
    }
    return answer.sort();
}

 

 

메모

slice를 사용해서 맨마지막부터 하나씩 늘려가면되겠다 싶어서 작성했습니다.

하지만 slice를 다시 보면, my_string에 slice(i) 만해줘도 접미사를 만들어낼 수 있습니다.

slice 에 두 인자가 쓰이면, 시작점과 끝점이지만

하나의 인자만 쓰인다면 그 인자부터 뒤에까지 잘라주는 식이 됩니다.

function solution(my_string) {
    let answer = [];

    for (let i = 0; i < my_string.length; i++) {
        answer.push(my_string.slice(i));
    }
    return answer.sort();
}
console.log(solution('banana'));

 

 

 

Comments