문제 링크
난이도 : 브론즈 2

문제 내용

정수 n개가 주어졌을 때, n개의 합을 구하는 함수를 작성하시오.

작성해야 하는 함수는 다음과 같다.

a: 합을 구해야 하는 정수 n개가 저장되어 있는 배열 (0 ≤ a[i] ≤ 1,000,000, 1 ≤ n ≤ 3,000,000)

리턴값: a에 포함되어 있는 정수 n개의 합

문제 분석

C++11로 작성하기 때문에,

long long sum(vector<int> &a)를 구현하면 됨.

list 말고 벡터로 받아오니까 그걸 주의해야 할 듯.

참고자료 : https://hwan-shell.tistory.com/119

벡터 : 힙에 생성됨. 동적할당 ← 이점이 일반 배열과 다른 듯!

벡터의 요소에 접근하려면 at(i), [i]가 있지만 범위 검사가 없어 속도가 빠른 [i]의 사용이 더 많다고 함

size ≠ capacity!!

size : 벡터 안에 데이터가 들어간 공간 개수.

capacity : 힙에 할당된 벡터의 최대 크기!!

+내가 아는 자료형은 long인데, long long은 대체 무엇인가 찾아봄.

놀랍게도 C++에서 long이랑 int는 자료형 크기와 범위가 같다?????

내가 아는 long이 C++에서는 long long이었던 것….

작성한 코드

#include <vector>
long long sum(std::vector<int> &a)
{
    long long ans = 0;
    // 코드 작성 시작
    for(int i = 0; i < a.size(); i++) {
        ans += a[i];
    }
    // 코드 작성 끝
    return ans;
}

우수 코드 분석

#include <vector>
long long sum(std::vector<int> &a) {
	long long ans = 0;
    for (auto v : a) {
      ans += v;
    }
	return ans;
}

우수 코드를 보니, auto 라는 접두사를 붙였다. 이게 뭐지?

참고자료 : https://dydtjr1128.github.io/cpp/2019/06/04/Cpp-auto.html

C++11 버전부터 적용됨!!

형식이 추론되는 변수를 선언!!

auto를 사용할 수 없는 경우

  1. 함수의 매개변수 ← 그렇지만 반환형으로는 가능함!!! 대신 후행 반환 형식을 지정해줘야함.
    • ex. auto A()→double{ return 3.2; } 근데 이대로 쓰면 그냥 double A() 와 같음.
    • 따라서, 템플릿과 함께 사용하면 유용함.
  2. 구조, 클래스의 멤버변수

그래서 for문에서 auto를 어떻게 쓰는건가?

참고자료 : https://boycoding.tistory.com/210

마침 이 범위 기반 for문도 C++11 버전에서 추가된 내용!

for (자료형 변수명 : 배열) ← 이렇게 작성하면, 배열을 순회하면서 변수명에 하나씩 들어감.

파이썬과 비슷한듯?

대신 배열의 자료형과 for문에서 선언한 변수의 자료형이 일치해야 함. 그러지 않으면 형 변환이 일어난다고 함.

따라서, 위의 우수 코드는 auto와 범위 기반 for문을 함께 사용한 예시인 것으로 보임.

그럼 왜 그게 내 코드보다 빨랐을까?

참고자료 : https://blog.naver.com/remocon33/221701119330

인덱스 접근 for문보다 범위 기반 for문이 벡터에서 더 빠르다는 내용을 보임.

내 코드는 인덱스 접근 for문이어서 아마 4ms가 나온 것 같음.