[백준] 11728 배열 합치기 JavaScript

·2024년 5월 29일

문제

정렬되어있는 두 배열 A와 B가 주어진다. 두 배열을 합친 다음 정렬해서 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 배열 A의 크기 N, 배열 B의 크기 M이 주어진다. (1 ≤ N, M ≤ 1,000,000)

둘째 줄에는 배열 A의 내용이, 셋째 줄에는 배열 B의 내용이 주어진다. 배열에 들어있는 수는 절댓값이 10^9보다 작거나 같은 정수이다.

출력

첫째 줄에 두 배열을 합친 후 정렬한 결과를 출력한다.

예제 입력

2 2
3 5
2 9

예제 출력

2 3 5 9

내가 했던 풀이 방법

병합 정렬을 이용해서 정렬을 하면서 배열을 합쳐주었다.
병합 정렬은 아래와 같은 방법으로 진행한다.

  1. 입력받은 N, M과 A, B를 Number형/Number형 배열로 저장해준다.
  2. A와 B의 index를 관리할 index 변수들을 0으로 초기화해주고, 정렬한 합배열을 저장할 sorted를 선언해준다.
  3. 정렬이 될 때까지 4번을 반복해준다.
  4. index변수들이 각각 A와 B의 length가 아닐 경우, 둘 중에 더 작은 값을 sorted에 push 해주고, 해당하는 index를 1 증가시켜준다. index 변수가 해당 배열의 length와 같아질 경우, sorted에 현재까지 sorted 뒤에, 다른 배열의 남은 부분을 전부 추가해준다. (slice를 이용하여 index를 포함한 이후의 모든 값을 추가해주었다. 전부 추가가 된 경우, 반복문을 탈출한다.)
  5. 정렬된 sorted를 return해주고, 해당 배열을 문자열로 변환해준다.

코드

const fs = require('fs');
let [input, ...arrays] = fs.readFileSync(0, 'utf-8').toString().trim().split('\n');

let N = Number(input.trim().split(' ')[0]);
let M = Number(input.trim().split(' ')[1]);

let A = arrays[0].trim().split(' ').map(Number);
let B = arrays[1].trim().split(' ').map(Number);

function merge(A, B) {
  let indexA = 0;
  let indexB = 0;
  let sorted = [];
  while (true) {
    if (indexA !== A.length && indexB !== B.length) {
      if (A[indexA] <= B[indexB]) {
        sorted.push(A[indexA++]);
      } else {
        sorted.push(B[indexB++]);
      }
    }
    if (indexA === A.length) {
      sorted = [...sorted, ...B.slice(indexB)];
      break;
    } else if (indexB === B.length) {
      sorted = [...sorted, ...A.slice(indexA)];
      break;
    }
  }
  return sorted;
}

console.log(merge(A, B).join(' '));

회고

간단한 정렬이 아닌 정렬 알고리즘으로 풀이해야하는 문제는 정말 오랜만인 것 같다. 제시되는 배열들이 정렬된 상태였기에 병합 정렬이 적절하다고 해서 병합 정렬로 풀이했다. 유형에 맞는 정렬 알고리즘도 슬슬 공부해야겠다.

참고 자료

알고리즘 - 병합 정렬(Merge Sort, 머지 소트)의 개념과 문제 활용법

profile
Frontend🍓

0개의 댓글