𝘚𝘭𝘰𝘸 𝘣𝘢𝘡 𝘴𝘡𝘦𝘒π˜₯𝘺

[λ°±μ€€] 5624번: 쒋은 수 - C++ λ³Έλ¬Έ

μ½”λ”©ν…ŒμŠ€νŠΈ μ€€λΉ„/λ°±μ€€

[λ°±μ€€] 5624번: 쒋은 수 - C++

.23 2022. 1. 12. 14:58
문제

μ •μˆ˜ N개둜 이루어진 μˆ˜μ—΄ Aκ°€ μžˆλ‹€. μ΄λ•Œ, i번째 μˆ˜κ°€ κ·Έ μ•žμ— μžˆλŠ” 수 μ„Έ 개의 ν•©μœΌλ‘œ λ‚˜νƒ€λ‚Ό 수 μžˆμ„ λ•Œ, κ·Έ 수λ₯Ό μ’‹λ‹€κ³  ν•œλ‹€. (같은 μœ„μΉ˜μ— μžˆλŠ” 수λ₯Ό μ—¬λŸ¬ 번 더해도 λœλ‹€)

μˆ˜μ—΄μ΄ μ£Όμ–΄μ‘Œμ„ λ•Œ, 총 λͺ‡ 개의 μˆ˜κ°€ 쒋은 수 일까?

 

μž…λ ₯

첫째 쀄에 μˆ˜μ—΄ A의 크기 N이 주어진닀. (1 ≤ N ≤ 5000) λ‘˜μ§Έ μ€„μ—λŠ” μˆ˜μ—΄ A의 각 μˆ«μžκ°€ 곡백으둜 κ΅¬λΆ„λ˜μ–΄ 주어진닀. (-100,000 ≤ Ai ≤ 100,000)

 

좜λ ₯

첫째 쀄에 쒋은 수의 개수λ₯Ό 좜λ ₯ν•œλ‹€.


μ˜€λžœλ§Œμ— ν’€μ–΄λ³΄μ•˜λ˜ λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ° λ¬Έμ œμ˜€λ‹€. 풀어본지도 μ˜€λž˜λκ±°λ‹ˆμ™€, λ‚œμ΄λ„ μžˆλŠ” 문제라 슀슀둜 생각해내기가 λ„ˆλ¬΄ μ–΄λ €μ›Œμ„œ κ²°κ΅­ κ΅¬κΈ€μ˜ νž˜μ„ λΉŒλ Έλ‹€γ… γ… 

핡심적인 식은 x + y + z = n μ΄λ―€λ‘œ, μ •λ¦¬ν•˜λ©΄ x + y = n - z λΌλŠ” 것.

이λ₯Ό μ΄μš©ν•˜μ—¬ λ°©λ¬Έλ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜λŠ” visited λ°°μ—΄μ—μ„œ (x + y)κ°’μ—λŠ” λ°©λ¬Έν–ˆλ‹€κ³  ν‘œμ‹œν•˜κ³ , (n - z)κ°€ μžˆλ‹€λ©΄ 쒋은 수둜 체크해쀀닀.

200,000을 λ”ν•˜λŠ” μ΄μœ λŠ” 수의 λ²”μœ„κ°€ -100000μ—μ„œ 100000μ΄λ―€λ‘œ, κ°€μž₯ μž‘μ€ 수 -100000이 λ‘λ²ˆ λ”ν–ˆμ„ λ•Œ 0이 λ˜λ„λ‘ 인덱슀 λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜μ§€ μ•Šκ²Œ 보정해주기 μœ„ν•΄μ„œμ΄λ‹€.

 

μ½”λ“œ
#include <cstdio>
#define MAX 5000

int A[MAX];
bool visited[400001] = { false };

int DP(int num);

int main(void) {
    int N;
    scanf("%d", &N);

    for(int i = 0; i < N; i++) {
        scanf("%d", &A[i]);
    }

    printf("%d\n", DP(N));
    return 0;
}

int DP(int num) {
    int result = 0;

    for(int i = 0; i < num; i++) {
        for(int j = 0; j < i; j++) {
            if(visited[A[i] - A[j] + 200000]) {
                result++;
                break;
            }
        }

        for(int j = 0; j <= i; j++) {
            visited[A[i] + A[j] + 200000] = true;
        }
    }
    return result;
}
Comments