본문 바로가기

알고리즘

프로그래머스 > 코딩 테스트 연습 > 연속 부분 수열의 합

728x90

https://school.programmers.co.kr/learn/courses/30/lessons/131701

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

[나의 코드 ver 01]

const solution =(elements)=>{
   let answer=[] 
  for(i=0;i<elements.length;i++){
    let tempArr=elements.concat(elements.slice(0,i))// i값에 따라 새로운 배열을 만듦(원형 조합 계산 위함)
    //i=0 =>[7,9,1,1,4]
    //i=1 =>[7,9,1,1,4,7]
    //i=2 =>[7,9,1,1,4,7,9]
    //i=3 =>[7,9,1,1,4,7,9,1]
    //i=4 =>[7,9,1,1,4,7,9,1,1]
    for(j=0;j<tempArr.length-i;j++){
      let sum=tempArr.slice(j,j+i+1).reduce((a,b)=>a+b)
      //answer에 추가할 값은 tempArr를 j부터 i개만큼 더한 값임
      console.log(tempArr.slice(j,i+j+1),j,i)
      answer.push(sum)
    }
  }

  let set = new Set(answer)
   return set.size
}

테스트 통과! 사실 마지막 i의 경우에는 tempArr가 굳이 필요가 없다. 어차피 값은 전체 배열의 원소의 값이 중복해서 들어갈 것이기 때문이다. 따라서 아래와 같이 수정을 해주었다.

 

[나의 코드 ver 02]

const solution =(elements)=>{
   let answer=[] 
  for(i=0;i<elements.length-1;i++){
    let tempArr=elements.concat(elements.slice(0,i))// i값에 따라 새로운 배열을 만듦(원형 조합 계산 위함)
    //i=0 =>[7,9,1,1,4]
    //i=1 =>[7,9,1,1,4,7]
    //i=2 =>[7,9,1,1,4,7,9]
    //i=3 =>[7,9,1,1,4,7,9,1]
    for(j=0;j<tempArr.length-i;j++){
      let sum=tempArr.slice(j,j+i+1).reduce((a,b)=>a+b)
      //answer에 추가할 값은 tempArr를 j부터 i개만큼 더한 값임
      // console.log(tempArr.slice(j,i+j+1),j,i)
      answer.push(sum)
    }
  }
  answer.push((elements.reduce((a,b)=>a+b)))

  let set = new Set(answer)
   return set.size
}

tempArr.slice(j,j+i+1),j,i

i 를 element.length-1 까지만 반복문을 돌려주고 마지막에 전체 element의 합을 한 번 더 푸쉬하는 식으로 코드를 변경하였다. 테스트 결과 아주 미세하게! 시간이 단축되었다. 그러나 현재 코드 처럼 일단 다 푸시한 후에 중복을 나중에 제거하는 것 보다는 기존의 코드에 원소가 없는 경우에만 추가해주는 식으로 변경하면 더 좋은 코드가 될 것 같다.

728x90