Front-End

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

알고리즘

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

jeongsso 2023. 8. 5. 23:57

 

자 2일차입니다. 

매일 하는 것이 목표라 화이팅!

작심삼일 안할겁니다요.

=> 일요일은 쉬자링 ^^

 

 

 

문제 5.  길이에 따른 연산


문제 설명

정수가 담긴 리스트 num_list가 주어질 때, 리스트의 길이가 11 이상이면 리스트에 있는 모든 원소의 합을 

10 이하이면 모든 원소의 곱을 return하도록 solution 함수를 완성해주세요.

 

 

입출력 예

num_list result
[3, 4, 5, 2, 5, 4, 6, 7, 3, 7, 2, 2, 1] 51
[2, 3, 4, 5] 120

 

 

입출력 예 설명

리스트의 길이가 13이므로 모든 원소의 합인 51을 return합니다.

 

리스트의 길이가 4이므로 모든 원소의 곱인 120을 return합니다.

 

 

저의 풀이!

function solution(num_list) {
    let answer1 = 0;
    let answer2 = 1;

for (let i = 0; i < num_list.length; i++) {
    if (num_list.length >= 11) {
        answer1 += num_list[i];
    } else {
        answer2 *= num_list[i];
    }
  }
  return answer1 || answer2;
}

console.log(solution([2, 3, 4, 5]));

 

리듀서를 공부했다면, 이해할 수 있을겁니다

function solution(num_list) {
    return num_list.length >= 11
        ? num_list.reduce((a, c) => a + c)
         : num_list.reduce((a, c) => a * c);
    }

 

 

메모

문제 이해를 해보면 배열의 길이가 11이상이면 그 값들을 곱해라, 10이하면 더해라~ 였습니다.

그러면 length 함수를 써서 사용하면 되겠다 싶어서 시작을 했습니다.

 

일단 변수를 지정하는데 0부터 시작을 하게되면 곱하기는 계속 0일수 밖에없어서 1부터 시작을 했고

덧샘할 경우에는 0부터 시작하게 끔 변수를 두개를 잡았습니다.

 

그리고 11이상일 경우 덧샘을 할거니까 0부터시작할 변수에 담아주었습니다.

10이하일 경우는 곱샘을 할거니 1부터 시작할 변수에 담아주는 식으로 설정해서 

return 을 둘중 값이 있는 거를 내보내게끔 하려고 || 연산자를 사용했습니다.

 


일단 생각해야 할 것 하나는 index는 0부터 시작이고 length는 1부터 시작이라는 점인 것 같아서 변수를 두개를 썼는데,

저의 선생님께서는 허허 웃으며 reduce를 공부해와라 하셨습니다.

공부 한 후에 reduce를 사용해서 다시 풀어보도록 하겠습니다.

=> reduce 영어로는  줄이다라는 뜻이고, 코드에서 보면 누산기라고 이해하면 편할 것 같다!

     

reduce는 두개의 인자를 갖는다.( 요 두개는 필수! )

const numbers = [4, 3, 2, 1];
let sum = numbers.reduce((acc, cur) => acc + cur);

acc = accumlator  :  누산기, 누적되는 값, 최종적으로 출력되는 값

cur = current   :  현재 돌고 있는 요소

 

 

옵션이 추가될 수 있는데, 옵션을 추가한 형태를 화보자

const numbers = [4, 3, 2, 1];
let sum = numbers.reduce((accumulator, current) => accumulator + current, 0);

원래라면 acc, cur => acc + cur 만 있었을 텐데,           , 0이 추가되었다.

무슨 의미냐면~ 

acc의 초기값을 정해준 것이다.

 

reduce를 배웠다면 다시 문제를 풀어볼 수 있을 것이다.

 

 

 

 

문제 6.  접두사인지 확인하기


문제 설명

어떤 문자열에 대해서 접두사는 특정 인덱스까지의 문자열을 의미합니다. 

예를 들어, "banana"의 모든 접두사는 "b", "ba", "ban", "bana", "banan", "banana"입니다.
문자열 my_string과 is_prefix가 주어질 때,

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

 

 

입출력 예

my_string is_prefix result
"banana" "ban" 1
"banana" "nan" 0
"banana" "abcd" 0
"banana" "bananan" 0

 

입출력 예 설명

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

 

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

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


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

 

 

저의 풀이!

function solution(my_string, is_prefix) {
     if (my_string.length < is_prefix.length) {
         0;
     }
for (let i = 0; i < is_prefix.length; i++) {
     return is_prefix[i] === my_string[i] ? 1 : 0;
   }
}
console.log(solution('banana', 'bananan'));

수정 후 풀이 

function solution(my_string, is_prefix) {
    for (let i = 0; i < is_prefix.length; i++) {
        if (my_string[i] !== is_prefix[i]) {
            return 0;
        }
    }
    return 1;
}

 

메모

일단 틀렸습니다...!! 

 

수정한 부분은 맞췄습니다.

여기서 배운 점은 for문 어제 공부한거에서 봤을 때 객체, 문자열, 배열에서도 반복을 사용할 수 있다는 점을 복습할 수 있었고요~

근데 궁금했던게 .. ===이나 !==으로 표현한 걸로 봤을 때는 말로 풀어쓰면 저는 동일한 말이라고 생각했는데

부등호의 차이가 있나봅니다.. 이부분에 대해서는 자세히 공부를 해서 다시 수정하도록하겠습니다. 

 

=> 연산자 공부

== (동등)  피연산자가 서로 같으면 true를 반환합니다.

!= (부등)  피연산자가 서로 다르면 true를 반환합니다.

 

=== (일치)  두 피연산자의 값과 타입이 모두 같은 경우 true를 반환합니다

!== (불일치) 피연산자의 값 또는 타입이 다른 경우 true를 반환합니다.

 

 

 

 

 

 

문제 7.  문자열 섞기


문제 설명

길이가 같은 두 문자열 str1과 str2가 주어집니다.
두 문자열의 각 문자가 앞에서부터 서로 번갈아가면서 

한 번씩 등장하는 문자열을 만들어 return 하는 solution 함수를 완성해 주세요.

 

입출력 예

str1 str2 result
"aaaaa" "bbbbb" "ababababab"

 

 

입출력 예 설명

보이는 것처럼~ 그냥 섞어서 내보내면..되는겁니다요!

 

 

저의 풀이!

function solution(str1, str2) {
    return [...str1].map((a, i) => a + str2[i]).join('');
}

아직 못풀었습니다..

map, 전개연산자, join, split 함수를 공부한 후에 다시 풀어보도록 하겠습니다요!!!

 

 

 

메모

공 부 완 료 =>

전개연산자 (Spread Operator) 

보통 배열 또는 객체를 하나하나 넘기는 용도로 사용합니다.

const arr = [1,2,3];
let test_arr = [4,5,6];
let test_arr2 = [4,5,6];

test_arr.push(arr);
console.log(test_arr); //[4, 5, 6, [1, 2, 3]]

//ES6
test_arr2.push(...arr);
console.log(test_arr2); //[4, 5, 6, 1, 2, 3]

 

push 로 그냥 배열을 넣게되면 2차원 배열이 되지만,

전개연산자를 이용해서 push 하게되면 내부 요소 하나하나가 삽입됩니다.

 

join() 

배열의 모든 요소를 연결해 하나의 문자열로 만들어줍니다.

const elements = ['Fire', 'Air', 'Water'];

console.log(elements.join());
// Expected output: "Fire,Air,Water"

console.log(elements.join(''));
// Expected output: "FireAirWater"

console.log(elements.join('-'));
// Expected output: "Fire-Air-Water"

매개변수를 생략하면 배열 요소들이 쉼표로 구분되고,

빈문자열로 두면 모든 요소들 사이에 아무 문자도 없이 연결됩니다.

만약에 빈배열이라면 빈문자열을 반환해줍니다.

 

split()

string 객체를 지정한 구분자를 이용하여 여러 개의 문자열로 나눕니다.

const str = 'The quick brown fox jumps over the lazy dog.';

const words = str.split(' ');
console.log(words[3]);
// Expected output: "fox"

const chars = str.split('');
console.log(chars[8]);
// Expected output: "k"

const strCopy = str.split();
console.log(strCopy);
// Expected output: Array ["The quick brown fox jumps over the lazy dog."]

이거는 조큼 헷갈리니 적어보도록 하겠습니다.

 

split()
split(separator)
split(separator, limit)

separator는

원본 문자열을 끊어야 할 부분을 나타내는 문자열을 나타냅니다.

실제 문자열이나 정규표현식을 받을 수 있다고 합니다.

 

limit는

끊어진 문자열의 최대 개수를 나타내는 정수입니다.

 

쉽게 말하자면

split 함수는 문자열을 'separator'로 잘라서

limit 크기 이하의 배열에 잘라진 문자열을 저장하여 배열에 담아서 리턴합니다.

 

둘다 필수로 적어야하는 것은 아닙니다.

 

 

 

Comments