자바스크립트스럽게 퀵 정렬 구현하기
JavaScriptonic
파이썬에는 파이썬스럽게 작성된 코드를 파이써닉(Pythonic)한 코드라고 말합니다. 또한 파이썬 특유의 문법을 활용해 가독성을 확보하면서, 효율적으로 프로그래밍하는 방식을 뜻하기도 합니다. 파이썬은 확실히 C나 Java 등과는 다른 유연한 문법을 가지고 있습니다. 그럼 자바스크립트에도 비슷한 용어가 있을까요?
그래서 한 번 구글에 찾아 봤지만, 원하는 내용은 딱히 없었습니다. 하지만 유행하는 신조어들은 누군가로부터 시작되어, 여러 사람들의 입을 타고 퍼진 것이기에 저도 한 번 해보겠습니다(?). 자바스크립토닉한 코드라 함은 어떤 것들이 포함될 수 있을까요? 지금 당장은 세 가지 정도가 떠오르네요.
- 호이스팅의 특성을 이용한 코드
- ECMA Script 6 이상의 문법 활용하기
- Airbnb의 스타일 가이드를 따른 코드
사실 뭐 갑자기 생각 난 단어를 한 번 밀어보자는 거라 정리가 확 되지는 않네요. 그래도 일단은 주제가 자바스크립트스럽게 퀵 정렬을 구현해 보는 것이니까, 직접 퀵 정렬을 구현해 보면서 어떻게 하면 자바스크립트스러운 코드가 될 수 있는지 확인해 보겠습니다.
퀵 정렬 알고리즘
const quickSort = (arr, start, end) => {
if (start >= end) return;
// 기준 요소를 맨 앞 요소로 설정
const pivot = start;
let left = start + 1;
let right = end;
while (left <= right) {
while (arr[left] <= arr[pivot]) left++;
while (arr[right] > arr[pivot]) right--;
if (left <= right) [arr[left], arr[right]] = [arr[right], arr[left]];
else [arr[pivot], arr[right]] = [arr[right], arr[pivot]];
}
quickSort2(arr, start, pivot - 1);
quickSort2(arr, pivot + 1, end);
};
퀵 정렬은 재귀 함수로 구현하는 것이 일반적입니다. 위 코드는 배열의 맨 앞 요소를 pivot으로 두고, pivot보다 작으면 매개변수로 받은 배열의 왼쪽으로 모으고, pivot보다 크면 오른쪽으로 모아둡니다. 그렇게 pivot을 기준으로 좌우에 서브 배열 2개가 생기게 되는데, 이 배열들을 인자로 하여 재귀 호출하며 정렬을 이어가면 됩니다.
가장 기본적이기에 위 코드는 다른 프로그래밍 언어로 구현하고자 할 때도 예시로써 많이 사용됩니다. 하지만 자바스크립트스러운 느낌이 나지는 않습니다. 그래서 자바스크립트에서 제공하는 메소드를 이용해 수정해 보려 합니다. 바로 확인해 보시죠.
자바스크립트스럽게 수정한 코드
const quickSort = (arr) => {
if (arr.length <= 1) return arr;
const pivot = arr[0];
const tail = arr.slice(1);
const left = tail.filter((item) => item < pivot);
const right = tail.filter((item) => item > pivot);
return quickSort(left).concat([pivot], quickSort(right));
};
ES6 이후에 정식 사양이 된 배열 메소드들만 사용하면서 수정해 봤는데 어떤가요? 코드의 길이도 훨씬 짧아졌고, 가독성 또한 좋아지지 않았나요? 비록 두 코드 모두 재귀적으로 동작하기에 극적인 성능 개선이 있지는 않지만, 그래도 자바스크립트의 느낌을 물씬 살리면서 가독성을 확보했기에, 저는 개인적으로 더 아름다운 코드라 생각합니다.
이번 시간에는 본문 주제에 맞춰 퀵 정렬 코드만 가볍게 변경해 봤는데, 요즘은 어떤 코드든 간에 항상 자바스크립트처럼 작성하기 위해 많은 고민을 하는 것 같습니다. 저는 성능 이전에 누가 보더라도 깔끔하면서, 이해하기 쉬운 코드가 좋은 코드라 생각하고 있습니다. 물론 성능이 너무 별로면 안 되겠죠? 😅
'💻 컴퓨터공학 > 알고리즘' 카테고리의 다른 글
자바스크립트로 코딩 테스트 준비하기 (0) | 2022.02.22 |
---|---|
다익스트라 알고리즘으로 경로 나타내기 (0) | 2022.02.20 |
스택을 이용한 계산기 만들기 (0) | 2022.02.01 |
이진 탐색 (Binary Search) (0) | 2021.10.28 |
정렬 알고리즘 (Sorting Algorithms) (0) | 2021.10.27 |
댓글
이 글 공유하기
다른 글
-
자바스크립트로 코딩 테스트 준비하기
자바스크립트로 코딩 테스트 준비하기
2022.02.22 -
다익스트라 알고리즘으로 경로 나타내기
다익스트라 알고리즘으로 경로 나타내기
2022.02.20 -
스택을 이용한 계산기 만들기
스택을 이용한 계산기 만들기
2022.02.01 -
이진 탐색 (Binary Search)
이진 탐색 (Binary Search)
2021.10.28