알고리즘 문제를 풀면서 잘 안풀리는 문제들이 생기기 시작했다. 이제 쉽게 푼 문제는 그냥 내가 작성한 코드만 확인하고, 다른 사람 풀이를 확인해서 좀 더 쉬운 코드가 있으면 그 코드를 분석해서 생각을 정리해 보려고 한다. 못 푼 문제에 대해서는 철저히 분석해서 내 것으로 만들고 넘어 가야겠다.
1. filter와 length 사용
좀 더 간결한 코드가 없을까 싶어서 다른 사람의 문제 풀이를 봤는데, 진짜 신선한 충격이었다. [0, 90, 91, 180]의 배열을
filter
로 걸러서 예각, 직각, 둔각을 알아내는 것도 그렇고,length
로 결과값을 리턴한 것도 신기했다. 여기서 length는 입력된 각도에 따라 첫 번째 사분면(90도 미만)이면 1, 두 번째 사분면(90도)은 2, 세 번째 사분면(90도 초과, 180도 미만)은 3, 네 번째 사분면(180도)은 4를 반환한다. 사실 잘 이해는 안간다. 각도 값인지 어떻게 인식하고 1, 2, 3, 4를 도출하는 거지?
2. 삼항연산자 사용
다른 보편적인 코드는 삼항연산자를 이용하는 것인데, 삼항연산자를 이렇게 사용해도 되는지 처음 알았다. 삼항연산자는 (조건 ? true일때 : false일때) 이 조건으로만 사용할 수 있는 줄 알았는데, 세 항에 각각 조건과 출력값을 한 번에 넣을 수 있었구나... 메모메모!
문제를 보고 먼저 n보다 작으면서 짝수인 경우를 도출한 후 reduce를 통해 합을 구해야겠다고 생각했다. 변수가 n으로 들어가 있어서 우선 n보다 작은 수를 어떻게 도출하는가에 대해 좀 많이 생각했다. 그래서 arr 배열을 하나 만든 다음 map 함수를 사용해서 조건을 주고 도출한 수를 arr에 푸쉬하여 넣는 방식으로 풀려고 했다. 그런데 아주 초보다운 실수를 했다.
for문
사용reduce
사용function solution(n) {
// for문을 통해 n보다 작은 짝수값 도출하여 arr에 넣기
const arr = [];
for (let num = 2; num <= n; num += 2) {
arr.push(num);
}
// reduce를 사용하여 합 도출
const sum = arr.reduce((acc, cur) => acc + cur);
return sum;
}
여기서 또 문제가 발생했다. 테스트 하나에서 실패... 아무리 봐도 해결책을 모르겠어서 튜터님께 찾아갔다. reduce 함수를 사용할 때 초기값이 없어서 발생한 문제였다. for문을 돌릴 때 초기값을 2로 설정해서, 만약 n에 1이 오게 되면 실행이 안되는 것이다. reduce 함수 뒤에 0을 넣어서 초기값을 0으로 설정하니 정상적으로 테스트 통과했다. 쉽지않다.
const sum = arr.reduce((acc, cur) => acc + cur, 0);
다른 사람 코드로 배우기
for문을 돌릴 때,
anser+=i
로 설정해서 한번에 더해버리기...배열을 만들고 값을 push해서 reduce로 또 합계를 내는 것보다 훨씬 간단하다. 정말 많이 배운다.function solution(n) { let answer = 0; for (let i = 2; i <= n; i += 2) answer += i; return answer; }
다른 사람 풀이도 분석하고, 막히는 부분은 공식 문서들을 찾아보면서 하다보니 생각보다 시간이 너무 오래 걸린다. 하루에 5문제를 풀려고 했는데, 문제 수를 2~3문제로 줄여야 이후 계획에 차질이 없을 것 같다. 그래도 오늘도 하나 더 알아갑니다...