더스트스더
공대생블로그
더스트스더
전체 방문자
오늘
어제
  • 분류 전체보기 (20)
    • 코딩 (15)
      • 코테 (12)
    • 디지털월드 (2)
      • 통신 (1)
      • 회로 (1)
    • 에러 해결 (2)
    • 취준일기 (1)

블로그 메뉴

  • 글쓰기
  • 블로그 관리

공지사항

인기 글

태그

  • 데이터통신
  • 자바스크립트
  • npm
  • 논리회로
  • Node.js
  • 통신
  • 프로토콜

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
더스트스더

공대생블로그

[자바스크립트] 배열 속 부메랑 패턴의 개수 구하기
코딩/코테

[자바스크립트] 배열 속 부메랑 패턴의 개수 구하기

2022. 6. 1. 20:45

배열 속 부메랑 패턴의 개수 구하기

[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문을 사용하여 배열을 순회하였다. 그러나 배열은 다양한 유용한 고차 함수를 지원하는 자료구조로, 고차 함수를 사용하여 가독성을 더 좋게 해 보겠다.

 

배열 고차 함수를 사용하고자 한다면 선택지는 크게 두 가지이다.

  1. Array.prototype.reduce()

reduce는 배열을 순회하면서 단 하나의 값을 반환하기 때문에 부메랑 함수를 구현하기에 딱 알맞다.

  1. 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)

위 함수는 다음과 같이 동작한다 :

  1. 배열을 순회하면서, 부메랑 패턴의 조건에 맞는 경우에
  2. 초깃값(acc, 0으로 설정)에 불리언 값(true)이 1로 암묵적 형변환 되어 더해진다.
  3. 부메랑 패턴의 개수만큼 1이 더해지므로
  4. 최종적으로 부메랑 패턴의 개수가 반환된다.

배움 지식

숫자와 불리언의 연산에서, 불리언 값은 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
    '코딩/코테' 카테고리의 다른 글
    • [자바스크립트] 두 날짜 사이의 일수 구하기
    • [자바스크립트] 각 자릿수의 합으로 홀수 짝수 구별하기
    • [자바스크립트] 중복 기능의 불필요한 함수
    • [자바스크립트] 배열 내 참의 개수 구하기
    더스트스더
    더스트스더
    열심히살자

    티스토리툴바