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

JavaScript로 문자열 배열 정렬 후 주대각선 요소 추출하기

문제 설명

n개의 문자열을 담고 있는 배열을 입력으로 받는 JavaScript 함수를 작성해야 합니다. 이때 배열의 각 문자열은 정확히 n개의 문자로 이루어져 있다고 가정합니다.

함수는 다음 두 가지 작업을 순서대로 수행해야 합니다.

첫째, 배열을 알파벳 순서(사전순)로 정렬합니다.
둘째, 정렬된 배열을 2차원 형태로 보았을 때 왼쪽 상단 모서리에서 시작하는 주대각선(principal diagonal)에 위치한 문자들을 이어 붙인 문자열을 반환합니다.

예를 들어 4개의 문자열이 있다면 각 문자열은 4글자씩 가지므로 4×4 행렬처럼 배치할 수 있고, 인덱스 (0,0), (1,1), (2,2), (3,3)에 해당하는 문자들을 차례로 가져오면 됩니다.

예제 코드

아래는 위 문제를 해결하는 코드입니다.

const arr = [
  'star',
  'abcd',
  'calm',
  'need'
];
const sortPickDiagonal = () => {
  const copy = arr.slice();
  copy.sort();
  let res = '';
  for(let i = 0; i < copy.length; i++){
    for(let j = 0; j < copy[i].length; j++){
      if(i === j){
        res = res + copy[i][j];
      }
    };
  };
  return res;
};
console.log(sortPickDiagonal(arr));

코드 동작 원리

코드가 어떻게 작동하는지 단계별로 살펴보겠습니다.

1. 원본 배열 보호: arr.slice()를 사용해 원본 배열의 복사본을 만듭니다. sort()는 원본 배열 자체를 변경(mutate)하기 때문에, 원본 데이터를 유지하려면 복사본을 정렬하는 것이 안전합니다.

2. 사전순 정렬: copy.sort()를 호출하면 배열이 알파벳 순서로 정렬됩니다. 정렬 결과는 다음과 같습니다.

['abcd', 'calm', 'need', 'star']

3. 대각선 문자 추출: 중첩 반복문을 돌면서 행 인덱스 i와 열 인덱스 j가 같은 경우(i === j), 즉 대각선에 해당하는 문자만 결과 문자열에 추가합니다.

간결한 개선 버전

대각선 요소만 필요하다면 중첩 반복문 없이 한 번의 반복으로 처리할 수 있습니다. copy[i][i]가 곧 대각선 문자이기 때문입니다.

const sortPickDiagonal = () => {
  const copy = [...arr].sort();
  return copy.map((str, i) => str[i]).join('');
};

map()으로 각 문자열에서 자신의 인덱스와 같은 위치의 문자를 꺼낸 뒤 join()으로 합치는 방식으로, 코드가 훨씬 간결하고 가독성도 좋아집니다.

출력 결과

aaer

출력값이 왜 aaer인지 확인해 보겠습니다. 정렬된 배열에서 대각선 문자를 하나씩 가져오면 다음과 같습니다.

  • 'abcd'의 0번째 문자 → a
  • 'calm'의 1번째 문자 → a
  • 'need'의 2번째 문자 → e
  • 'star'의 3번째 문자 → r

이 문자들을 순서대로 이어 붙이면 최종 결과인 aaer가 됩니다.