38일차 (01-29-2021)

조상래·2021년 1월 29일
0

코드스테이츠

목록 보기
36/73

solostudy 2일차, 약간의 여유를 가지며 이때까지 했던 스프린트 레퍼런스를 훑어 보았다. 내가 쓴 답과 정말 비슷한 것도 있었고, 완전히 다르지만 아주 간단한 것도 있었다. 가장 큰 차이를 보였던건 reduce등의 메소드가 아주 유용하게 쓰였다는것. 나는 아직 이런 메소드를 활용하기엔 조금은 부족한 것 같다. 코드를 쓰는 와중에 어떤 부분에서 적용을 해야하고, 어떻게 하면 더 유용하게 쓸수 있을지 아직은 바로바로 캐치가 되지 않는다. 그래서 느끼는 것은 수도코드를 작성하는 것을 중요하게 생각하고 습관을 들여야겠다는 것이다. 왜냐하면 수도코드를 쓰면서 어떤 키워드를 써야할지 대충 계획을 할수있으니까.

오늘은 특별히 새롭게 배운것은 없다. 그래서 토이프라블럼 문제에 대해서 말해보겠다. 문제의 내용은 대충이렇다.여러가지의 정수가 요소로 구성된 배열이 있고 그 배열을 bubble sort 방식을 이용해서 정렬하는 것.

bubble sort?

  • 첫 번째 요소와 두 번째 요소를 비교하여 첫 번째 요소가 더 크면 두 요소의 자리를 바꾼다.
  • 두 번째 요소와 세 번째 요소를 비교하여 두 번째 요소가 더 크면 두 요소의 자리를 바꾼다.
    .
    .
    .
  • 마지막 앞의 요소와 마지막 요소를 비교하여 마지막 앞의 요소가 더 크면 두 요소의 자리를 바꾼다.
  • 그 결과 마지막 요소는 그 요소들 중에 가장 큰 요소이다.
  • 이를 배열의 횟수 만큼 반복하면 오름차순으로 정렬이 된다.

이 모습이 마치 큰 거품이 위로 밀려 나는 모습 같아서 bubble sort이다.

이 것을 자바스크립트로 구현을 해야한다. 단, arr.sort() 메소드를 사용하지 않고 구현 하여야한다. 그리고 중복되는 수는 없다.

구현하기 전 생각해야될 점을 하나씩 써보자.

  1. for 반복문을 이용하여, 배열의 요소를 바꾸기.
  2. 배열의 요소를 바꾸기 전 요소를 미리 저장. (앞의 요소를 뒤의 요소로 바꾸면 뒤의 요소는 앞의 요소로 바꿀수가 없다.)
  3. 배열의 요소의 움직임이 하나도 없다면 이는 배열이 모두 정렬 되었다는 것.
  4. 정렬된 배열을 저장하고 다시 정렬후 저장된 배열과 비교하여 만약 같다면 리턴.
  5. 다르면 재귀를 이용해 재정렬.

여기서 4, 5번 이 두개가 조금 걸렸었다. 왜냐하면 자바스크립트의 배열은 레퍼런스 타입으로 주소가 같지 않다면 비교가 되지 않는다는 것. 그래서 생각해낸 방식은 stringify를 이용하여 문자의 형식으로 저장/ 비교 하는 방법이다.

const bbSort = function (arr) {
  let before = JSON.stringify(arr);
  let bubbling = (bubble) => {
    for (let i = 1; i < bubble.length; i += 1) {
      let front = bubble[i - 1];
      let back = bubble[i]
      if (front > back) {
        bubble[i - 1] = back;
        bubble[i] = front;
      }
    }
    if (JSON.stringify(bubble) === before) {
      return bubble;
    }
    before = JSON.stringify(bubble);
    bubbling(bubble);
  }

  bubbling(arr);
  return arr;
};

답은 잘 나왔지만 stringify를 썼다는게 조금 찝찝하다... 자주 안쓰는 녀석이라 그런가? 여튼 문제를 풀고 레퍼런스를 참고해봤는데 여러가지 해답이 있었다. 그중 가장 노멀한 해답에서 배열이 변화가 없음을 증명하는 방식으로 배열이 바뀔 때 마다 count를 해주었다. 만약 그 count가 0이면 배열의 변화가 없는것! 정말 똑똑하다... 부럽다 이런 생각을 할 수 있다는게... 그리고 구조분해할당을 이용한 부분도 있어서 아주 흥미로웠다. 매우 유용할 것 같아서 머릿속에 넣어두었다.

구조분해 할당이 적용된 부분은 바로 배열의 순서를 바꿔주는 부분인데,

let front = bubble[i - 1];
let back = bubble[i]
if (front > back) {
  bubble[i - 1] = back;
  bubble[i] = front;

난 위와 같은 방식으로 작성을 했지만,

if (bubble[i - 1] > bubble[i]) {
  [bubble[i - 1], bubble[i]] = [bubble[i], bubble[i - 1]];
}

위와 같이 작성을 할 수 있다는 것! 이러한 문법에 대해서 조금 더 관심을 갖고 공부를 손에 익혀야겠다.

마지막으로 조금 정리된 나의 코드다.

const bbSort = function (arr) {
  let before = JSON.stringify(arr);
  let bubbling = (bubble) => {
    for (let i = 1; i < bubble.length; i += 1) {
      if (bubble[i - 1] > bubble[i]) {
        [bubble[i - 1], bubble[i]] = [bubble[i], bubble[i - 1]];
      }
    }
    if (JSON.stringify(bubble) === before) return bubble;
    before = JSON.stringify(bubble);
    bubbling(bubble);
  }

  bubbling(arr);
  return arr;
};

하면 할수록 새롭고 재밌다!

profile
Codestates Full IM26기 수료

0개의 댓글