알고리즘 문제를 풀 때 마다 코딩의 기본기를 늘린다는 느낌이다. 내가 문제를 풀고 다른 사람의 코드까지 보며 실력을 쌓다보니 점점 발전하는 기분이 들어 가장 좋아하는 시간 중 하나이다. 오늘도 알고리즘 문제 몇가지를 정리해보려 한다.
<문제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 값이다.)
'개발 기초 다지기' 카테고리의 다른 글
내일배움캠프 16일차 : 클로저 개념 (0) | 2024.05.07 |
---|---|
내일배움캠프 15일차 : TMDB에서 API로 출연진&감독 정보 가져오기 (0) | 2024.05.05 |
내일배움캠프 13일차 : 자바스크립트 로컬스토리지 (0) | 2024.05.01 |
내일배움캠프 12일차 : 알고리즘 문제 정리 (0) | 2024.04.30 |
내일배움캠프 11일차 : 콜백지옥 해결 방법 동기/비동기 (0) | 2024.04.29 |
댓글