Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript로 엘리베이터가 이동한 총 층수 구하는 방법

문제

건물 엘리베이터가 일정 시간 동안 정차한 층 번호를 요소로 가진 배열을 입력받는 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로 설정하면 마지막 요소에서 존재하지 않는 다음 요소를 참조하는 불필요한 연산을 줄일 수 있어 성능 면에서도 유리합니다.