문제 정의
배열을 인수로 받아, 배열 내 어딘가에 세 개의 연속된 동일한 요소(즉, 같은 값을 가진 요소)가 존재하면 true를, 그렇지 않으면 false를 반환하는 checkThree()라는 JavaScript 함수를 작성해야 합니다.
접근 방법
이 문제는 배열을 단 한 번의 순회만으로 해결할 수 있습니다. 핵심 아이디어는 다음 두 가지 정보를 추적하는 것입니다.
- 이전 요소(element): 직전에 확인한 배열 요소
- 연속 횟수(count): 해당 요소가 지금까지 연속으로 나타난 횟수
순회 도중 어떤 요소가 이미 두 번 연속 등장했는데 현재 요소와 값이 같다면, 세 번째 연속 요소가 존재한다는 의미이므로 즉시 true를 반환하면 됩니다. 끝까지 조건이 충족되지 않으면 false를 반환합니다.
그럼 실제 코드를 살펴보겠습니다.
예제 코드
const arr = ["g", "z", "z", "v", "b", "b", "b"];
const checkThree = arr => {
const prev = {
element: null,
count: 0
};
for(let i = 0; i < arr.length; i++){
const { count, element } = prev;
if(count === 2 && element === arr[i]){
return true;
};
prev.count = element === arr[i] ? count + 1 : count;
prev.element = arr[i];
};
return false;
};
console.log(checkThree(arr));
console.log(checkThree(["z", "g", "z", "z"]));출력 결과
콘솔에 출력되는 결과는 다음과 같습니다.
true false
코드 설명
첫 번째 배열 ["g", "z", "z", "v", "b", "b", "b"]에서는 마지막에 "b"가 세 번 연속 등장하므로 true가 출력됩니다. 반면 두 번째 배열 ["z", "g", "z", "z"]에서는 "z"가 최대 두 번까지만 연속으로 나타나기 때문에 false가 반환됩니다.
이 알고리즘은 배열을 한 번만 순회하므로 시간 복잡도는 O(n)이며, 추가 메모리 사용량은 상수 수준(O(1))으로 매우 효율적입니다. 또한 prev 객체 하나로 상태를 관리하기 때문에 코드가 간결하고 가독성이 뛰어납니다.