본문 바로가기

c언어 스터디/HackerRank

[HackerRank] Subarray Division

https://www.hackerrank.com/challenges/the-birthday-bar/problem

 

Subarray Division | HackerRank

Given an array of integers, find the number of subarrays of length k having sum s.

www.hackerrank.com

<문제>

input) 첫번째 줄에는 초콜릿 조각의 개수를 입력받는다.

다음 줄에는 초콜릿 조각의 개수만큼 초콜릿 위에 있는 숫자를 입력받는다.

마지막 줄에는 Ron의 생일이 일/월 순으로 입력된다.

 

output) Ron의 생일 중 날짜는 초콜릿 위에 있는 숫자들의 총합이 되고, 

생일 중 월은 날짜 크기와 총합이 같게 만드는 데에 사용해야 할 초콜릿의 개수이다.

초콜릿의 집합 개수를 결과로 출력한다.

 

function) 함수는 매개변수로 s_count(초콜릿 조각의 개수), s배열(초콜릿 조각 위에 써진 숫자 배열), d(생일 날짜), m(생일 월)를 받는다. 이 함수는 가능한 초콜릿 집합 개수를 리턴한다.

이러한 함수 int birthday(int s_count, int* s, int d, int m)을 정의해야한다.

 

 

<코드>

int birthday(int s_count, int* s, int d, int m) {
    int sum[105];
    int count=0;
    sum[0]=0;
    for(int i=0;i<s_count;i++)
        sum[i+1]=sum[i]+s[i];
    for(int i=0;i<=s_count-m;i++){
        if(sum[i+m]-sum[i]==d){
            count++;
        }
    }
    return count;

}

 

<코드 풀이>

만약 초콜릿 조각의 개수가 여러개가 된다면, 초콜릿 위에 써져있는 숫자들을 m(Ron의 생일 중 월)의 개수씩 각각 더하기에는 코드가 너무 복잡해질 것 같아 다른 방법을 고민했다.

다른 방법으로 초콜릿 위에 써져있는 숫자들이 저장된 배열인 s[i]를 차례로 두개씩 더해서 sum[]배열에 저장한다면, m의 개수만큼 sum[i+m]-sum[i]하여 d랑 같으면 함수의 리턴값이 1씩 증가해야한다. 

이를 이용해 for반복문으로 먼저 sum배열을 sum[i+1]=sum[i]+s[i]로 완성하고, 다음 for문으로 초콜릿 m개의 합이 d와 같으면 count를 1씩 증가시키도록 해 문제를 풀 수 있었다.

 

<결과>