๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜

[๊ธฐ๋ณธ] ํˆฌ ํฌ์ธํ„ฐ

by ์„œ์•„๋ž‘๐Ÿ˜ 2025. 3. 25.

 

๋“ค์–ด๊ฐ€๋ฉฐ

ํˆฌ ํฌ์ธํ„ฐ๋Š” 2๊ฐœ์˜ ํฌ์ธํ„ฐ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ์‚ฌ๋žŒ๋“ค์€ ํˆฌ ํฌ์ธํ„ฐ๋ฅผ ํ™œ์šฉํ•  ์ƒ๊ฐ์„ ์‰ฝ๊ฒŒ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์˜ค๋Š˜์€ ํˆฌ ํฌ์ธํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•Œ์•„๋ด…์‹œ๋‹ค.

 

ํˆฌ ํฌ์ธํ„ฐ๋Š” ์ธ์ ‘ํ•œ ๋ฆฌ์ŠคํŠธ์—์„œ ๋‘ ์ธ๋ฑ์Šค๋ฅผ ๊ธฐ๋กํ•ด๊ฐ€๋ฉด์„œ ์กฐ๊ฑด ์ฒดํฌ๋ฅผ ํ•ด ๋‚˜๊ฐ‘๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๊ธฐ๋ก์ž…๋‹ˆ๋‹ค. ํฌ์ธํ„ฐ๊ฐ€ ๊ธฐ๋ก์„ ํ•ด๋‚˜๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด ์›์†Œ๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ๋ณต์žก๋„๋ฅผ ๋‚ญ๋น„ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ํฐ ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํˆฌ ํฌ์ธํ„ฐ๋Š” ๋ณ‘ํ•ฉ์ •๋ ฌ(merge sort)์˜ counquer ์˜์—ญ์˜ ๊ธฐ์ดˆ๊ฐ€ ๋˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

 

๋ฌธ์ œ1

๋ฐฑ์ค€ 2018: ์ˆ˜๋“ค์˜ ํ•ฉ 5(๋งํฌ)

๋ถ„์„

์ฃผ์–ด์ง„ ์ œํ•œ์‹œ๊ฐ„์€ 2์ดˆ์ธ๋ฐ N์˜ ์ตœ๋Œ“๊ฐ’์€ 10,000,000์œผ๋กœ ๋งค์šฐ ํฌ๊ฒŒ ์žกํ˜€์žˆ์Šต๋‹ˆ๋‹ค. nlogn์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด๋„ ์ œํ•œ ์‹œ๊ฐ„์„ ์ดˆ๊ณผํ•˜๋ฏ€๋กœ O(n)์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿด ๋•Œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํˆฌ ํฌ์ธํ„ฐ์ž…๋‹ˆ๋‹ค. ์—ฐ์†๋œ ์ž์—ฐ์ˆ˜์˜ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด ๋ฌธ์ œ์ด๋ฏ€๋กœ ์‹œ์ž‘ ์ธ๋ฑ์Šค์™€ ์ข…๋ฃŒ ์ธ๋ฑ์Šค๋ฅผ ์ง€์ •ํ•˜์—ฌ ์—ฐ์†๋œ ์ˆ˜๋ฅผ ํ‘œํ˜„ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

 

ํ’€์ด

#include <iostream>
using namespace std;

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

    int start = 1, end = 1, sum = 1, result = 1;
    while (end != num)
    {
        if (sum == num)
        {
            end++;
            sum = sum + end;
            result++;
        }
        else if (sum < num)
        {
            end++;
            sum = sum + end;
        }
        else
        {
            sum = sum - start;
            start++;
        }
    }

    printf("%d\n", result);
    //cout << result;
}

 

ํˆฌ ํฌ์ธํ„ฐ ์ด๋™ ์›์น™

  • sum > num: sum = sum - start_idx; start_idx++;  // ์—ฐ์†๋œ ์ž์—ฐ์ˆ˜์—์„œ ์™ผ์ชฝ ๊ฐ’ ์‚ญ์ œ(์ถ•์†Œ)
  • - sum < num: end_idx++; sum = sum + end_idx;  // ์—ฐ์†๋œ ์ž์—ฐ์ˆ˜์—์„œ ์˜ค๋ฅธ์ชฝ ๊ฐ’ ์ถ”๊ฐ€(ํ™•์žฅ)
  • - sum == num: end_idx++; sum = sum + end_idx; result++;  // ๊ฐ™์€ ๊ฒฝ์šฐ ํ™•์žฅํ•ด์„œ ๋‹ค์Œ ๋กœ์ง์„ ์ด์–ด๊ฐ

 

 

๋ฌธ์ œ2

๋ฐฑ์ค€ 1253: ์ข‹์€ ์ˆ˜(๋งํฌ)

 

 

 

๋ถ„์„

N์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ตœ๋Œ€ 2,000์ด๋ผ ๊ฐ€์ •ํ•ด๋„ ์ข‹์€ ์ˆ˜ ํ•˜๋‚˜๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” N^2๋ณด๋‹ค ์ž‘์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. O(nlogn)์ด ์ตœ์ ์ด๊ฒ ๋„ค์š”. ์ •๋ ฌ๊ณผ ํˆฌ ํฌ์ธํ„ฐ๋ฅผ ํ™œ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณผ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ์—์„œ ์ž๊ธฐ ์ž์‹ ์„ ์ข‹์€ ์ˆ˜ ๋งŒ๋“ค๊ธฐ์— ํฌํ•จํ•˜๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค. ์ด ์ ์„ ์ฃผ์˜ํ•˜๋ฉด์„œ ๋ฌธ์ œ์— ์ ‘๊ทผํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

ํ’€์ด

#pragma once
// ๋ฐฑ์ค€ 1253: ์ข‹์€์ˆ˜
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;


int main()
{
    long count;
    cin >> count;

    vector<long> data(count, 0);
    for (int i = 0; i < count; i++)
        cin >> data[i];


    std::sort(data.begin(), data.end());
    int start = 0;
    int end = 0;
    int result = 0;
    for (int i = 0; i < count; i++)
    {
        start = i == 0 ? 1 : 0;
        end = i == count - 1 ? count - 2 : count - 1;
        while (start < end)
        {
            if (start == i)
            {
                start++;
                continue;
            }

            if (end == i)
            {
                end--;
                continue;
            }

            if (data[start] + data[end] == data[i])
            {
                result++;
                break;
            }
            else if (data[start] + data[end] < data[i])
            {
                start++;
            }
            else
                end--;
        }
    }

    printf("%d\n", result);
}

 

ํˆฌ ํฌ์ธํ„ฐ ์ด๋™์›์น™

  • start_data + end_data > target: end--;
  • start_data + end_data < target: start++;
  • start_data + end_data == target: result++;

 

์ฃผ์˜ํ•ด์•ผํ•  ์ 

  • ์ž๊ธฐ ์ž์‹ ์„ ์ข‹์€ ์ˆ˜์— ํฌํ•จ์‹œํ‚ค์ง€ ์•Š๊ธฐ ์œ„ํ•ด start, end๊ฐ€ i ์™€ ๊ฐ™์€ ๊ฒฝ์šฐ(ํˆฌ ํฌ์ธํ„ฐ๊ฐ€ ํƒ€๊ฒŸ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ)๋Š” ๋จผ์ € ์ œ์™ธ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

 

 

์ •๋ฆฌ

ํˆฌ ํฌ์ธํ„ฐ๋Š” ๋ณดํ†ต ๋‘ ์ˆ˜์˜ ํ•ฉ/๊ณฑ ๋“ฑ, ์—ฐ์‚ฐ์„ ํ†ตํ•ด ํŠน์ • ๊ฐ’๊ณผ ๋น„๊ตํ•  ๋•Œ ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํˆฌ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ผ๋ฐ˜์ ์ธ ์ƒ๊ฐ์€ ์ด์ค‘ ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•ด๊ฐ€๋ฉด์„œ ๋ฆฌ์ŠคํŠธ์˜ ๋‘ ๊ฐ’๋“ค์„ ์—ฐ์‚ฐํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์—ฌ๊ธฐ์„œ ๋ถ€ํ„ฐ O(N^2)์ด ๋‚˜์™€๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋Ÿฐ ์œ ํ˜•์˜ ๋ฌธ์ œ๊ฐ€ ๋‚˜์˜จ๋‹ค๋ฉด ์ฃผ์ €ํ•˜์ง€๋ง๊ณ  ํˆฌ ํฌ์ธํ„ฐ๋ฅผ ๋– ์˜ฌ๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋Œ“๊ธ€