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씩 증가시키도록 해 문제를 풀 수 있었다.
<결과>

'c언어 스터디 > HackerRank' 카테고리의 다른 글
| [HackerRank] Tree- Level Order Traversal (0) | 2021.06.25 |
|---|---|
| [HackerRank] Electronics Shop (0) | 2021.06.25 |
| [HackerRank] Breaking the Records (0) | 2021.05.28 |
| [HackerRank] Tree- Height of a Binary Tree (0) | 2021.05.28 |
| [HackerRank] Grading Students (0) | 2021.05.22 |