Front-End

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

알고리즘

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

jeongsso 2023. 8. 26. 12:54

 

 

문제 54 .  두 수의 차


문제 설명

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

arr의 길이가 홀수라면 arr의 모든 짝수 인덱스 위치에 n을 더한 배열을,

arr의 길이가 짝수라면 arr의 모든 홀수 인덱스 위치에 n을 더한 배열을 return 하는 solution 함수를 작성해 주세요.

 

 

입출력 예

arr n result
[49, 12, 100, 276, 33] 27 [76, 12, 127, 276, 60]
[444, 555, 666, 777] 100 [444, 655, 666, 877]

 

 

입출력 예 설명

예제 1번의 arr의 길이는 5로 홀수입니다. 따라서 arr의 짝수 인덱스 0, 2, 4에 주어진 n 값인 27을 더하면 [76, 12, 127, 276, 60]이 됩니다. 따라서 [76, 12, 127, 276, 60]를 return 합니다.

예제 2번의 arr의 길이는 4로 짝수입니다. 따라서 arr의 홀수 인덱스 1, 3에 주어진 n 값인 100을 더하면 [444, 655, 666, 877]이 됩니다. 따라서 [444, 655, 666, 877]를 return 합니다.

 

 

저의 풀이!

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

    for (let i = 0; i < arr.length; i++) {
        if (
            (arr.length % 2 === 0 && i % 2 === 1) ||
            (arr.length % 2 === 1 && i % 2 === 0)
        ) {
            answer.push(arr[i] + n);
        } else {
            answer.push(arr[i]);
        }
    }

    return answer;
}

console.log(solution([49, 12, 100, 276, 33], 27));

 

메모

일단 반복되는 i가 인덱스니까 인덱스가 홀수 인지, 짝수 인지 확인할 수 있고,

길이가 홀수 인지 짝수 인지는 조건을 추가로 걸어서 진행했습니다.

 

근데 충격적..!! 더 줄일 수 있습니다.

 

반복되는 질문 = 짝수인지~ 홀수인지입니다.

if(arr.length % 2 !== i%2){
    answer.push(arr[i] + n);
}

길이가 짝수라면 인덱스는 홀수만 이니까 나머지값이 서로 다르겠죠?!

그러면 이런 식으로 더 줄여서 할 수 있습니다!

 

map으로도 가능합니다.

function solution1(arr, n) {
    return arr.map((item, i) => {
        if (arr.length % 2 !== i % 2) {
            return item + n;
        } else return item;
    });
}

 

여기서 더 줄여봅시다요

function solution2(arr, n) {
    return arr.map((item, i) => (arr.length % 2 !== i % 2 ? item + n : item));
}

 

어떤 식으로 식을 짜야할지 보고, 그 이후에 조금씩 줄여나가면서 재미를 찾을 수 있을 겁니다 ㅎㅎㅎ

 

 

 

 

 

 

문제 55 .  접미사인지 확인하기


문제 설명

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

예를 들어, "banana"의 모든 접미사는 "banana", "anana", "nana", "ana", "na", "a"입니다.
문자열 my_string과 is_suffix가 주어질 때,

is_suffix가 my_string의 접미사라면 1을, 아니면 0을 return 하는 solution 함수를 작성해 주세요.

 

 

입출력 예

my_string is_suffix result
"banana" "ana" 1
"banana" "nan" 0
"banana" "wxyz" 0
"banana" "abanana" 0

 

 

입출력 예 설명

예제 1번에서 is_suffix가 my_string의 접미사이기 때문에 1을 return 합니다.

예제 2번에서 is_suffix가 my_string의 접미사가 아니기 때문에 0을 return 합니다.

예제 3번에서 is_suffix가 my_string의 접미사가 아니기 때문에 0을 return 합니다.

예제 4번에서 is_suffix가 my_string의 접미사가 아니기 때문에 0을 return 합니다.

 

 

저의 풀이!

function solution(my_string, is_suffix) {
    if (my_string.length < is_suffix.length) {
        return 0;
    }

    for (let i = 1; i <= is_suffix.length; i++) {
        return is_suffix[is_suffix.length - i] === my_string[my_string.length - i]
            ? 1
            : 0;
        }
    }

console.log(solution('banana', 'ana'));

 

 

메모

지금 풀이한 것은 마지막 요소를 가져오려고 length에서 -1을 하면서 확인하는 방법이다.

 

for문 조건에 <=로 되어있는데 length에서 -1을 하기 때문에 =까지 추가해 주어야 마지막 글자까지 확인이 가능하다.

여기서 좀 더 깔끔하게 할 수 있다.

function solution1(my_string, is_suffix) {
    return +(my_string.slice(-is_suffix.length) === is_suffix);
}

console.log(solution1('banana', 'ana'));

위에 풀이는 slice를 사용했다. 음수 slice인자는 뒤에서부터 인덱스를 잘라주기 때문에 is_suffix.length에 음수를 넣으면 그 길이만큼 뒤에서부터 잘라준다.

 

 

 

 

 

 

문제 56 .  꼬리 문자열


문제 설명

문자열들이 담긴 리스트가 주어졌을 때, 
모든 문자열들을 순서대로 합친 문자열을 꼬리 문자열이라고 합니다.

꼬리 문자열을 만들 때 특정 문자열을 포함한 문자열은 제외시키려고 합니다.

예를 들어 문자열 리스트 ["abc", "def", "ghi"]가 있고

문자열 "ef"를 포함한 문자열은 제외하고 꼬리 문자열을 만들면 "abcghi"가 됩니다.

문자열 리스트 str_list와 제외하려는 문자열 ex가 주어질 때,

str_list에서 ex를 포함한 문자열을 제외하고 만든 꼬리 문자열을 return 하도록 solution 함수를 완성해 주세요.

 

 

입출력 예

str_list ex result
["abc", "def", "ghi"] "ef" "abcghi"
["abc", "bbc", "cbc"] "c" ""

 

 

 

입출력 예 설명

본문과 동일합니다.

리스트 안의 모든 문자열이 "c"를 포함하므로 빈 문자열을 return 합니다.

 

 

저의 풀이!

function solution(str_list, ex) {
    return str_list.filter(item => !item.includes(ex)).join('');
}

console.log(solution(['abc', 'def', 'ghi'], 'ef'));

 

 

메모

filter를 이용해서 풀었다.

str_list 요소 중에 ex를 포함하지 않는 것만 따로 빼서 join으로 합쳐주었다.

 

filter는 map과 비슷하다고 보면 되는데, filter는 배열을 순회하면서 함수 조건에 맞는 애들만 배열로 만들어서 내보내준다.

filter는 값이 없는 요소는 내보내주지 않는다.

빈값 ㄴㄴ!

 

 

 

 

 

문제 57 .  공백으로 구분하기


문제 설명

단어가 공백 한 개 이상으로 구분되어 있는 문자열 my_string이 매개변수로 주어질 때, 

my_string에 나온 단어를 앞에서부터 순서대로 담은 문자열 배열을 return 하는 solution 함수를 작성해 주세요.

 

 

입출력 예

my_string result
" i    love  you" ["i", "love", "you"]
"    programmers  " ["programmers"]

 

 

 

입출력 예 설명

예제 1번의 my_string은 " i    love  you"로 공백을 기준으로 단어를 나누면 "i", "love", "you" 3개의 단어가 있습니다. 따라서 ["i", "love", "you"]를 return 합니다.

예제 2번의 my_string은 "    programmers  "로 단어는 "programmers" 하나만 있습니다. 따라서 ["programmers"]를 return 합니다.

 

저의 풀이!

function solution(my_string) {
    return my_string.split(' ').filter(item => item);
}

console.log(solution(' i love you'));

 

 

메모

원래는 

return my_string.split(' ').filter(item => item.length > 0)

이렇게 했었는데, 

filter는 요소가 비어있으면 내보내지 않아서 그냥 item출력해 달라고만 해도 우리가 원하는 기댓값이 출력된다.

 

 

 

Comments