[C++] μ€‘κ°„μ—μ„œ λ§Œλ‚˜κΈ°(Meet In The Middle)

2022. 3. 11. 18:46Β·πŸ“ Computer Science/✏ Algorithm

μ€‘κ°„μ—μ„œ λ§Œλ‚˜κΈ°(Meet In The Middle)

μ•Œκ³ λ¦¬μ¦˜ 문제λ₯Ό ν’€ λ•Œ μ™„μ „ νƒμƒ‰μœΌλ‘œ νƒμƒ‰ν•˜λŠ” 경우, νƒμƒ‰μ˜ λ²”μœ„κ°€ 컀질수둝 경우의 μˆ˜μ™€ μ—°μ‚°λŸ‰μ΄ κΈ°ν•˜κΈ‰μˆ˜μ μœΌλ‘œ λŠ˜μ–΄λ‚˜λŠ” 것을 λ³Ό μˆ˜κ°€ μžˆλ‹€. μ΄λ•Œ μ€‘κ°„μ—μ„œ λ§Œλ‚˜κΈ° 방식을 μ‚¬μš©ν•˜λ©΄, μ‹œκ°„ λ³΅μž‘λ„λ₯Ό 제곱근만큼 쀄일 수 μžˆλ‹€.

 

μ€‘κ°„μ—μ„œ λ§Œλ‚˜κΈ° 방식은 μ•žμͺ½κ³Ό λ’€μͺ½μ—μ„œ μ ˆλ°˜μ”© μ ‘κ·Όν•˜μ—¬ μ€‘κ°„μ—μ„œ νƒμƒ‰ν•œ κ²°κ³Όκ°€ λ§Œλ‚˜κ²Œ ν•˜λŠ” 탐색 κΈ°μˆ μ„ μ˜λ―Έν•œλ‹€. 즉, μ€‘κ°„μ—μ„œ λ§Œλ‚œ μ—°μ‚°μ˜ κ²°κ³Όλ₯Ό 합쳐 전체 κ²°κ³Όλ₯Ό λ½‘μ•„λ‚΄λŠ” 것이닀.

 

문제

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

 

1208번: λΆ€λΆ„μˆ˜μ—΄μ˜ ν•© 2

첫째 쀄에 μ •μˆ˜μ˜ 개수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” Nκ³Ό μ •μˆ˜ Sκ°€ μ£Όμ–΄μ§„λ‹€. (1 ≤ N ≤ 40, |S| ≤ 1,000,000) λ‘˜μ§Έ 쀄에 N개의 μ •μˆ˜κ°€ 빈 칸을 사이에 두고 μ£Όμ–΄μ§„λ‹€. μ£Όμ–΄μ§€λŠ” μ •μˆ˜μ˜ μ ˆλŒ“κ°’μ€ 100,000을 λ„˜μ§€ μ•ŠλŠ”λ‹€.

www.acmicpc.net

#include<iostream>
#include<map>
using namespace std;

int N, S;
int arr[41];

long long answer;
map<int, int> subsum;

void MeetInTheMiddle(int start, int end, int sum)
{
    if (start == end) {
        if (end == N)
            answer += subsum[S - sum]; // 2. 였λ₯Έμͺ½ ν•©(=S-μ™Όμͺ½ ν•©) 개수 κ΅¬ν•˜κΈ°
        else
            subsum[sum]++; // 1. μ™Όμͺ½ ν•© 개수 κ΅¬ν•˜κΈ°
        return;
    }

    MeetInTheMiddle(start + 1, end, sum + arr[start]);
    MeetInTheMiddle(start + 1, end, sum);
}

int main()
{
    ios_base::sync_with_stdio(NULL);
    cin.tie(NULL);
    cout.tie(NULL);

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

    MeetInTheMiddle(0, N / 2, 0);
    MeetInTheMiddle(N / 2, N, 0);

    // 아무것도 뽑지 μ•Šμ•˜μ„ λ•Œ λΉΌμ£ΌκΈ°
    answer += S == 0 ? -1 : 0;
    cout << answer;
}
μ €μž‘μžν‘œμ‹œ (μƒˆμ°½μ—΄λ¦Ό)
'πŸ“ Computer Science/✏ Algorithm' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [C++] 평행 λΆ„ν• , λͺ¨μŠ€ μ•Œκ³ λ¦¬μ¦˜
  • [C++] λˆ„μ  ν•©(Prefix sum)
  • [C++] λ¬Έμžμ—΄
  • [C++] λ„€νŠΈμ›Œν¬ μœ λŸ‰(Network Flow)
Blxxming
Blxxming
CS 지식과 κ³΅λΆ€ν•˜λ‹€ 배운 것, κ²½ν—˜ν•œ 것 등을 κΈ°λ‘ν•˜λŠ” λΈ”λ‘œκ·Έμž…λ‹ˆλ‹€.
  • Blxxming
    πŸ’‘λ²ˆλœ©πŸ’‘
    Blxxming
  • 전체
    였늘
    μ–΄μ œ
  • 곡지사항

    • Tech Interview
    • πŸ“š Tech (246)
      • πŸ“ Computer Science (96)
        • ✏ OS (12)
        • ✏ Network & Web (10)
        • ✏ Database (11)
        • ✏ Data Structure (6)
        • ✏ Algorithm (40)
        • ✏ Design Pattern (9)
        • ✏ Cloud Computing (3)
        • ✏ (5)
      • πŸ“ Language (73)
        • ✏ Language (6)
        • ✏ C & C++ (11)
        • ✏ C# (19)
        • ✏ JAVA (37)
      • πŸ“ Game (43)
        • ✏ Computer Graphics (2)
        • ✏ Unity (14)
        • ✏ Unreal (26)
        • ✏ (1)
      • πŸ“ Book (34)
        • ✏ Effective (3)
        • ✏ Game Server (16)
        • ✏ Clean Code (14)
        • ✏ (1)
  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.0
Blxxming
[C++] μ€‘κ°„μ—μ„œ λ§Œλ‚˜κΈ°(Meet In The Middle)
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”