[Jacoste] 알고리즘 공부

tamagoyakii·2022년 10월 13일
1

Jacoste

목록 보기
1/9
post-thumbnail

자배, 대킴과 함께 간단한 알고리즘 공부를 시작했다. 일주일에 2회, 5문제씩 풀어온 뒤 함께 문제풀이를 확인하고 배운 것을 공유하는 스터디다. 뭐든 꾸준한 게 중요하다는 생각이 강하게 드는 요즘이다.

🐊 Jacoste Github

1. 정규표현식 /b

다음은 JadenCase를 만들기 위해 작성한 함수이다.

function solution(s) {
  return s.toLowerCase().replace(/\b[a-z]/g, (c) => c.toUpperCase());
}

/b는 단어의 경계에 대응하는 정규표현식이다. 즉 위의 식은 단어의 경계를 찾은 뒤 다음에 오는 문자를 찾아 대문자로 변환하는 식이다.

대킴님은 모든 문자열을 검사하여 공백 뒤의 문자를 대문자로 바꾸는 방법을 사용했다. str.toUpperCase() 메서드와 str.toLowerCase() 메서드가 알파벳이 아닌 문자들을 알아서 걸러준다는 것을 알게 되었다.

2. array.sort()

sort() 메서드를 안 쓴지 너무 오래되어서... 까맣게 잊고 있었다.

arr.sort((a, b) => a - b);	// 오름차순 정렬
arr.sort((a, b) => b - a);	// 내림차순 정렬

sort() 메서드는 문자열을 기준으로 정렬한다. 때문에 위와 같이 -를 사용하여 숫자로 정렬해 주어야 한다.

아래는 대킴님이 sort() 메서드를 풀어서(?) 쓴 식이다. sort() 메서드가 어떤 방식으로 작동하는지 다시 한번 살펴볼 수 있었다.

arr.sort(function compare(a, b) {
	if (a > b) return 1;
    if (a < b) return -1;
    return 0;
});

3. array.reduce()

reduce() 메서드를 다시 공부해보자.

arr.reduce(callback[, initialValue])

이 메서드는 총 네 개의 인자를 갖는다.

  1. acc : 누산기
  2. cur : 현재 값
  3. idx : 현재 인덱스
  4. src : 원본 배열

누산기와 현재 값만 사용하다 보니 그 외의 인자를 깜빡 잊고 있었다.

for (let i = 0; i < A.length; i++) answer += A[i] * B[i];

<최솟값 만들기> 문제에서 위와 같은 식을 썼었는데, reduce() 메서드를 사용한다면 다음과 같이 나타낼 수 있겠다.

A.reduce((acc, cur, i) => acc + cur * B[i], 0)

4. 함수형 vs. 절차형

무조건 메서드를 사용한 함수형 코드가 좋다는 막연한 생각이 있었는데, 오늘 대킴님과 이야기하면서 생각이 조금 바뀌었다.

대킴님은 C언어에 능통하시고, JavaScript에 익숙하지 않으셔서 절차형으로 코드를 작성하시는 경향이 있다. 오늘 대킴님의 코드를 보면서 토론을 하다가 함수형 코드는 가독성이 좋고 디버깅이 쉽다는 장점이 있지만 성능이 떨어진다는 것을 깨달아버렸다.

고차 함수를 유연하게 사용할 수 있는 능력도 중요하지만, 성능적 측면도 고려하면서 코드를 짜야겠다는 생각이 든다. 남의 코드를 보면서 오늘도 성장한다 우오옷 ! 🔥

0개의 댓글