본문 바로가기
개발 기초 다지기

내일배움캠프 14일차 : 알고리즘 문제 (평균값, 각 자릿수 합, x씩 증가하는 수)

by 너의고래 2024. 5. 2.
반응형

알고리즘 문제를 풀 때 마다 코딩의 기본기를 늘린다는 느낌이다. 내가 문제를 풀고 다른 사람의 코드까지 보며 실력을 쌓다보니 점점 발전하는 기분이 들어 가장 좋아하는 시간 중 하나이다. 오늘도 알고리즘 문제 몇가지를 정리해보려 한다.

 

 

 

<문제1>

정수 배열 numbers 매개변수로 주어집니다. numbers 원소의 평균값을 return하도록 solution 함수를 완성해주세요.

 

제한사항

  • 0 ≤ numbers의 원소 ≤ 1,000
  • 1 ≤ numbers의 길이 ≤ 100
  • 정답의 소수 부분이 .0 또는 .5 경우만 입력으로 주어집니다.

입출력 예

numbers result
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 5.5
[89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99] 94.0

 

 

입출력 예 설명

입출력 예 #1

  • numbers의 원소들의 평균 값은 5.5입니다.

입출력 예 #2

  • numbers 원소들의 평균 값은 94.0입니다.

- 내가 만든 코드

function solution(numbers) {
    let answer = 0;
    let sum = 0;
    for (let i = 0; i < numbers.length; i++){
        sum = sum + numbers[i];
    }
    answer = sum / numbers.length;
    return answer;
}

 

나는 어린시절 배운 일반적인 평균 구하는 공식을 for문을 사용하여 구현해냈다. for문을 통해 배열의 모든 원소를 더해준 후 .length를 통해 원소 개수만큼 나눠주는 방법.

 

- 다른 사람의 코드

function solution(numbers) {
    var answer = numbers.reduce((a,b) => a+b, 0) / numbers.length;
    return answer;
}

 

reduce() 매서드를 사용하면 훨씬 간단하게 구현해낼 수 있다.

  • reduce((a, b) => a+b, 0)
    배열을 순회하며 콜백함수를 실행해 반환값을 누적시킨다.
    위 예시같은경우 초기값으로 0을 세팅해주었으며, 함수를 실행해 'a+b'값을 계속 반환하여 누적한다.

    ex) 초기값: 0 첫 번째 반복: 0(누적값) + 1(현재값) = 1 두 번째 반복: 1(누적값) + 2(현재값) = 3 세 번째 반복: 3(누적값) + 3(현재값) = 6 네 번째 반복: 6(누적값) + 4(현재값) = 10 최종 반환값: 10

 

 

 

<문제2>

자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.

예를들어 N = 123이면 1 + 2 + 3 = 6 return 하면 됩니다.

 

제한사항

  • N 범위 : 100,000,000 이하의 자연수

입출력 예

N answer
123 6
987 24

 

입출력 예 설명

입출력 예 #1
문제의 예시와 같습니다.

입출력 #2
9 + 8 + 7 = 24이므로 24 return 하면 됩니다.

 

- 내가 만든 코드

function solution(n)
{
    var answer = 0;
    let str = String(n);
    let arr = str.split("");
    answer = arr.reduce((a, b) => a + parseInt(b), 0);

    return answer;
}

 

우선 각 숫자를 고유값으로 떼내기 위해 String()을 통해 문자화시켜준다.

그리고 split에 공백을 넣어줘 문자화 된 n을 나누어 배열로 만들어준다.

그리고 위 문제에서 썼던 reduce() 메서드를 통해 값들을 더해준다.

* arr값은 현재 문자 상태이기 때문에 'parseInt()'를 통해 정수화 시켜 더해준다.

 

- 다른 사람 코드

function solution(n){
    // 쉬운방법
    return (n+"").split("").reduce((acc, curr) => acc + parseInt(curr), 0)
}

 

내가 만든 코드와 비슷하지만 여기서 배울것은 'n+""'이다.

나는 문자화 시키기 위해 String()을 사용했는데 자연수 n에 공백을 더해주면 문자열로 변환할 수 있다.

 

- 다른 사람 코드 2

function solution(n)
{
    var a = (n + '').split('');
    var b = 0;
    for(var i = 0; i < a.length; ++i) {
        b += parseInt(a[i]);
    }
    return b;
    //return n.toString().split('').reduce((a, b) => (a * 1) + (b * 1));
}

 

이전 문제에서 내가 값을 구하는 방식과 동일한 풀이.

 

 

<문제3>

함수 solution 정수 x 자연수 n 입력 받아, x부터 시작해 x 증가하는 숫자를 n 지니는 리스트를 리턴해야 합니다. 다음 제한 조건을 보고, 조건을 만족하는 함수, solution 완성해주세요.

 

제한 조건

  • x는 -10000000 이상, 10000000 이하인 정수입니다.
  • n 1000 이하인 자연수입니다.

입출력 예

x n answer
2 5 [2,4,6,8,10]
4 3 [4,8,12]
-4 2 [-4, -8]

 

 

- 내가 만든 코드

function solution(x, n) {
    var answer = [];
    for(i=1; i<= n; i++){
       answer.push(x*i)
        
    }
    return answer;
}

 

i 값은 자연수 n값을 나타내기 때문에 1부터 시작한다.

for문을 순회할 때 마다 순회 숫자만큼 곱해줌으로써 순회할 때 마다 누적 합산 값이 나오게한다.

나온 값을 push() 매서드를 이용해 answer 배열에 하나씩 넣어준다. 

 

 

- 다른 사람 풀이

function solution(x, n) {
    return Array(n).fill(x).map((v, i) => (i + 1) * v)
}

 

Array를 통해 크기가 n일 배열을 먼저 만들어 준다.

fill()을 통해 x값을 채워준다.

이 x 값을 map()를 이용해 변형하여 배열에 넣어준다.

'i'값은 맨 처음 값이 0이기 때문에 0번째 요소는 1과 v를 곱하여 나온 v(즉 x 값이다.)

 

 

반응형

댓글