https://leetcode.com/problems/product-of-array-except-self/description/
* 풀이1(케이스 분류)
경우의수를 나누고구현
i) 0의갯수가 0개인경우
ii) 0의갯수가 1개인경우
iii) 0의갯수가 2개이상인경우
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
vector<int> ret;
int zero_count=0;
int total_product=1;
for(auto num : nums){
if(num==0) zero_count++;
else total_product*=num;
}
for(auto num : nums){
if(zero_count==0){
ret.push_back(total_product/num);
}
if(zero_count==1){
if(num==0){
ret.push_back(total_product);
}
else{
ret.push_back(0);
}
}
if(zero_count>=2){
ret.push_back(0);
}
}
return ret;
}
};
* 풀이 2 (누적곱 이용)
나를제외한곱 == 내앞의누적곱 * 내뒤의 누적곱
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
vector<int> pre=nums;
vector<int> suf=nums;
vector<int> ret(nums.size());
//pre배열의 누적곱을 pre에 담기 , (multiplies안쓰면 누적합)
//원본배열과 결과배열의 크기는 같아야함에 주의
partial_sum(pre.begin(),pre.end(),pre.begin(), multiplies<int>());
//rbegin => 뒤에서부터 순회
partial_sum(suf.rbegin(),suf.rend(),suf.rbegin(), multiplies<int>());
//idx의 범위를체크하고, 범위밖인경우 1을 곱함
for(int i=0;i<nums.size();++i){
ret[i] = (i ? pre[i-1] : 1) * (i+1 < nums.size() ? suf[i+1] : 1);
}
return ret;
}
};
* rbegin, partial_sum
partial_sum(pre.begin(),pre.end(),pre.begin());
누적합을구해서 pre에 넣음
partial_sum(pre.begin(),pre.end(),pre.begin(), multiplies<int>());
누적곱을구해서 pre에 넣음
partial_sum(suf.rbegin(),suf.rend(),suf.rbegin(), multiplies<int>());
suf의 뒤부터 순회하면서 / 누적곱을구해서 suf의 뒤부터 채워넣음
'Algorithm > 배열' 카테고리의 다른 글
리트코드 자기를 제외한 배열의 곱 c++ // 누적곱 해결방법 : 누적곱 테이블을 정의하라 (0) | 2024.05.18 |
---|---|
백준 13458 시험감독 c++ // ret는 int범위를넘을수있다. (0) | 2024.02.16 |
프로그래머스 주차요금계산 c++ // 구현, db설정하라 (0) | 2023.12.08 |
백준 1919 cpp // 문자열 차이검사는 +1, -1로 비교하라 (0) | 2023.08.16 |
백준 11328 cpp // tc문제는 visit을 초기화하라 , 카운팅 배열 동등비교시 +1 -1하고 값이 0이면 같은배열 (0) | 2023.08.16 |