정수 n이 주어졌을 때, n개의 서로 다른(고유한) 정수를 담고 있으면서 그 합이 0이 되는 배열을 아무거나 하나 반환하는 문제입니다.
예를 들어 입력이 n = 5라면, [-7, -1, 1, 3, 4]와 같은 배열이 유효한 출력이 될 수 있습니다. 이 배열은 모든 원소가 서로 다르며, 전체 합이 정확히 0이기 때문입니다.
문제 해결 접근 방법
가장 간단하고 직관적인 방법은 양의 정수를 순서대로 채운 뒤, 마지막 원소로 그 합의 음수를 넣어 전체 합을 0으로 맞추는 것입니다. 구체적인 단계는 다음과 같습니다.
- 정답을 저장할 배열
A를 준비하고, 누적합 변수x를 0으로 초기화합니다. - i가 0부터 n-2까지 반복합니다.
A[i] = i + 1(즉, 1부터 n-1까지의 양의 정수를 차례대로 저장)x = x + (i + 1)(저장한 값들을 누적)
- 마지막 원소에 누적합의 음수를 대입합니다:
A[n-1] = -x - 배열
A를 반환합니다.
동작 원리
앞의 n-1개 원소는 1부터 n-1까지의 서로 다른 양의 정수이므로 중복이 없습니다. 마지막 원소는 이들의 합에 대한 음수이므로, 앞의 값들과 절대 겹치지 않습니다(단, n = 1인 경우 마지막 원소가 0이 되어 유일한 원소가 되므로 역시 조건을 만족합니다). 따라서 배열의 모든 원소는 고유하며, 전체 합은 자연스럽게 0이 됩니다.
C++ 구현 예제
아래 코드를 통해 실제 동작을 확인해 보겠습니다.
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<int> v){
cout << "[";
for(int i = 0; i < v.size(); i++){
cout << v[i] << ", ";
}
cout << "]" << endl;
}
class Solution {
public:
vector<int> sumZero(int n) {
vector<int> ans(n);
int x = 0;
for(int i = 0; i < n - 1; i++){
ans[i] = (i + 1);
x += (i + 1);
}
ans[n - 1] = -x;
return ans;
}
};
int main(){
Solution ob;
print_vector(ob.sumZero(10));
}입력
10
출력
[1, 2, 3, 4, 5, 6, 7, 8, 9, -45]
복잡도 분석
- 시간 복잡도: O(n) — 배열을 한 번만 순회하면 됩니다.
- 공간 복잡도: O(n) — 결과를 저장할 배열이 필요합니다.
이 방식은 추가적인 검증 없이도 항상 조건을 만족하는 배열을 보장하므로, 문제에서 요구하는 "아무 배열이나 하나 반환" 조건에 가장 효율적으로 부합하는 풀이입니다.