Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 합이 0이 되는 N개의 고유한 정수 배열 만들기

정수 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) — 결과를 저장할 배열이 필요합니다.

이 방식은 추가적인 검증 없이도 항상 조건을 만족하는 배열을 보장하므로, 문제에서 요구하는 "아무 배열이나 하나 반환" 조건에 가장 효율적으로 부합하는 풀이입니다.