문제 링크
난이도 : Lv. 0
문제 내용
정수 배열 arr
과 정수 n
이 매개변수로 주어집니다. arr
의 길이가 홀수라면 arr
의 모든 짝수 인덱스 위치에 n
을 더한 배열을, arr
의 길이가 짝수라면 arr
의 모든 홀수 인덱스 위치에 n
을 더한 배열을 return 하는 solution 함수를 작성해 주세요.
입력
[49, 12, 100, 276, 33], 27
출력
[76, 12, 127, 276, 60]
문제 분석
arr의 길이에 따라 for문의 시작 위치를 다르게 하고, 증감식을 ++ 이 아니라 += 2로 하면 됨
작성한 코드
#include <string>
#include <vector>
using namespace std;
vector<int> solution(vector<int> arr, int n) {
for (int i = arr.size()%2==0?1:0; i < arr.size() ; i+=2){
arr[i] += n;
}
return arr;
}
arr.size()%2 로 그냥 했어도 됐을듯
우수 코드 분석
#include <numeric>
#include <vector>
using namespace std;
vector<int> solution(vector<int> v, int n) {
return accumulate(v.begin(),v.end(),vector<int>(),[n,v](vector<int>&a,int&i){a.push_back(v.size()&1?a.size()&1?i:i+n:a.size()&1?i+n:i);return a;});
}
accumulate가 무슨 함수인지 찾아봤음
numeric 헤더파일에 있는 함수임
accumulate(배열_컨테이너의_시작지점, 배열_컨테이너의_끝지점, 초기값);
accumulate(배열_컨테이너의_시작지점, 배열_컨테이너의_끝지점, 초기값, 커스텀함수);
// 커스텀함수는 첫 번째 인자로 지금까지의 누적 합, 두 번째 인자로 이번에 더할 값을 받는다
// 사용 예시 1. 모든 수를 더하기
accumulate(nums.begin(), nums.end(), 0);
// 사용 예시 2. 모든 수를 빼기
accumulate(nums.begin(), nums.end(), 0, [](int x, int y){return x - y;});
// 여기서는 커스텀함수를 사용해 누적 값인 x에서 이번 값인 y를 빼는 작업을 반복함
// 사용 예시 3. 홀수 인덱스에 있는 값만 더하기
accumulate(nums.begin(), nums.end(), 0, [&, index = 0](int x, int y) mutable {
return (index++%2==1)? x + y : x;}
// [&, index = 0] : 캡쳐 목록. &는 외부 변수를 참조로 캡쳐, index = 0은 람다함수 내에 존재하는 지역변수로써, 값으로 캡쳐함을 의미함
// mutable : 내부 변수인 index를 변경할 수 있음을 의미함
// 참고 : 초기값의 형태에 따라 반환값이 달라짐.
// ex. 초기값이 0 => 반환값 int
// ex 2. 초기값이 0.0 => 반환값 double