본문 바로가기
코딩 테스트 문제 및 풀이

[JS] 코딩 테스트 문제 : 버블정렬

by spare8433 2024. 1. 8.

문제 : 버블정렬



문제 설명


N 개의 숫자가 입력되면 오름차순으로 정렬하여 출력하는 프로그램을 작성하세요.
정렬하는 방법은 버블정렬입니다.


▣ 입력설명

첫 번째 줄에 자연수 N(1<=N<=100)이 주어집니다.
두 번째 줄에 N개의 자연수가 공백을 사이에 두고 입력됩니다. 각 자연수는 정수형 범위 안에 있습니다.


▣ 출력설명

오름차순으로 정렬된 수열을 출력합니다.


▣ 입력예제 1

6
13 5 11 7 23 15


▣ 출력예제 1

5 7 11 13 15 23



내코드


// 버블 정렬: 인접한 두 원소를 비교하며 자리를 바꿔 결국 순서대로 정렬하는 방식
function solution(arr) {
  let answer = arr;

  // 문자열 길이 만큼 순회 시작 값은 마지막 값부터 하나씩 줄여가 0 까지 진행
  for (let i = answer.length - 1; i >= 0; i--) {
    // 0 번째 값을 기준으로 i 번째까지 값을 비교해가며 값을 교환하는 반복과정
    // 최종적으로 i 번째 값은 가장 큰 숫자가 오게된다.
    let left = answer[0];
    for (let j = 1; j <= i; j++) {
      if (left > answer[j]) {
        answer[j - 1] = answer[j];
        answer[j] = left;
      }
      left = answer[j];
    }
    console.log(answer);
  }
  return answer;
}

let arr = [13, 22, 11, 7, 23, 15];
console.log(solution(arr));



풀이


  1. 문자열 길이 만큼 순회하되 마지막 값 i 부터 하나씩 줄여가 0 까지 진행
  2. 다음 값과 비교할 이전 값을 저장한 left 를 배열의 0 번째 값으로 초기화한 후 새로 j 는 1 부터 i 까지 1씩 증가하는 반복문 안에서 배열의 j 번째 값과 left 값을 비교해 left 값이 큰 경우 left 값 즉 이전값 배열의 j -1 번째 값과 j 번째 값을 교환 (left 는 이전 값을 가지고 있으므로 j -1 번째 값을 가지고 있다)
  3. 위 과정이 모두 끝나 정렬이 완료된 배열을 반환



보완할 수 있는 부분


// 기존코드
for (let i = answer.length - 1; i >= 0; i--) {
  let left = answer[0];
  for (let j = 1; j <= i; j++) {
    if (left > answer[j]) {
      answer[j - 1] = answer[j];
      answer[j] = left;
    }
    left = answer[j];
  }
  console.log(answer);
}

// 보완코드
for (let i = arr.length - 1; i > 0; i--) {
  console.log(i);
  for (let j = 0; j < i; j++) {
    if (arr[j] > arr[j + 1]) {
      [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
    }
  }
  console.log(arr);
}



두 값을 비교하기 위해 사용한 임시 변수 left 를 사용한 기존 방식에서 우측의 배열을 좌측에 배열에 구조분해 할당 하여 집어넣는 형태로 간단하게 변경




참고

https://www.inflearn.com/course/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4/dashboard