[23.02.22] Daily Coding 23

동화·2023년 2월 22일
0

Daily-Coding

목록 보기
13/15
post-thumbnail
  1. bubbleSort
    정수를 요소로 갖는 배열을 입력받아 오름차순으로 정렬하여 리턴해야 합니다.

버블 정렬(bubble sort)은 여러 정렬 알고리즘(삽입 정렬, 퀵 정렬, 병합 정렬, 기수 정렬 등) 중 가장 기본적인 알고리즘입니다.

버블 정렬 알고리즘은 아래와 같습니다.

  1. 첫 번째 요소가 두 번째 요소보다 크면, 두 요소의 위치를 바꿉니다. (swap)
  2. 두 번째 요소와 세 번째 요소보다 크면, 두 요소의 위치를 바꿉니다. (swap)
  3. 1, 2를 마지막까지 반복합니다. (마지막에서 두 번째 요소와 마지막 요소를 비교)
  4. 1~3의 과정을 한 번 거치게 되면, 가장 큰 요소가 배열의 마지막으로 밀려납니다.
  5. 1~3의 과정을 첫 요소부터 다시 반복합니다.
  6. 5를 통해 두 번째로 큰 요소가 배열의 마지막 바로 두 번째로 밀려납니다.
  7. 1~3의 과정을 총 n번(배열의 크기) 반복합니다.
  • 이 모습이 마치 '거품이 밀려 올라가는 것과 같은 모습'과 같아서 bubble sort라고 부릅니다.

const bubbleSort = function (arr) {
  return arr.sort((a,b) => a-b)
};

이렇게 하고 싶었다.. ㅎ
어쨌든 시작해보자

일단 전체를 순환하는 반복문이 하나 필요할 거고,
그 안에서 반복문을 추가해 점점 비교하는 조건문을 추가해보려고 해봤다.

const bubbleSort = function (arr) {
  for (let i = 0; i<=arr.length; i++) {
    for (let j = 0; j<=arr.length; j++) {
      if (arr[j] > arr[j+1]) {
        let temp = arr[j+1]
        arr[j+1] = arr[j]
        arr[j] = temp
      }
    }
  }
  return arr
};

이랬더니 실행시간초과가 떴고, 너무 많은 순환을 해줘야하기 때문인듯...
그래서 바꿀 배열과 원래 배열이 변한게 없다면(JSON.stringify이용/ (newArr.toString() === arr.toString()) 도 가능), break를 걸어주는 조건을 안 쪽 반복문에 추가해주었다.
아 그리고 i, j 범위도 배열이기때문에 등호 빼주고, 또 마지막까진 비교하지 않기때문에 -1도 해주어야함! 너무 대충 생각해버린 모양

내가 쓴 답 ✍🏻

const bubbleSort = function (arr) {
  let newArr = arr.slice(0)

  for (let i = 0; i<newArr.length-1; i++) {
    for (let j = 0; j<newArr.length-1; j++) {
      if (newArr[j] > newArr[j+1]) {
        let temp = newArr[j+1]
        newArr[j+1] = newArr[j]
        newArr[j] = temp
      }
    }
    if(JSON.stringify(newArr) === JSON.stringify(arr))  {
       break
    }
  }
  return newArr;
};

레퍼런스 📌

let bubbleSort = function (arr) {
  let N = arr.length;

  for (let i = 0; i < N; i++) {
    // swap 횟수를 기록한다.
    // 어떤 요소도 swap되지 않은 경우, 배열은 정렬된 상태이다.
    let swaps = 0;

    // 매 반복(iteration)마다 i번째로 큰 수가 마지막에서 i번째 위치하게 된다.
    // 이미 정렬된 요소는 고려할 필요가 없으므로, 'j < N - 1 - i'만 비교하면 된다.
    for (let j = 0; j < N - 1 - i; j++) {
      if (arr[j] > arr[j + 1]) {
        swaps++;
        swap(j, j + 1, arr);
      }
    }

    if (swaps === 0) {
      break;
    }
  }

  return arr;
};

레퍼런스는 횟수를 기록해서 횟수가 0이라면 break해주는 식으로 했다.
그리고 또, 이미 정렬된 요소는 고려할 필요가 없으므로, 'j < N - 1 - i'만 비교하면 된다는 부분이! 있어서, 아하! 하고
j < newArr.length - i - 1 나도 요렇게 바꿈 ㅎㅎ 하나라도 일을 줄이자

5개의 댓글

comment-user-thumbnail
2023년 2월 23일

JSON.stringify 좋은 방법인거 같아요 배우고 갑니당!

답글 달기
comment-user-thumbnail
2023년 2월 23일

보는내내 정말 sort 가 그리워지는 글입니다.

답글 달기
comment-user-thumbnail
2023년 2월 25일

저도 정렬 공부 다시 하러 가야겠습니다 ㅠ

답글 달기
comment-user-thumbnail
2023년 2월 26일

정렬 시작하면 한도끝도 없죠,, 화이팅입니다 끝까지 해주셔서 저도 알려주세요~^^

답글 달기
comment-user-thumbnail
2023년 2월 26일

버블 정렬 ... 전 sort 가 젤 좋아요 ... ㅋㅋㅋㅋㅋ

답글 달기