프로그래머스 연속된 수의 합

0

알고리즘

목록 보기
5/8
post-thumbnail

혹시나 잘못된 개념 전달이 있다면 댓글 부탁드립니다. 저의 성장의 도움이 됩니다.

문제 설명

연속된 세 개의 정수를 더해 12가 되는 경우는 3, 4, 5입니다. 두 정수 num과 total이 주어집니다. 연속된 수 num개를 더한 값이 total이 될 때, 정수 배열을 오름차순으로 담아 return하도록 solution함수를 완성해보세요.
바로가기

풀이한 코드

num이 홀수의 경우, 짝수의 경우를 나누었다.

total/num의 몫

  • 홀수의 경우 : 배열의 가운데 요소 값
  • 짝수의 경우 : 배열의 가운데 -1의 값(짝수이므로 중앙이 없음)

구현 설명

  1. 길이가 num인 배열을 선언하고, 전체 요소를 최소값으로 세팅한다.
  2. 오름차순이므로 index 값을 더한다.
  3. 짝수라면 전체 요소에 +1을 더한다.
function solution(num, total) {
    const fillWithStartNumber = new Array(num).fill(parseInt(total/num)-parseInt(num/2))
    return fillWithStartNumber.map((el, idx)=>{
       return (num%2 ===0)?el+idx+1:el+idx;
    })
}

// 주의!
// fill() 없이 map에서 최소값+인덱스값(짝수인경우+1)를 적용하면 안된다.

new Array(배열의길이)는 empty인 상태로 채운 배열을 반환하는데,
요소가 empty인 경우 해당 요소는 forEachmap의 콜백이 적용되지 않는다.
cf. 아래의 설명은 여러 MDN 링크에서 관련된 부분을 첨부했다.
Empty slots in sparse arrays behave inconsistently between array methods. Generally, the older methods will skip empty slots, while newer ones treat them as undefined.

callbackFn is invoked only for array indexes which have assigned values. It is not invoked for empty slots in sparse arrays.


TIL

예전 fill 없이 map을 돌렸던 적이 있어서 이번엔 잊지않고 채워줬다.

예제를 바탕으로 패턴을 규칙을 찾으려고 했다.
코드 가독성은 좋지 않다. 수도코드를 쓰지 않으면 이해할 수 있을까 싶은?
😅변수로 선언해서 의도를 표현했지만, 불필요하게 메모리도 써서 하나마나인 것 같다.
짝수 조건문이 제일 문제다...

function solution(num, total) {
    const fillWithStartNumber = new Array(num).fill(parseInt(total/num)-parseInt(num/2))
    return fillWithStartNumber.map((el, idx)=>{
       return (num%2 ===0)?el+idx+1:el+idx;
    })
}

function solution(num, total) {
    const middleNum = parseInt(total/num);
    const startNum = middleNum-parseInt(num/2);
    
    return new Array(num).fill(startNum).map((el, idx)=>{
       return (num%2 ===0)?el+idx+1:el+idx;
    })
}

0개의 댓글