2023. 1. 6. 14:46ㆍ알고리즘 공부
문제
0부터 9까지의 숫자 중 일부가 들어있는 정수 배열 numbers가 매개변수로 주어집니다. numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤ numbers의 길이 ≤ 9
- 0 ≤ numbers의 모든 원소 ≤ 9
- numbers의 모든 원소는 서로 다릅니다.
입출력 예
numbers | result |
[1,2,3,4,6,7,8,0] | 14 |
[5,8,4,0,6,7,9] | 6 |
function solution(numbers) {
var answer = -1;
return answer;
}
내가 푼 답
function solution(numbers) {
let arr1 = [1,2,3,4,5,6,7,8,9,0]
let result = arr1.filter(x => !numbers.includes(x))
let answer = result.reduce(function add(sum, currValue) {
return sum + currValue;
});
return answer
}
1. 0-9까지 들어있는 배열을 만든다.
2. numbers와의 차집합을 구한다.
3. 차집합으로 나온 요소들의 합을 구한다.
다른 사람이 푼 답1
function solution(numbers) {
return 45 - numbers.reduce((cur, acc) => cur + acc, 0);
}
우선 여기서 쓰인 reduce에 대해서 알아보는게 좋을 것 같다.
Array.reduce()의 기본 정리
: 배열의 각 요소에 대해 주어진 리듀서(reducer) 함수를 실행하고, 하나의 결과값을 반환한다.
arr.reduce(callback[, initialValue])
- callback : 배열의 각 요소에 대해 실행할 함수. 다음 네 가지 인수를 가짐
- accumulator : 누산기. 콜백의 반환값을 누적. 콜백의 이전 반환값 또는, 콜백의 첫 번째 호출이면서 initialValue를 제공한 경우에는 initialValue의 값임
- currentValue : 처리할 현재 요소
- currentIndex (Optional) : 처리할 현재 요소의 인덱스. initialValue를 제공한 경우 0, 아니면 1부터 시작
- array (Optional) : reduce()를 호출한 배열
- initialValue (Optional) : callback의 최초 호출에서 첫 번째 인수에 제공하는 값. 초기값을 제공하지 않으면 배열의 첫 번째 요소를 사용. 빈 배열에서 초기값 없이 reduce()를 호출하면 오류 발생
이제 다른 사람이 풀었던 코드1의 리턴한 부분을 다시 살펴보자면,
return 45 - numbers.reduce((cur, acc) => cur + acc, 0);
return 0부터 9까지 모든 수의 합 - numbers.reduce(( 처리할 현재 요소, 누산기) => 처리할 현재 요소 + 누산기, 첫 번째 인수에 제공하는 값);
우선 45는 0부터 9까지 모든 수의 합이다.
numbers는 제시된 숫자들의 배열이고
reduce를 통해 배열의 모든 수를 더한 합을 구했다.
그럼 45 - 배열속 숫자의 합 을 리턴하라는 코드이다.
내 풀이의 경우 numbers가 0부터9까지 나온 배열보다 작거나 같을 것이기때문에,
0부터 9까지를 배열로 만들고 numbers에 들어있는 숫자를 빼주고(차집합) 남은 숫자들의 합을 구하는 방식으로 접근했는데
위 코드처럼 두 배열 각자 합을 구한 후 빼줘도 좋을 듯 하다.
- 참고한 사이트
[Node.js] javascript: Array.reduce() 사용 방법 정리
Array.reduce() ● 기본 정리 배열의 각 요소에 대해 주어진 리듀서(reducer) 함수를 실행하고, 하나의 결과값을 반환합니다. arr.reduce(callback[, initialValue]) callback : 배열의 각 요소에 대해 실행할 함수.
miiingo.tistory.com
Reduce에 대한 기본 정리 및 예시를 통한 사용 방법이 자세하게 나와있다.
이 메소드를 처음 접하는 사람이 보기에 깔끔하게 잘 나와있는것 같다.
또한 단순 코드구성만 알려주는게 아니라 예시 코드를 통해 해석을 해주다보니 나와 같은 초보자들에게 꼭 보라고 권하고 싶다.
다른 사람이 푼 답2
function solution(numbers) {
let answer = 0;
for(let i = 0; i <= 9; i++) {
if(!numbers.includes(i)) answer += i;
}
return answer;
}
위 코는 includes라는 메소드를 사용했다.
Array.inculdes()의 기본 정리
: 배열이 특정 요소를 포함하고 있는지 판별합니다.
arr.includes(valueToFind[, fromIndex])
- valueToFind
탐색할 요소.> 참고: 문자나 문자열을 비교할 때, includes()는 대소문자를 구분합니다. - fromIndex Optional이 배열에서 searchElement 검색을 시작할 위치입니다. 음의 값은 array.length + fromIndex의 인덱스를 asc로 검색합니다. 기본값은 0입니다.
이제 다시 풀이를 보자면,
for(let i = 0; i <= 9; i++) {
if(!numbers.includes(i)) answer += i;
}
return answer;
for문으로 0부터 9까지 돌린다.
그리고 if문으로 조건을 주는데, !number.includes( i ) 는 i를 number와 비교했을 때 아닌 값을 ture로 반환하고.
그 값을 anwer에 더하면서 넣어준다. 그리고 answer를 답을 리턴했다.
코드를 풀이 하자면 이런 뜻이 될 것 같다.
영어를 직역한것 마냥 문장이 좀 이상하지만 뜻이 잘 전달되기만 하면....된것 같다ㅎㅎ
참고사이트
Array.prototype.includes() - JavaScript | MDN
includes() 메서드는 배열이 특정 요소를 포함하고 있는지 판별합니다.
developer.mozilla.org
mdn에 다양한 정보가 나와있으니 참고하면 좋을 듯 하다.
이 문제를 끝으로 당분간은 알고리즘 문제를 풀지 않을 것 같다.
항해99를 통해 리액트를 배우는 중인데, 새로운걸 습득하는 것이 어려워서
항해 99가 끝나면 조금씩 풀어나가면서 문제해결 방법을 습득하고 메소드, 함수등을 익혀나가도록 해야겠다.
항해99를 고민하고 계시는 분이 있다면 댓글 남겨주세요 :)
'알고리즘 공부' 카테고리의 다른 글
알고리즘 문제 풀기 (JS입문) - 가운데 글자 가져오기 (0) | 2023.01.01 |
---|---|
알고리즘 문제풀기 (JS입문) - 나누어 떨어지는 숫자배열 (1) | 2022.12.31 |
알고리즘 문제풀기 (JS입문) - x만큼 가격이 있는 (0) | 2022.12.29 |
알고리즘 문제 풀기 (JS입문) - 직사각형 별 찍기 (0) | 2022.12.26 |
알고리즘 문제풀기 (JS입문) - 양수 음수 더하기 (0) | 2022.12.24 |