[BOJ] 2003 수들의 합 2

Algorithm 2023. 1. 18. 13:11
반응형

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

 

2003번: 수들의 합 2

첫째 줄에 N(1 ≤ N ≤ 10,000), M(1 ≤ M ≤ 300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다.

www.acmicpc.net

 

힌트 

투 포인터 

 

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _2003
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] nm = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse);
            int n = nm[0];
            int m = nm[1];
            int start = 0;  
            int end = 0; 
            int sum = 0;
            int cnt = 0;
            int[] arr = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse);

            while (true)
            {
                if (sum >= m)
                {
                    sum -= arr[start];
                    start++;
                }
                else if (end >= arr.Length) 
                {
                    break;
                } 
                else 
                {
                    sum += arr[end];
                    end++;
                }

                if (sum == m) 
                    cnt++;
            }

            Console.WriteLine(cnt);  
        }
    }
}

 

 

 

c++

#include <cstdio>

int n, m, ans, sum, left, right;
int a[10000];

void solve() {
    while (true) {
        if (sum >= m) {
            sum -= a[left];
            left++;
        } else {
            if (right == n) break;
            sum += a[right];
            right++;
        }
        if (sum == m) ans++;
    }
}

int main() {
    scanf("%d %d", &n, &m);
    for (int i=0; i<n; i++) scanf("%d", &a[i]);
    solve();
    printf("%d\n", ans);
    return 0;
}

 

 

 

 

 

 

 

 

 

반례 찾기 

//[반례]
//6 13
//2 3 5 7 11 13
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _4458
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] nm = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse);
            int n = nm[0];
            int m = nm[1];
            int start = 0;
            int end = 0;
            int sum = 0;
            int cnt = 0;
            int[] arr = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse);

            //[반례]
            //6 13
            //2 3 5 7 11 13
            
            while (end < arr.Length)        //맨마지막을 확인 안하게됨...
            {
                if (sum >= m)
                {
                    sum -= arr[start];
                    start++;
                }
                else
                {
                    sum += arr[end];
                    end++;
                }

                if (sum == m)
                    cnt++;
            }

            Console.WriteLine(cnt);
        }
    }
}
반응형

'Algorithm' 카테고리의 다른 글

[LeetCode] Two Sum  (0) 2023.01.19
[프로그래머스] 완주하지 못한 선수  (0) 2023.01.18
[BOJ] 2979 트럭 주차  (0) 2023.01.18
[BOJ] 10808 알파벳 개수  (0) 2023.01.17
[BOJ] 10866 덱  (0) 2023.01.17
: