-
[프로그래머스/JAVA] 연속 부분 수열 합의 개수Algorithm/Java 2024. 12. 1. 11:05
https://school.programmers.co.kr/learn/courses/30/lessons/131701
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
[ 정답 코드 & 올바른 풀이 ]
📌 올바른 풀이
중복되는 값을 제외해야 하므로 HashSet을 사용한다.
길이가 1일때,
ele[0] / ele[1] / ele[2] / ele[3] / ele[4]
길이가 2일때,
ele[0] + ele[1] / ele[0] + ele[2] / ele[0] + ele[3] / ele[0] + ele[4]
ele[1] + ele[2] / ele[1] + ele[3] / ele[1] + ele[4]
ele[2] + ele[3] / ele[2] + ele[4]
ele[3] + ele[4]
길이가 3일때,
ele[0] + ele[1] + ele[2] / ele[0] + ele[1] + ele[3] / ele[0] + ele[1] + ele[4]
ele[1] + ele[2] + ele[3] / ele[1] + ele[2] + ele[4]
ele[2] + ele[3] + ele[4]
길이가 4일때,
ele[0] + ele[1] + ele[2] + ele[3] / ele[0] + ele[1] + ele[2] + ele[4]
ele[1] + ele[2] + ele[3] + ele[4]
위의 모든 경우의 수를 도출하기 위해서는 아래처럼 3중 for문을 돌려 현재인덱스 ~ 현재인덱스 + 길이전까지 각각의 합을 구해 반환하면 된다.
for(int i = 1; i <= elements.length; i++) { for(int j = 0; j < elements.length; j++) { int sum = 0; for(int z = j; z < j+i; z++) { sum += elements[z % elements.length]; } hs.add(sum); } }
** 이때, 그냥 z가 아닌 z % elements.length를 하는 이유는
길이가 5인 배열 [7, 9, 1, 1, 4]에서 j=4, i=3이라면(z = 4 ~ z = 6) 내부 반복문에서 ele[4] / ele[5] / ele[6] 이 되므로 ele[5] / ele[6]와 같이 기존 배열의 크기를 초과하게 된다.
이를 방지하기 위해 z % elements.length를 하게 된다면,
ele[5%5] = 0 / ele[6%5] = 1 이 되므로 z가 배열의 범위를 벗어나도 원형 수열처럼 동작하도록 구현할 수 있다.
📌 정답 코드
import java.util.*; class Solution { public int solution(int[] elements) { int answer = 0; HashSet<Integer> hs = new HashSet<>(); for(int i = 1; i <= elements.length; i++) { for(int j = 0; j < elements.length; j++) { int sum = 0; for(int z = j; z < j+i; z++) { sum += elements[z % elements.length]; } hs.add(sum); } } answer = hs.size(); return answer; } }
반응형'Algorithm > Java' 카테고리의 다른 글
[프로그래머스/JAVA] 할인행사 (1) 2025.01.22 [프로그래머스/JAVA] 괄호 회전하기 (0) 2024.12.01 [프로그래머스/JAVA] 예상 대진표 (0) 2024.11.30 [프로그래머스/JAVA] 귤 고르기 (0) 2024.11.24 [프로그래머스/JAVA] 카드 뭉치 (0) 2024.11.24