[level 2] 연속 부분 수열 합의 개수 - 131701

2024. 9. 14. 17:12·코딩테스트/프로그래머스

[level 2] 연속 부분 수열 합의 개수 - 131701

문제 링크

성능 요약

메모리: 133 MB, 시간: 774.08 ms

구분

코딩테스트 연습 > 연습문제

채점결과

정확성: 100.0
합계: 100.0 / 100.0

제출 일자

2024년 09월 14일 16:30:09

문제 설명

철호는 수열을 가지고 놀기 좋아합니다. 어느 날 철호는 어떤 자연수로 이루어진 원형 수열의 연속하는 부분 수열의 합으로 만들 수 있는 수가 모두 몇 가지인지 알아보고 싶어졌습니다. 원형 수열이란 일반적인 수열에서 처음과 끝이 연결된 형태의 수열을 말합니다. 예를 들어 수열 [7, 9, 1, 1, 4] 로 원형 수열을 만들면 다음과 같습니다.

그림.png


원형 수열은 처음과 끝이 연결되어 끊기는 부분이 없기 때문에 연속하는 부분 수열도 일반적인 수열보다 많아집니다.
원형 수열의 모든 원소 elements가 순서대로 주어질 때, 원형 수열의 연속 부분 수열 합으로 만들 수 있는 수의 개수를 return 하도록 solution 함수를 완성해주세요.


제한사항
  • 3 ≤ elements의 길이 ≤ 1,000
  • 1 ≤ elements의 원소 ≤ 1,000

입출력 예
elements result
[7,9,1,1,4] 18

입출력 예 설명

입출력 예 #1
길이가 1인 연속 부분 수열로부터 [1, 4, 7, 9] 네 가지의 합이 나올 수 있습니다.
길이가 2인 연속 부분 수열로부터 [2, 5, 10, 11, 16] 다섯 가지의 합이 나올 수 있습니다.
길이가 3인 연속 부분 수열로부터 [6, 11, 12, 17, 20] 다섯 가지의 합이 나올 수 있습니다.
길이가 4인 연속 부분 수열로부터 [13, 15, 18, 21] 네 가지의 합이 나올 수 있습니다.
길이가 5인 연속 부분 수열로부터 [22] 한 가지의 합이 나올 수 있습니다.
이들 중 중복되는 값을 제외하면 다음과 같은 18가지의 수들을 얻습니다.
[1, 2, 4, 5, 6, 7, 9, 10, 11, 12, 13, 15, 16, 17, 18, 20, 21, 22]

 

해결 답안

import java.util.*;

class Solution {
    public int solution(int[] elements) {
        Set<Integer> set = new HashSet<>();
        for(int i = 1; i<=elements.length; i++){
            //1~n까지의 합을 정하는 loop
            for(int j=0; j<elements.length; j++){
                // index의 시작점
                int tmp = 0;
                for(int k=j; k<j+i; k++){
                    if(k>=elements.length){
                        tmp+=elements[k-elements.length];
                    }else{
                        tmp+=elements[k];
                    }
                }
                set.add(tmp);
            }
        }
        return set.size();
    }
}

 

해결 과정

  1. 부분 수열의 합을 구하기 위해서는 받아온 배열을 2배로 확장하여 합을 계산하여야 한다고 판단
  2. 연속 부분 수열의 합으로 만들 수 있는 결과를 중복을 제거하고 제출해야하므로 SET 자료형에 담아 중복 제거
  3. 몇 자리를 더할지, 몇번 인덱스부터 더하기 시작할지, 실제로 더하는 부분, 총 3개의 반복문으로 구성하여 연산 처리

아쉬운점

3중 반복문을 사용하여 O(n^3)의 시간 복잡도로 구성되어 있음

제출 시 시간 초과는 피할 수 있었지만, 로직을 재구성하여 시간복잡도를 줄일 수 있는 방법을 찾아보자

 

 

'코딩테스트 > 프로그래머스' 카테고리의 다른 글

[level 2] n^2 배열 자르기 - 87390  (0) 2024.09.15
[level 2] 할인 행사 - 131127  (1) 2024.09.15
[level 2] 구명보트 - 42885  (0) 2024.09.14
[level 1] [PCCP 기출문제] 1번 / 동영상 재생기 - 340213  (2) 2024.09.10
[level 2] 타겟 넘버 - 43165  (2) 2024.09.09
'코딩테스트/프로그래머스' 카테고리의 다른 글
  • [level 2] n^2 배열 자르기 - 87390
  • [level 2] 할인 행사 - 131127
  • [level 2] 구명보트 - 42885
  • [level 1] [PCCP 기출문제] 1번 / 동영상 재생기 - 340213
mint723dev
mint723dev
mint723dev 님의 블로그 입니다.
  • mint723dev
    mint723dev 님의 블로그
    mint723dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (88)
      • Computer Science (16)
        • Computer Architecture (0)
        • Data Structure (2)
        • Database (4)
        • Network (4)
        • Operating System (6)
        • Software Engineering (0)
      • Java (6)
      • 자료 구조 (0)
      • 코딩테스트 (62)
        • LeetCode (1)
        • 프로그래머스 (29)
        • 백준 (32)
      • Spring (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    DFS
    DP
    탐욕법
    티스토리챌린지
    JVM
    deque
    BFS
    오블완
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
mint723dev
[level 2] 연속 부분 수열 합의 개수 - 131701
상단으로

티스토리툴바