본문 바로가기
코드업(codeup)/C

[코드업(codeup)/C]코드업(codeup) 2631 : 보물 찾기 C언어

by starfish22 2021. 11. 13.
728x90

▶문제 : 보물찾기 (codeup.kr)

 

보물 찾기

수열 속에 숨어 있는 보물들을 찾아보자. $n$개의 자연수로 이루어진 수열이 있다. 이 수열들 중 연속된 $1$개 이상의 원소들의 합이 정확히 $k$가 되면 이 구간은 보물구간이라고 한다. 주어진 $n$

codeup.kr

 

▶코드 작성

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n, k, i, L;
    int cnt = 0, sum;
    int *arr;

    scanf("%d %d", &n, &k);

    arr = (int *)malloc(sizeof(int) * n);

    for (i = 0; i < n; i++)
    {
        scanf("%d", &arr[i]);
    }

    sum = arr[0];//더한 수들의 합
    L = i = 0;//L은 왼쪽 i는 오른쪽
    while (i < n)//i가 더이상 오른쪽으로 못갈 때 마무리
    {
        if (sum == k)//값이 같을 때
        {
            cnt++;
            sum -= arr[L];//맨 왼쪽값을 뺀다
            L++;//오른쪽으로 한칸 이동
        }
        else if (sum < k)//값보다 작을 때
        {
            i++;//오른쪽으로 한칸 이동
            sum += arr[i];//맨 오른쪽값을 더한다
        }
        else if (sum > k)//값보다 클 때
        {
            sum -= arr[L];//맨 왼쪽값을 뺀다
            L++;//오른쪽으로 한칸 이동
        }
    }

    printf("%d", cnt);

    free(arr);

    return 0;
}

 

▶해석

구하려는 값(k)과 가깝도록 sum을 유지시켜 조금씩 i가 n에 가깝게 이동하며 k값과 같은 값을 찾음

728x90

댓글