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

JavaScript로 스크램블된 알파벳 순서를 기준으로 배열이 사전순으로 정렬되어 있는지 확인하는 방법

이번 글에서는 문자열 배열을 첫 번째 인수로 받는 JavaScript 함수를 작성해 보겠습니다. 두 번째 인수는 영어 소문자 알파벳 26자를 모두 포함하되, 임의로 섞인(scrambled) 순서의 문자열입니다.

함수의 역할은 배열에 담긴 단어들이 두 번째 인수로 전달된 순서를 기준으로 사전순(lexicographical order)으로 올바르게 배치되어 있는지 확인하는 것입니다. 올바르게 배치되어 있다면 true를, 그렇지 않다면 false를 반환해야 합니다.

예시

예를 들어, 입력 배열과 순서 문자열이 다음과 같다고 가정해 보겠습니다.

const arr = ['this', 'is', 'something', 'mad'];
const order = 'hdetljnopqabcuvwxfgirsykmz';

이 경우 출력 결과는 다음과 같아야 합니다.

const output = true;

그 이유는 order 문자열에서 't'가 'i'보다 앞에 있고, 'i'는 's'보다, 's'는 'm'보다 앞에 있기 때문입니다. 즉, 각 단어의 첫 글자가 지정된 순서를 따르고 있으므로 배열은 사전순으로 정렬되어 있는 것입니다.

해결 접근 방식

이 문제를 해결하는 핵심 아이디어는 다음과 같습니다.

  • 배열에서 인접한 두 단어를 한 쌍씩 비교합니다.
  • 각 단어를 첫 글자부터 차례대로 살펴보며, order.indexOf()로 해당 글자가 순서 문자열에서 몇 번째 위치에 있는지 구해 서로 비교합니다.
  • 현재 단어의 글자가 다음 단어의 같은 위치 글자보다 순서상 앞선다면, 이 쌍은 이미 정렬되어 있는 것이므로 비교를 중단(break)하고 다음 쌍으로 넘어갑니다.
  • 두 글자가 같다면 아직 우열을 가릴 수 없으므로 다음 글자를 계속 비교(continue)합니다.
  • 현재 단어의 글자가 오히려 더 뒤에 있다면 배열이 올바르게 정렬되어 있지 않은 것이므로 즉시 false를 반환합니다.

구현 코드

const arr = ['this', 'is', 'something', 'mad'];
const order = 'hdetljnopqabcuvwxfgirsykmz';
const isPlacedCorrectly = (arr = [], order) => {
    const { length } = arr;
    for(let i = 0; i < length - 1; i++){
       for(let j =0; j < arr[i].length;j++){
          if(order.indexOf(arr[i][j])< order.indexOf(arr[i+1][j])) {
            break;
          }
          else if (order.indexOf(arr[i][j]) === order.indexOf(arr[i+1][j])){
            continue;
          } else {
            return false;
          }
       }
    }
    return true;
};
console.log(isPlacedCorrectly(arr, order));

출력 결과

콘솔에 출력되는 결과는 다음과 같습니다.

true

참고로, 한 단어가 다른 단어의 접두사인 경우(예: 'app'과 'apple')에도 위 코드는 짧은 단어가 먼저 오면 true를 반환합니다. 내부 루프가 짧은 단어의 길이까지만 반복되기 때문에, 남은 글자가 있는 더 긴 단어와의 비교에서도 문제없이 통과됩니다. 만약 접두사 관계에서 길이까지 엄격하게 검증해야 한다면, 내부 루프 종료 후 두 단어의 길이를 비교하는 로직을 추가로 넣어주면 됩니다.