[ 백준 ] 5624 / 좋은 수

金弘均·2021년 9월 15일
0

Baekjoon Online Judge

목록 보기
72/228
post-thumbnail

# Appreciation

/*
 * Problem :: 5624 / 좋은 수
 *
 * Kind :: Dynamic Programming
 *
 * Insight
 * - 앞에 있는 수 세 개의 합이라...
 *   일단 순서가 필요하니 정렬은 못 하겠다
 *   + 두 수의 합이라면
 *     Map 이나 Set 을 활용해서
 *     for (int i=1; i<N; i++) {
 *         for (int j=0; j<i; j++) {
 *             if (A[i]-A[j] 가 Map/Set 에 포함되면 true) {
 *                 ans++;
 *                 break;
 *             }
 *         }
 *     }
 *     이렇게 찾으면 될 텐데...
 *     # 잠깐, 그러면
 *       세 수의 합 = 두 수의 합 + 한 수
 *       로 생각할 수 있고
 *       i번째 수 앞의 두 수의 합들을 항상 추적하고 있다면
 *       if (A[i]-A[j] 를 i번째 수 앞의 두 수의 합으로 만들 수 있다면 true) {
 *           ans++;
 *           break;
 *       }
 *       로 답을 구할 수 있다!
 *
 * Point
 * - 솔직히 음수 처리가 귀찮다면
 *   Map/Set 으로 풀어도 된다
 *   + 다만, 좀더 수행시간을 줄이고 싶다면 배열로 풀자
 *     # -100,000 <= A_i <= 100,000 이라
 *       가능한 범위를 배열로 잡아도 메모리를 초과하지 않는다
 */

# Code

//
//  BOJ
//  ver.C++
//
//  Created by GGlifer
//
//  Open Source

#include <iostream>
#include <map>
#include <cstring>

using namespace std;

#define endl '\n'

// Set up : Global Variables
/* None */

// Set up : Functions Declaration
/* None */


int main()
{
    // Set up : I/O
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    // Set up : Input
    int N; cin >> N;
    int A[N];
    for (int i=0; i<N; i++)
        cin >> A[i];

    // Process
    int ofs = 200'000;
    bool S2[2*ofs+1]; /* S2[j] = i번째 수 앞의 두 수의 합으로 j 를 만들 수 있는지 여부 */
    memset(S2, false, sizeof(S2));
    S2[A[0]+A[0]+ofs] = true; /* 2번째 수 앞의 두 수의 합으로 만들 수 있는 수
                               * = 1번째 수 + 1번째 수 */

    int ans = 0;
    for (int i=1; i<N; i++) {
        for (int j=0; j<i; j++) {
            /* A[i] = 세 수의 합
             * A[j] = 한 수
             * A[i]-A[j] = 두 수의 합 */
            if (S2[A[i]-A[j]+ofs]) {
                ans++;
                break;
            }
        }

        /* S2 갱신
         * A[i]+A[j] = i번째 수를 이용하여 만들 수 있는 두 수의 합 */
        for (int j=0; j<=i; j++) {
            S2[A[i]+A[j]+ofs] = true;
        }
    }

    // Control : Output
    cout << ans << endl;
}

// Helper Functions
/* None */
profile
이런 미친 게임을 봤나! - 옥냥이

0개의 댓글