[JS]_daily coding #7

seul_·2022년 6월 1일
0

Algorithm

목록 보기
6/31

제목의 숫자는 데일리코딩을 시작한 날짜를 카운트하는 것으로 바꿈

프로그래머스 Lv.1_ 평균 구하기

문제 설명
정수를 담고 있는 배열 arr의 평균값을 return하는 함수, solution을 완성해보세요.

제한사항
arr은 길이 1 이상, 100 이하인 배열입니다.
arr의 원소는 -10,000 이상 10,000 이하인 정수입니다.


🫥 수도코드

  1. 반복문을 순회하면서 배열 요소의 합을 구하고
  2. 합을 반복문의 길이로 나눈다
  3. 평균을 리턴한다

😐 첫번째 코드

function solution(arr) {
    let answer = 0;
    for (let el of arr) {
        answer += el 
    }
    answer /= arr.length
    return answer;
}

가장 먼저 떠오른게 for문을 이용하는 거였는데, 생각해보니까 reduce()를 이용하면 더 쉽게(간단하게) 해결할 수 있는 문제였다!!

😀 두번째 코드

function solution(arr) {
    let sum = arr.reduce((acc, cur) => {
        return acc + cur
    }, 0)
    return sum / arr.length
}

💡 Remind

arr.reduce(callback[, initialValue])

  • 배열의 각 요소에 대해 주어진 리듀서(reducer - 콜백함수)를 실행하고, 하나의 결과값을 반환한다.

  • 리듀서는 네가지 인자를 가진다
    누산기 (accmulator) - 콜백함수의 반환값을 누적한다.
    현재 값 (currentValue) - 현재 처리할 요소

    현재 인덱스 (currentIndex) (optional)
    원본 배열 (array) (optional)

  • 초기값(initialValue)은 처음 콜백함수를 호출할때 accumulator에 제공하는 값이다. 초기값이 없으면 배열의 첫번째 요소를 사용하고, 초기값이 있으면 주어진 초기값을 사용한다.

  • 초기값이 없을때:

    • 배열의 0번 인덱스를 accumulator에 누적한 후, 1번 인덱스부터 리듀서를 거친다
    • 빈배열인데 초기값 없이 reduce()를 호출하면 TypeError 오류가 발생한다.

참고한 사이트


프로그래머스 Lv.1_ 핸드폰 번호 가리기

문제 설명
프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.
전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.

제한 조건
phone_number는 길이 4 이상, 20이하인 문자열입니다.


🫥 수도코드

  1. 큰 컨셉) 문자열은 부분을 변형할 수 없으니까, 문자열을 추출하고 변형한 다음 합쳐준다.
  2. 뒤 네자리 번호는 그대로 잘라오고 slice(-4)
  3. 앞부분 번호는 잘라와서 변형하기
    3-1. 앞에 0번 인덱스부터 뒤에서4번째 인덱스 전까지 잘라오기 slice(0, str.length-4)
    3-2. 문자열을 배열로 변환하기 => [...str], Array.from(str), str.split('')
    3-3. 배열의 요소를 변환 map(x => '*')
    3-4. 배열을 문자열로 합치기 + , concat(), join('')
  4. 앞부분 번호(문자열)와 뒷부분 번호(문자열) 합쳐서 반환한다

😐 첫번째 코드

function solution(phone_number) {
    let firstNum = phone_number.slice(0, phone_number.length-4);
    let firstNumArr = [...firstNum].map(x=>'*');
    firstNum = firstNumArr.join('');
    let result = firstNum + phone_number.slice(-4);
    return result;
}

수도코드 작성할 때부터 간단한 문제같은데 이걸 이렇게 어렵게 푸는게 맞나?(이 방법이 맞나?) 싶어서 현타가 왔지만 그래도 포기하지 않고 일단 코드를 완성했다...(효율적인 코드같지 않지만,, 지난주부터 공부한 것들을 복습하면서 써먹어볼 수 있었던 것에 의의를 둔다!) 다른 분들 풀이를 보니까 *를 글자 길이만큼 변환한다는 컨셉으로 풀었던데, 그렇게 하면 훨씬 간단할 것 같아서 바꿔봤다.

😀 두번째 코드

변환하는 부분을 변수로 선언하고, 변환해야 하는 문자열 길이(전체 문자열 길이 -4)만큼 반복하면서 *를 해당 변수에 하나씩 더해줬다.

function solution(phone_number) {
    let firstNum ='';
    for (let i = 0; i < phone_number.length-4; i++) {
        firstNum += '*';
    }
    let result = firstNum + phone_number.slice(-4);
    return result;
}

👏 세번째 코드

다른 분들 풀이를 보고 repeat() 메서드를 알게돼서 검색해보고 써먹어봤다.

function solution(phone_number) {
    let firstNum = "*".repeat(phone_number.length-4);
    let result = firstNum + phone_number.slice(-4);
    return result;
}

💡 remind

str.repeat(count)

  • 현재 문자열을 주어진 횟수만큼 반복해 붙인 새로운 문자열을 반환한다.
  • 반복하는 횟수(count)는 0과 양의 무한대 사이의 정수([0, +∞))여야 한다.
    - 범위를 벗어나는 경우 RangeError
profile
Connecting dots

0개의 댓글