[level 1] 약수의 합

2022. 1. 15. 09:56·알고리즘/JavaScript

문제

 

풀이 코드

function solution(n) {
  if (n === 0) {
    return 0;
  }

  let prime = [];

  if (n % Math.sqrt(n) === 0) {
    prime.push(Math.sqrt(n));
  }
  for (let i = 1; i < Math.sqrt(n); i++) {
    if (n % i === 0) {
      prime.push(i);
      prime.push(n / i);
    }
  }
  return prime.reduce((sum, num) => sum + num, 0);
}

 

풀이 과정

약수를 구하는 문제.. 아.. 확실히 PS 문제를 풀다보니까 42Seoul 이 도움이 된다.

 

해당 문제 그냥 n 까지 1씩 더해서 다~~ 구했었는데

 

42서울에서 시간초과가 나서 고민을 많이 하다 발견한게 제곱근을 이용한 풀이였다.

 

제곱근까지만 구하고, 구해진 약수와, n 을 약수로 나눈 몫, 그리고 제곱근 만 구해주면 시간적 측면에서 엄청난 단축을 할수 있다.

 

예를들어.. 3000 이라고 치면

1, 2, 3, 4, 5,,...100,101,102...2000,2001,2002...2999,3000

이렇게 하나하나 나누어 가며 나머지가 0인놈들을 선별해야 하지만

 

제곱근을 이용하면 54 까지만 비교하고, 

54까지의 약수들과, N을 해당 약수로 나눴을때 몫, 그리고 N을 해당 제곱근으로 나눴을때 나머지가 0이라면 이 값들만 계산하면 된다

 

따라서 시간복잡도 성능 업업!!

 

이렇게 약수들을 더해 배열에 넣고,

reduce 고차함수를 통하여 약수들을 싹 더해줬다

 

 

다른사람의 코드

function solution(n, a=0, b=0) {
    return n<=a/2?b:solution(n,a+1,b+=n%a?0:a);
}

3항 연산자를 중첩으로 이용하고, 재귀함수를 이용하려 푸셨다.

 

근데 가독성이 너무 떨어져서 굳이 이렇게 풀어야 하나 싶다.

 

한줄로 깔끔하게 짠건 참신하다는 생각이 든다!

'알고리즘/JavaScript' 카테고리의 다른 글
  • [level 1] 이상한 문자 만들기
  • [level 1] 수박수박수?
  • [level 1] 시저 암호
  • [level 1] 3진법 뒤집기
Jeohong
Jeohong
기억 보단 기록을
  • Jeohong
    Chikong Devlog
    Jeohong
  • 전체
    오늘
    어제
    • 분류 전체보기 (186)
      • ---- 개발 컨텐츠 ---- (0)
      • iOS (30)
        • Swift 문법 (1)
        • iOS 개념 (12)
        • HIG (5)
        • SwiftUI (7)
        • UIKit (4)
      • Side Project (0)
      • 개발서적 (4)
        • 객체지향 사실과 오해 (4)
      • 알고리즘 (74)
        • 자료구조 개념 (2)
        • Swift (25)
        • JavaScript (47)
      • ---- 회고 계획 컨텐츠 ---- (0)
      • 계획 및 일기 (10)
      • 회고록 (1)
      • 컨퍼런스 탐방 (1)
      • 미드로 영린이 탈출하기 (1)
      • ---- Previous content ---- (0)
      • Frontend (2)
        • HTML & CSS (2)
      • KITRI 수업 (17)
        • 리눅스 (14)
        • 네트워크 (2)
      • 42seoul (17)
        • Bonr2code (9)
        • 넋두리 (7)
        • 멘토특강 (1)
      • 해킹 실습 (20)
        • 해커스쿨 - F.T.Z (19)
        • WebGoat (1)
      • Tensorflow로 시작하는 NLP (1)
        • 예제 (1)
      • 자연어처리 입문 (1)
        • 이론 (1)
      • 텐서플로로 배우는 딥러닝 (7)
        • 이론 (2)
        • 예제 (5)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    42서울
    코딩
    프로그래머스
    hig
    네트워크
    Algorithm
    IOS
    1서클
    자료구조
    백준
    javascript
    라피신
    스위프트
    swift
    개발자
    알고리즘
    본과정
    boj
    SwiftUI
    42seoul
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
Jeohong
[level 1] 약수의 합
상단으로

티스토리툴바