배열 속 부메랑 패턴의 개수 구하기
[3, 7, 3], [1, -1, 1], [5, 6, 5]
// 부메랑 패턴의 예시
[3, 7, 3, 2, 1, 5, 1, 2, 2, -2, 2]
// 이 배열에는 3개의 부메랑 패턴이 존재한다 : [3, 7, 3], [1, 5, 1], [2, -2, 2]
// 부메랑 패턴은 겹쳐질 수 있다
[1, 7, 1, 7, 1, 7, 1]
// 이 배열에는 3개의 부메랑 패턴이 존재한다 : [1, 7, 1], [7, 1, 7], [1, 7, 1], [7, 1, 7], [1, 7, 1]
부메랑은 직립하거나 거꾸로 된 V자 모양을 하고 있다. 부메랑 패턴을 첫째 요소와 마지막 요소가 같고, 가운데 요소만이 다른 길이 3의 하위 배열로 정의할 때 배열 내에서 부메랑 패턴의 개수를 구하는 함수를 만드시오.
예시
countBoomerangs([9, 5, 9, 5, 1, 1, 1]) ➞ 2
countBoomerangs([5, 6, 6, 7, 6, 3, 9]) ➞ 1
countBoomerangs([4, 4, 4, 9, 9, 9, 9]) ➞ 0
시도
부메랑 패턴의 길이는 3으로 고정이기 때문에, 첫 번째 인덱스와 세 번째 인덱스가 같고(조건1) 첫 번째 인덱스와 세 번째 인덱스가 다를 경우(조건2)만 보면 될 것이다. → 조건 연산자 &&(AND)를 사용하자.
해결 코드1
function countBoomerangs(arr) {
let count = 0;
for (let i=0; i<arr.length-2; i ++) {
if (arr[i] === arr[i+2] && arr[i] !== arr[i+1]) count += 1;
}
return count;
}
for문을 사용하여 배열을 순회하였다. 그러나 배열은 다양한 유용한 고차 함수를 지원하는 자료구조로, 고차 함수를 사용하여 가독성을 더 좋게 해 보겠다.
배열 고차 함수를 사용하고자 한다면 선택지는 크게 두 가지이다.
- Array.prototype.reduce()
reduce는 배열을 순회하면서 단 하나의 값을 반환하기 때문에 부메랑 함수를 구현하기에 딱 알맞다.
- Array.prototype.filter()과 length 프로퍼티
filter로 조건에 만족하는 값만 뽑아낸 뒤, 반환된 배열의 길이(요소의 개수)를 구함으로써 부메랑 함수를 구현할 수 있다.
나는 reduce가 조금 더 깔끔해 보일 것 같아 reduce를 선택하였다.
해결 코드2
Array.prototype.reduce
const countBoomerangs2 = arr => arr.reduce((acc,cur,i) => acc + (arr[i] === arr[i+2] && arr[i] !== arr[i+1]), 0)
위 함수는 다음과 같이 동작한다 :
- 배열을 순회하면서, 부메랑 패턴의 조건에 맞는 경우에
- 초깃값(acc, 0으로 설정)에 불리언 값(true)이 1로 암묵적 형변환 되어 더해진다.
- 부메랑 패턴의 개수만큼 1이 더해지므로
- 최종적으로 부메랑 패턴의 개수가 반환된다.
배움 지식
숫자와 불리언의 연산에서, 불리언 값은 1로 암묵적 강제 형변환된다.
console.log(7 + true); // 8
console.log(3 + (1 === 1)); // 4
'코딩 > 코테' 카테고리의 다른 글
[자바스크립트] 두 날짜 사이의 일수 구하기 (0) | 2022.06.17 |
---|---|
[자바스크립트] 각 자릿수의 합으로 홀수 짝수 구별하기 (0) | 2022.06.03 |
[자바스크립트] 중복 기능의 불필요한 함수 (0) | 2022.05.31 |
[자바스크립트] 배열 내 참의 개수 구하기 (0) | 2022.05.31 |
[자바스크립트] 성냥개비 하우스 문제 (0) | 2022.05.23 |