TIL 20221223 - 168번

hoin_lee·2022년 12월 23일
0

TIL

목록 보기
133/236

오늘 공부

알고리즘 문제 풀기(프로그래머스)
https://github.com/hoinlee-moi/Algorithm

JS기본문법 다시 공부
https://github.com/hoinlee-moi/ModernJS

React 강의 듣기
https://github.com/hoinlee-moi/React_prac


오늘 알고리즘

숫자의 표현 - https://school.programmers.co.kr/learn/courses/30/lessons/12924#

function solution(n) {
    if(n===1) return 1
    let answer = 1;
    let num = 1;
    let sumArr = [];
    while(num<=Math.ceil(n/2)+1) {
        let sum = sumArr.reduce((acc,cur)=>{return acc+cur},0)
        if(sum>n) {
            while(sum>n){
                let a =sumArr.shift()
                sum -= a
            } 
        }
        if(sum<n) {
            sumArr.push(num)
            num++
        }
        if(sum===n){
            answer++
            sumArr.push(num)
            num++
        }
    }
    return answer;
}
  • 먼저 1일때는 1개뿐이니 바로 처리될 수 있도록 if문을 적었고 이후부터 계산되도록 만들었다
  • 카운트를 해줄 변수 answer를 만들고 반복을 돌아줄 i와 같은 변수 num을 선언, 합을 구해줄 배열 sumArr를 선언한다.(answer가 1인 이유는 자기 자신은 무조건 포함이기 때문)
  • while문을 통해 계속 반복할 예정인데 굳이 while을 안쓰고 for를 써도 될 것 같다. (이전에 shift부분도 전체 while문에서 처리하도록 만들었는데 시간적 소요가 커서 따로 작동되도록 빼니 시간 소모도 줄었고 훨씬 좋아졌다.)
  • while의 조건은 n의 절반+1보다 연속되지 않기 때문에 조건을 걸어놓고 sumArr의 합이 n보다 커질때는 sumArr에서 작은수를 빼고 작을때는 현재의 num을 넣도록 했다.

아래는 for문을 통한 작성이다. 하지만 시간이나 메모리는 while문이 더 빠르고 적었다.
for문이 36.8 시간 3.84
while이 33.7 시간 1.25

function solution(n) {
    if(n===1) return 1
    let answer = 1;
    let sumArr = [];
    for(let i=1; i<=Math.ceil(n/2)+1;i++){
        let sum = sumArr.reduce((acc,cur)=>{return acc+cur},0)
        if(sum>n) {
            while(sum>n) sum -= sumArr.shift()
        }
        if(sum<n) {
            sumArr.push(i)
        }
        if(sum===n){
            answer++
            sumArr.push(i)
        }
    }
    return answer;
}

그렇다고 무조건 while문이 for문보다 빠를까?
검색해보고 테스트 해본 결과 그렇게 유의미한 차이를 가지진 않지만 써야할 곳이 조금 다른 느낌이다.
일단 for문같은 경우는 조건식등이 한곳에 있어 가독성이 좋지만 while문 같은 경우는 찾기 어려운 게 있다.
그래서 생각해보자면 for 같은 경우는 우리가 몇회 반복해야 하는지 알고 있을 경우 사용하기 좋으며 while같은 경우는 얼마나 반복해야하는지 모를 경우 사용하기 좋은 것 같다.
다만 현재는 프론트를 공부 하면서 기본 for문이나 while문 보단 배열 관련한 반복문을 더 많이 쓰는 편이긴 하다.

수학적 풀이 방법

15 % 1 == 0
-1
14 % 2 == 0
-2
12 % 3 == 0
-3
9 % 4 != 0
-4
5 % 5 == 0
-5
0 -> 자연수가 아니면 loop 종료
답: 나머지가 0이였던 갯수=4

function solution(n) {
  let answer = 0;
  let num =1;
  while(n>0){
    if(n%num===0) answer++
    n-=num
    num++
  }
  return answer
}
profile
https://mo-i-programmers.tistory.com/

0개의 댓글