Front-End

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

알고리즘

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

jeongsso 2023. 8. 17. 22:31

 

 

문제 40.  조건에 맞게 수열 변환하기


문제 설명

정수 배열 arr와 자연수 k가 주어집니다.
만약 k가 홀수라면 arr의 모든 원소에 k를 곱하고, k가 짝수라면 arr의 모든 원소에 k를 더합니다.
이러한 변환을 마친 후의 arr를 return 하는 solution 함수를 완성해 주세요.

 

 

입출력 예

arr k result
[1, 2, 3, 100, 99, 98] 3 [3, 6, 9, 300, 297, 294]
[1, 2, 3, 100, 99, 98] 2 [3, 4, 5, 102, 101, 100]

 

 

입출력 예 설명

주어진 k인 3은 홀수이므로, 전체 배열에 3을 곱합니다. 따라서 [3, 6, 9, 300, 297, 294]을 return 합니다.

주어진 k인 2는 짝수이므로, 전체 배열에 2를 더합니다. 따라서 [3, 4, 5, 102, 101, 100]을 return 합니다.

 

 

저의 풀이!

 
function solution(arr, k) {
    if (k % 2 === 0) {
        return arr.map(num => num + k);
    } else {
        return arr.map(num => num * k);
    }
}

 

메모

 

이런식으로 map을 사용해서 해도 됩니당!

 

function solution(arr, k) {
return arr.map((num, _) => (k % 2 === 0 ? num + k : num * k));
}

 

 

 

 

 

문제 41.  n 개 간격의 원소들


문제 설명

정수 리스트 num_list와 정수 n이 주어질 때,

num_list의 첫 번째 원소부터 마지막 원소까지 n개 간격으로 저장되어있는 원소들을 차례로 담은 리스트를 return하도록

solution 함수를 완성해주세요.

 

 

입출력 예

num_list n result
[4, 2, 6, 1, 7, 6] 2 [4, 6, 7]
[4, 2, 6, 1, 7, 6] 4 [4, 7]

 

 

입출력 예 설명

[4, 2, 6, 1, 7, 6]에서 2개 간격으로 저장되어 있는 원소들은 [4, 6, 7]입니다.

 

[4, 2, 6, 1, 7, 6]에서 4개 간격으로 저장되어 있는 원소들은 [4, 7]입니다.

 

 

저의 풀이!

function solution(num_list, n) {
    
    let array = [];

    for (let i = 0; i < num_list.length; i += n) {
        array.push(num_list[i]);
    }
    return array;
}

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

 

 

메모

저는 반복문에서 증감식을 쓰는 곳에 i++ 대신에 n개 간격 만큼이라고 해서 

i+=n으로 변형해서 사용했습니다.

 

filter 로도 구현할 수 있다고하는데,

한번 공부해서 진행해보겠습니다!

 

=> filter 

필터란 주어진 함수를 만족하는 모든 요소를 모아 새 배열로 반환하는 것입니다.

map은 배열안에 있는 모든 요소를 돌아가면서 풀이해주는 으로 이해하면 쉬운데,

filter는 주어진 함수, 즉 조건에 맞는 요소를 모아서 새 배열로 반환해주는 것입니다. 

 

function solution(num_list, n) {
    return num_list.filter((_, i) => i % n === 0);
}
console.log(solution([4, 2, 6, 1, 7, 6], 2));

자 이해가 갈까욧 ?

i번째 인덱스와 n을 나눴을 때 0이 나오는 값만 배열로 넣어달라는 filter 식입니다.

왜냐면, 

n개 간격으로 있는 배열 원소를 내보내라 했는데

i는 인덱스 숫자기 때문에 간격은 인덱스 +n 씩, 하는 값들이기 때문에
나누기 n을 했을 때 0이 나와야 그 간격인 값들인것입니다요!

 

 

 

 

문제 42.  특정한 문자를 대문자로 바꾸기


문제 설명

영소문자로 이루어진 문자열 my_string과 영소문자 1글자로 이루어진 문자열 alp가 매개변수로 주어질 때,

my_string에서 alp에 해당하는 모든 글자를 대문자로 바꾼 문자열을 return 하는 solution 함수를 작성해 주세요.


 

입출력 예

my_string alp result
"programmers" "p" "Programmers"
"lowercase" "x" "lowercase"

 

 

 

입출력 예 설명

예제 1번의 my_string은 "programmers"이고 alp가 "p"이므로 my_string에 모든 p를 대문자인 P로 바꾼 문자열 "Programmers"를 return 합니다.

예제 2번의 alp는 "x"이고 my_string에 x는 없습니다. 따라서 "lowercase"를 return 합니다.

 

 

저의 풀이!

function solution(my_string, alp) {
    return [...my_string]
        .map(a => {
            if (a === alp) {
                a.toUpperCase();
            } else {
                a;
            }
        return a;
    })
    .join('');
}

 

 

 

메모

여러번의 삽질 끝에 성공한 문제입니다. ㅎㅎ

일단 map을 쓰기위해 [...mystring]으로 변경해서 써주었고

map안에 조건문을 써서 만약 alp와 같다면 대문자로 변경해주는 메소드를 사용했습니다.

 

여기서 제가 어려웠던 부분은 map을 돌린 후 만들어진 배열을 join이라는 함수로 합쳐주는 작업이 필요했는데,

map의 끝에다가 join을 썼어야 했는데, map 리턴문안에 사용해서 실행이 되지 않았습니다 ㅎㅎ..

 

그리고 삼항으로 map을 쓸수도 있습니다! 

 

return [...my_string].map(a => (a === alp ? a.toUpperCase() : a)).join('');

이런식으로 말이죠 ㅎㅎ 여기서도 보면

맵이 끝나는 부분 밖에!!! join을 사용해야합니다

 

 

 

 

문제 43.  부분 문자열


문제 설명

어떤 문자열 A가 다른 문자열 B안에 속하면 A를 B의 부분 문자열이라고 합니다.

예를 들어 문자열 "abc"는 문자열 "aabcc"의 부분 문자열입니다.
문자열 str1과 str2가 주어질 때, str1이 str2의 부분 문자열이라면 1을 

부분 문자열이 아니라면 0을 return하도록 solution 함수를 완성해주세요.

 

입출력 예

str1 str2 result
"abc" "aabcc" 1
"tbt" "tbbttb" 0

 

입출력 예 설명

본문과 동일합니다.

"tbbttb"에는 "tbt"가 없으므로 0을 return합니다.

 

 

 

저의 풀이!

 
function solution(str1, str2) {
    return Number(str2.includes(str1));
}

console.log(solution('abc', 'aabcc'));

 

 

메모

간~단합니다~

 

 

 

 

 

 

문제 44.  소문자로 바꾸기


문제 설명

알파벳으로 이루어진 문자열 myString이 주어집니다.

모든 알파벳을 소문자로 변환하여 return 하는 solution 함수를 완성해 주세요.

 

 

입출력 예

myString result
"aBcDeFg" "abcdefg"
"aaa" "aaa"

 

 

입출력 예 설명

보기만해도 이해가시죠 ? ㅎㅎ 

 

 

저의 풀이!

 
function solution(my_string) {
    return my_string.toLowerCase();
}

console.log(solution('aBcDeFg'));

 

메모

이것도 매우 간단했습니당.

 

 

 

 

 

 

문제 45.  rny_string


문제 설명

'm'과 "rn"이 모양이 비슷하게 생긴 점을 활용해 문자열에 장난을 하려고 합니다. 

문자열 rny_string이 주어질 때,

rny_string의 모든 'm'을 "rn"으로 바꾼 문자열을 return 하는 solution 함수를 작성해 주세요.

 

입출력 예

rny_string result
"masterpiece" "rnasterpiece"
"programmers" "rnasterpiece"
"jerry" "jerry"
"burn" "burn"

 

 

입출력 예 설명

rny_string의 'm'을 "rn"으로 바꾸는 과정을 표로 나타내면 다음과 같습니다.
rny_string m a s t e r p i e c e
result rn a s t e r p i e c e
따라서 "rnasterpiece"를 return 합니다.

예제 2번의 rny_string의 'm'을 "rn"으로 바꾸는 과정을 표로 나타내면 다음과 같습니다.
rny_string p r o g r a m m e r s
result p r o g r a rn rn e r s
따라서 "prograrnrners"를 return 합니다.

예제 3번의 rny_string에는 'm'이 없습니다. 따라서 rny_string 그대로인 "jerry"를 return 합니다.

예제 4번의 rny_string에는 'm'이 없습니다. 따라서 rny_string 그대로인 "burn"를 return 합니다.

 

 

저의 풀이!

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

    for (let i = 0; i < rny_string.length; i++) {
        if (rny_string[i] === 'm') {
            answer.push('rn');
        } else {
            answer.push(rny_string[i]);
        }
    }
    return answer.join('');
}

console.log(solution('masterpiece'));

 

 

메모

저는 반복문으로 push를 이용하여 새 배열을 만든 후 에 join을 사용 했습니다.

 

근데 문자 치환이라고 한번 알아보고 그걸로 교체해보겠습니다!!

 

==>> replace

문자 치환 메서드입니다.

근데 replace(바뀌기 전 문자, 바뀐 후 문자)는 문자열에서 첫번째로 만난 바뀌기전 문자만 바꿔주고 그 뒤에 있는 문자는 바꿔주지 않습니다. 

만약 그 문자열 전부에 포함되어있는 바뀌기전 문자를 바꾸려면 어떻게 해야할까요 ?

 

replaceAll 도 생겨서 쓸 수 있지만,

replace에 정규식을 사용해서도 전역으로 사용할 수 있습니다.

function solution1(rny_string) {
    return rny_string.replace(/m/g, 'rn');
}

console.log(solution1('masterpiece'));

보시면 /m/g  여기 /슬레시 안에 있는게 바꾸려는 문자고 뒤에 g는 글로벌이라는 뜻으로 전역으로 확인해달라는 의미입니다.

 

 

 

 

문제 46.  n보다 커질 때까지 더하기


문제 설명

정수 배열 numbers와 정수 n이 매개변수로 주어집니다. 

numbers의 원소를 앞에서부터 하나씩 더하다가 그 합이 n보다 커지는 순간

이때까지 더했던 원소들의 합을 return 하는 solution 함수를 작성해 주세요.

 

 

입출력 예

numbers n result
[34, 5, 71, 29, 100, 34] 123 139
[58, 44, 27, 10, 100] 139 239

 

 

 

입출력 예 설명

예제 1번의 numbers를 문제 설명대로 더해가는 과정을 나타내면 다음의 표와 같습니다.

i numbers[i] sum
0
0 34 34
1 5 39
2 71 110
3 29 139
29를 더한 뒤에 sum 값은 139이고 n 값인 123보다 크므로 139를 return 합니다.

예제 2번의 numbers의 마지막 원소 전까지의 원소를 sum에 더하면 139입니다. 139는 n 값인 139보다 크지 않고 마지막 원소인 100을 더하면 139보다 커지므로 239를 return 합니다.

 

 

저의 풀이!

function solution(numbers, n) {
    let 모든원소합 = 0;

    for (let i = 0; i < numbers.length; i++) {
        모든원소합 += numbers[i];

        if (모든원소합 > n) {
            break;
        }
    }
return 모든원소합;
}

console.log(solution([34, 5, 71, 29, 100, 34], 123));

 

 

메모

모든 조건문에서는 break 사용가능합니다.

return 처럼 break가 나온다면 반복문이 종료되고 끝나게 됩니다.

 

while문으로도 한번 공부해서 고쳐보겠습니다!

 

function solution1(numbers, n) {
    let 모든합 = 0;

    let i = 0;
    while (i < numbers.length) {
        모든합 += numbers[i];
        i++;

        if (모든합 > n) {
            break;
        }
    }
    return 모든합;
}
console.log(solution1([34, 5, 71, 29, 100, 34], 123));
Comments