본문 바로가기

CS/알고리즘

[230423] 연속 부분 수열 합의 개수

반응형

 

 

문제

 

프로그래머스

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

programmers.co.kr

 

 

풀이

내 풀이

처음에 문제를 이해하는데 시간이 조금 걸렸다.

linked list로, 끝과 앞이 연결된 형태라 생각하고

연속된 숫자의 합이 중복 없이 총 몇 가지가 나올 수 있는지 묻는 문제였다.

 

나는 slice를 이용해서 풀이했다.

function solution(elements) {
    const answer = [...elements];
    
    for(let i = 2; i <= elements.length; i++) {
        for(let j = 0; j < elements.length; j++) { 
            let sliceArr; 
            if(i + j > elements.length) {
                sliceArr = elements.slice(j).concat(elements.slice(0, (i + j) % elements.length))
            } else {
                sliceArr = elements.slice(j, i + j);
            }
           answer.push(sliceArr.reduce((acc, cur) => acc + cur, 0));
        }
    }
    return [...new Set(answer)].length;
}

 

시간이 많이 걸리긴 하네

 

 

 

 

다른 풀이

function solution(elements) {
    const circular = elements.concat(elements);
    const set = new Set();
    for (let i = 0; i < elements.length; i++) {
        let sum = 0;
        for (let j = 0; j < elements.length; j++) {
            sum += circular[i + j];
            set.add(sum);
        }
    }
    return set.size;
}

(1) 그렇구나.. 애초에 처음부터 elements.concat(elements) 를 하고 푸는게 훨씬 깔끔하다

(2) 그렇구나.. 애초에 처음부터 answer를 Set 으로 만들면 되네

이렇게 하니까 for문에 조건을 크게 생각하지 않아도 돼서 훨씬 깔끔하고 간단하게 문제를 풀 수 있다.

두 번째 for문은 reduce로 작성해도 될 듯 한데, for문이 더 가독성있긴 하다.

 

 

다른 사람들도 대부분 Set 을 이용해서 풀이했더라.

다음에 중복 문제가 나오면 나도 Set 으로 풀어봐야겠다.

 

 

 

 

 

반응형

'CS > 알고리즘' 카테고리의 다른 글

[230424] 프로세스  (0) 2023.04.24
[230423] 소수 만들기  (0) 2023.04.23
[230423] 명예의 전당  (1) 2023.04.23
[230422] 기능개발  (0) 2023.04.22
[230422] 소수 찾기  (0) 2023.04.22