Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Google OAuth
- middleware
- factory
- synchronized
- builder
- Spring
- 일급 객체
- OAuth 2.0
- spring security
- Volatile
- lombok
- java
- nestjs
- 일급 컬렉션
- Dependency Injection
Archives
- Today
- Total
HJW's IT Blog
[프로그래머스] 연속 부분 수열 합의 개수 [c++] 본문
https://school.programmers.co.kr/learn/courses/30/lessons/131701
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
철호는 수열을 가지고 놀기를 좋아합니다. 그는 자연수로 이루어진 원형 수열에서 연속하는 부분 수열의 합으로 만들 수 있는 숫자가 몇 가지나 되는지 궁금해졌습니다. 일반적인 수열에서는 앞과 뒤가 끊어져 있지만, 원형 수열에서는 처음과 끝이 연결된 수열이기 때문에, 더 많은 부분 수열을 만들 수 있습니다.
주어진 수열 elements에서 연속 부분 수열의 합으로 만들 수 있는 모든 경우의 수를 구하는 문제입니다.
접근 방식
- 원형 수열에 대한 처리 → 주어지는 배열을 한번 더 이어 붙이면 된다
- 부분 합에 대한 처리 → sliding window 를 사용하여 처리
- 중복에 대한 처리 → unordered_set 을 사용하여 처리
코드
#include <bits/stdc++.h>
using namespace std;
unordered_set<int> s;
int solution(vector<int> elements) {
vector<int> v = elements;
for(int i = 0; i<elements.size(); i++){
v.push_back(elements[i]);
}
for(int length = 1; length <= elements.size(); length++){
int sum = 0;
for(int i = 0; i<length; i++){
sum += v[i];
}
s.insert(sum);
for(int i = 1; i<elements.size(); i++){
sum -= v[i-1];
sum += v[i + length - 1];
s.insert(sum);
}
}
return s.size();
}
'Algorithm' 카테고리의 다른 글
[프로그레머스/C++] 양궁대회 (1) | 2024.09.06 |
---|---|
[프로그래머스] 두 큐 합 같게 만들기 [C++] (1) | 2024.09.06 |
[프로그래머스] 2차원 동전 뒤집기 [C++] (1) | 2024.09.05 |
[프로그래머스] 부대 복귀 [C++] (2) | 2024.09.05 |
[Programmers] 표현 가능한 이진트리 [C++] (0) | 2024.09.03 |