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

JavaScript로 문자 행렬과 인덱스 배열을 활용해 문자열 조합하기

문제 정의

n × n 크기의 문자 행렬(matrix)과 양의 고유 정수로 이루어진 배열을 입력받는 JavaScript 함수를 작성해야 합니다. 함수는 행렬의 문자들을 1부터 시작하는 인덱스(1-based index)로 펼쳤을 때, 주어진 숫자 배열에 해당하는 인덱스 위치의 문자들을 순서대로 이어 하나의 문자열을 만들어 반환해야 합니다.

입력 예시

문자 행렬:

[
['a', 'b', 'c', 'd'],
['o', 'f', 'r', 'g'],
['h', 'i', 'e', 'j'],
['k', 'l', 'm', 'n']
];

숫자 배열:

[1, 4, 5, 7, 11]

위 입력에 대한 출력은 'adore'가 되어야 합니다. 행렬을 왼쪽에서 오른쪽, 위에서 아래 순서로 1-based 인덱스로 나열하면 a(1), b(2), c(3), d(4), o(5), f(6), r(7), g(8), h(9), i(10), e(11)... 이므로, 인덱스 1, 4, 5, 7, 11에 있는 문자는 각각 a, d, o, r, e입니다.

풀이 접근 방식

이 문제는 다음 두 단계로 해결할 수 있습니다.

1단계 — 행렬 평탄화: 2차원 문자 행렬을 forEach와 스프레드 연산자(...)를 사용해 1차원 배열로 변환합니다. 이렇게 하면 행렬 전체를 하나의 연속된 문자 시퀀스처럼 다룰 수 있습니다.

2단계 — 인덱스 매핑: 숫자 배열을 순회하면서 각 값에서 1을 뺀 위치(JavaScript 배열은 0-based이므로)의 문자를 결과 문자열에 추가합니다. 존재하지 않는 인덱스가 들어올 경우를 대비해 || ''로 안전하게 처리합니다.

구현 코드

const arr = [
['a', 'b', 'c', 'd'],
['o', 'f', 'r', 'g'],
['h', 'i', 'e', 'j'],
['k', 'l', 'm', 'n']
];
const pos = [1, 4, 5, 7, 11];

const buildString = (arr = [], pos = []) => {
// 2차원 행렬을 1차원 배열로 평탄화
const flat = [];
arr.forEach(sub => {
flat.push(...sub);
});

// 지정된 인덱스의 문자를 이어 붙임
let res = '';
pos.forEach(num => {
res += (flat[num - 1] || '');
});

return res;
};

console.log(buildString(arr, pos));

실행 결과

adore

추가 팁

행렬 평탄화 단계는 ES2019에서 도입된 Array.prototype.flat() 메서드를 사용하면 더욱 간결하게 작성할 수 있습니다. 즉, arr.flat() 한 줄로 동일한 결과를 얻을 수 있으며, 성능 면에서도 유리합니다. 또한 mapjoin을 조합하면 다음과 같이 함수형 스타일로도 구현할 수 있습니다.

const buildString = (arr = [], pos = []) => {
const flat = arr.flat();
return pos.map(num => flat[num - 1] || '').join('');
};

두 방식 모두 시간 복잡도는 O(n² + m)(n은 행렬 크기, m은 인덱스 배열 길이)로 효율적이며, 실무에서는 가독성이 좋은 후자의 방식을 권장합니다.