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

 

이번에 볼 문제는 백준 5624번 문제인 좋은 수이다.
문제는 아래 링크를 확인하자.

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

 

5624번: 좋은 수

정수 N개로 이루어진 수열 A가 있다. 이때, i번째 수가 그 앞에 있는 수 세 개의 합으로 나타낼 수 있을 때, 그 수를 좋다고 한다. (같은 위치에 있는 수를 여러 번 더해도 된다) 수열이 주어졌을 때

www.acmicpc.net

각 i번째 수에 대하여, i보다 작은 인덱스를 가진 세 수의 합(중복 허용)으로 i를 만들 수 있는 수의 개수를 찾는 문제이다.

 

i보다 작은 인덱스를 가진 (두 수의 합)을 관리하고, i에서 (i보다 작은 인덱스를 가진 수)를 하나 뺀 값들이 (두 수의 합)의 집합에 속해있는지 판단하는 것으로 문제를 해결할 수 있다.

 

(두 수의 합)의 범위는 -20만 이상 20만 이하이므로, 각 수에 20만을 더해 크기 40만1의 배열로 접근이 가능하다.

 

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

#include <iostream>
using namespace std;

int arr[5000];
int cnt2[400001]; // (실제 수 + 20만)

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

	int N; cin >> N;
	for (int i = 0; i < N; i++) {
		cin >> arr[i];
	}

	int ans = 0;
	for (int i = 0; i < N; i++) {
		bool chk = 0;
		int num = arr[i];
		for (int j = 0; j < i; j++) {
			if (cnt2[num - arr[j] + 200000]) chk = 1;
		}
		for (int j = 0; j <= i; j++) cnt2[num + arr[j] + 200000] = 1;
		if (chk) ans++;
	}

	cout << ans;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 11400 // C++] 단절선  (0) 2022.06.04
[BOJ 4352 // C++] Jogging Trails  (0) 2022.06.03
[BOJ 14942 // C++] 개미  (0) 2022.06.01
[BOJ 14941 // C++] 호기심  (0) 2022.05.31
[BOJ 5626 // C++] 제단  (0) 2022.05.30

+ Recent posts