문제
건물 엘리베이터가 일정 시간 동안 정차한 층 번호를 요소로 가진 배열을 입력받는 JavaScript 함수를 작성해야 합니다. 그리고 이 데이터를 바탕으로 해당 시간 동안 엘리베이터가 이동한 총 층수를 반환해야 합니다.
접근 방법
핵심 아이디어는 매우 간단합니다. 엘리베이터가 한 층에서 다음 층으로 이동할 때마다 두 층 번호의 차이만큼 움직이게 되므로, 배열에서 인접한 두 요소의 차이(절댓값)를 모두 더하면 전체 이동 층수를 구할 수 있습니다.
예를 들어 배열이 [7, 1, 7, 1]이라면 다음과 같이 계산됩니다.
- 7층 → 1층 : 6층 이동
- 1층 → 7층 : 6층 이동
- 7층 → 1층 : 6층 이동
따라서 총 이동 층수는 6 + 6 + 6 = 18이 됩니다.
예제 코드
다음은 위 로직을 구현한 코드입니다.
const arr = [7, 1, 7, 1];
const floorsCovered = (arr = []) => {
let res = 0;
for (let i = 0; i < arr.length; i++){
if (arr[i] > arr[i+1]){
res += arr[i] - arr[i+1];
}
if (arr[i] < arr[i+1]){
res += arr[i+1] - arr[i];
}
}
return res;
};
console.log(floorsCovered(arr));
출력 결과
콘솔에는 다음과 같이 출력됩니다.
18
코드 동작 원리
함수 내부에서는 결과를 저장할 변수 res를 0으로 초기화한 뒤, 배열을 순회하면서 현재 층(arr[i])과 다음 층(arr[i+1])을 비교합니다.
- 현재 층이 더 높으면(내려가는 경우) 두 값의 차를 결과에 더합니다.
- 현재 층이 더 낮으면(올라가는 경우) 역시 두 값의 차를 결과에 더합니다.
두 경우 모두 결국 인접 층 사이의 거리를 누적하는 것이므로, 반복이 끝나면 res에 엘리베이터가 이동한 총 층수가 저장됩니다.
더 간결한 개선 코드
Math.abs() 메서드를 활용하면 조건문 없이 훨씬 깔끔하게 같은 로직을 표현할 수 있습니다.
const floorsCovered = (arr = []) => {
let res = 0;
for (let i = 0; i < arr.length - 1; i++) {
res += Math.abs(arr[i] - arr[i + 1]);
}
return res;
};
console.log(floorsCovered([7, 1, 7, 1])); // 18또한 반복 범위를 arr.length - 1로 설정하면 마지막 요소에서 존재하지 않는 다음 요소를 참조하는 불필요한 연산을 줄일 수 있어 성능 면에서도 유리합니다.