문제 정의
불리언(Boolean) 값으로 이루어진 배열과 논리 연산자를 인수로 받는 JavaScript 함수를 작성해야 합니다. 이 함수는 배열의 각 요소에 연산자를 왼쪽에서 오른쪽으로 순차적으로 적용한 뒤, 그 최종 결과를 불리언 값으로 반환해야 합니다.
예를 들어 [true, true, false] 배열에 'AND' 연산자가 주어지면, true && true && false 순서로 계산되어 최종적으로 false가 반환됩니다.
예제 코드
const array = [true, true, false];
const op = 'AND';
function logicalCalc(array, op){
var result = array[0];
for(var i = 1; i < array.length; i++){
if(op == "AND"){
result = result && array[i];
}
if(op == "OR"){
result = result || array[i];
}
if(op == "XOR"){
result = result != array[i];
}
}
return result;
}
console.log(logicalCalc(array, op));
실행 결과는 다음과 같습니다.
false
코드 동작 원리
이 함수의 핵심 로직은 다음과 같습니다.
- 초깃값 설정: 배열의 첫 번째 요소를 결과값(result)의 초깃값으로 지정합니다.
- 순차 순회: 두 번째 요소부터 마지막 요소까지 반복하면서 현재 결과값과 각 요소를 연산합니다.
- AND(&&): 모든 값이 true일 때만 true를 반환합니다. 중간에 false가 하나라도 나오면 결과는 false로 확정됩니다.
- OR(||): 요소 중 하나라도 true가 있으면 true를 반환합니다.
- XOR(!=): 배타적 논리합으로, 두 값이 서로 다를 때만 true가 됩니다. 자바스크립트에서는 같지 않음 비교 연산자(
!=)를 활용해 간단하게 구현할 수 있다는 점이 특징입니다.
reduce()를 활용한 개선 버전
배열 메서드인 reduce()를 사용하면 동일한 로직을 훨씬 간결하게 표현할 수 있습니다. reduce()는 별도의 초기값을 지정하지 않으면 배열의 첫 번째 요소를 누적값으로 사용하기 때문입니다.
const logicalCalc = (array, op) =>
array.reduce((result, value) => {
if(op === "AND") return result && value;
if(op === "OR") return result || value;
if(op === "XOR") return result !== value;
});
console.log(logicalCalc([true, true, false], "AND")); // false
이처럼 불리언 게이트 로직은 기본 반복문이든 reduce() 메서드든 어느 쪽으로도 손쉽게 구현할 수 있습니다. 코드의 가독성과 프로젝트 스타일에 맞춰 적절한 방식을 선택해 활용하시면 됩니다.