[231108] 알고리즘 Level.0

Bora.K | 권보라·2023년 11월 8일
0

알고리즘

목록 보기
2/11
post-thumbnail

알고리즘 문제풀이 Levle.0


알고리즘 문제를 풀면서 잘 안풀리는 문제들이 생기기 시작했다. 이제 쉽게 푼 문제는 그냥 내가 작성한 코드만 확인하고, 다른 사람 풀이를 확인해서 좀 더 쉬운 코드가 있으면 그 코드를 분석해서 생각을 정리해 보려고 한다. 못 푼 문제에 대해서는 철저히 분석해서 내 것으로 만들고 넘어 가야겠다.

[#06] 두 수의 합


[#07] 두 수의 나눗셈


[#08] 각도기

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일때) 이 조건으로만 사용할 수 있는 줄 알았는데, 세 항에 각각 조건과 출력값을 한 번에 넣을 수 있었구나... 메모메모!


[#09] 짝수의 합

1. 내가 푼 방식의 오류 및 문제 분석

문제를 보고 먼저 n보다 작으면서 짝수인 경우를 도출한 후 reduce를 통해 합을 구해야겠다고 생각했다. 변수가 n으로 들어가 있어서 우선 n보다 작은 수를 어떻게 도출하는가에 대해 좀 많이 생각했다. 그래서 arr 배열을 하나 만든 다음 map 함수를 사용해서 조건을 주고 도출한 수를 arr에 푸쉬하여 넣는 방식으로 풀려고 했다. 그런데 아주 초보다운 실수를 했다.

  • map 함수는 기존 배열을 재가공하여 새로운 배열을 반환하므로, 배열의 갯수는 기존과 같다.
    해당 조건에 맞는 것들만 가져오려면 차라리 filter를 사용해야 한다.
  • filter 사용 시에는 새로운 값을 반환하기 때문에 return문이 필요 없고, 저장할 새로운 함수를 정의해 주어야 한다. 그런데 애초에 arr 배열 자체가 빈 값이기 때문에 결국은 map과 filter를 사용하는 것은 적절하지 않아 보인다.

2. 규칙찾기 및 코딩화

  • 빈 배열을 하나 생성한다.
  • n보다 작은 짝수 배열을 하나 만들어 준다. → for문 사용
  • 빈 배열에 for문을 통해 얻은 값들을 추가해 준다.
  • 기존 값들의 합을 구한다 → reduce 사용

3. 코딩

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;
}

[#10] 배열의 평균값


회고


다른 사람 풀이도 분석하고, 막히는 부분은 공식 문서들을 찾아보면서 하다보니 생각보다 시간이 너무 오래 걸린다. 하루에 5문제를 풀려고 했는데, 문제 수를 2~3문제로 줄여야 이후 계획에 차질이 없을 것 같다. 그래도 오늘도 하나 더 알아갑니다...

profile
Frontend Engineers

0개의 댓글