※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 1635번 문제인 1 또는 -1이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/1635

 

주어지는 수열\(a_1 \cdots a_N\)은 다음과 같은 두 가지 성질이 있다.

 

(1) \(a_1 + \cdots + a_N\)은 짝수이다.

(2) 1에서 계산한 값이 0이 아니라면, \(a_1 + \cdots + a_k = a_{k+1} + \cdots + a_N\)을 만족시키는 \(1\le k<N \)인 정수 \(k\)가 존재한다. (증명은 값이 contiguous하게 변한다는 점을 이용해 IVT(중간값 정리)와 유사하게 가능하다.)

 

2의 식의 우변을 좌변으로 넘기면 각 항에 1 또는 -1을 곱해 총합이 0이 되게 계수를 설정하는 방법을 하나 항상 얻을 수 있다. 또한 이 때 나올 수 있는 \(b_i\)의 가짓수는 \(k\)의 가짓수와 같으므로 총 \(N-1\)가지임을 알 수 있다.

 

1에서 계산한 값이 0인 경우 \(b_i\)의 값을 모두 1로 두어 조건을 만족시킬 수 있음을 추가로 관찰하면, 총 \(N\)가지의 \(b_i\)를 이용해 주어진 모든 식을 0으로 항상 만들 수 있음을 확인할 수 있다.

 

위 내용을 구현해 문제를 해결하자.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;

int N, M;
int A[102];

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> N >> M;
	while (M--) {
		int total = 0;
		for (int i = 1; i <= N; i++) {
			cin >> A[i];
			total += A[i];
		}
		if (!total) {
			for (int i = 1; i <= N; i++) {
				cout << 1 << ' ';
			}
			cout << '\n';
		}
		else {
			int psum = 0;
			for (int i = 1; i <= N; i++) {
				psum += A[i];
				if (psum * 2 == total) {
					for (int k = 1; k <= i; k++) {
						cout << 1 << ' ';
					}
					for (int k = i + 1; k <= N; k++) {
						cout << -1 << ' ';
					}
					cout << '\n';
					break;
				}
			}
		}
	}
}

 

BOJ Random Defense #20

728x90

'BOJ' 카테고리의 다른 글

[BOJ 2632 // C++] 피자판매  (0) 2024.06.04
[BOJ 26654 // C++] 원점  (0) 2024.06.03
[BOJ 23000 // C++] L Shaped Plots  (0) 2024.06.01
[BOJ 9911 // C++] ERP  (0) 2024.05.31
[BOJ 1727 // C++] 커플 만들기  (0) 2024.05.30

+ Recent posts