알고리즘 문제 풀기(프로그래머스)
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;
}
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
}