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