[HackerRank] Subarray Division

아르당·2023년 10월 24일
0

HackerRank

목록 보기
1/109
post-thumbnail

문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음

문제

릴리와 론은 초코바를 나누길 원한다. 초코바에 각 정수를 가지고 있다.
릴리는 다음과 같이 선택된 방법으로 나누는 것을 결심했다.

  • 론이 태어난 월과 선택된 초코바의 수는 일치한다.
  • 론의 태어난 일과 초코바의 정수 합은 같다.

Example

s = [2, 2, 1, 3, 2]
d = 4
m = 2

릴리는 론의 태어난 일인 d = 4와 태어난 월인 m = 2의 합을 구하길 원한다.
이 경우, 그녀의 규칙에 따라 [2, 2]와 [1, 3]이 있다.

Function Description

the birthday 함수를 완성해라.
birthday는 다음과 같은 매개변수를 가지고 있다.

  • int s[n]: 각 초코바에 적힌 정수
  • int d: 론이 태어난 일
  • int m: 론이 태어난 월

Returns

  • int: 초코바를 나눌 수 있는 경우의 수

Constraints

  • 1 <= n <= 100
  • 1 <= s[i] <= 5 (0 <= i < n)
  • 1 <= d <=31
  • 1 <= m <= 12

풀이

간단하게 반복문을 사용해서 풀었다.

먼저 경우의 수를 셀 변수를 선언한다.

int result = 0;

반복문을 통해 리스트의 요소를 순회한다. 이때 i = m - 1로 했는데, 그 이유는 리스트의 index와 맞추기 위함이다.

for(int i = m - 1; i < s.size(); i++){

}

그리고 지역변수 sum을 선언을 하고 0을 할당한다.
반복문을 하나 더 구현한다. 해당 index에서 m개의 요소의 합을 구함이다.
지역변수 sum과 d를 비교하여 같으면 result를 증가시킨다.

for(int i = m - 1; i < s.size(); i++){
	int sum = 0; 
    // s[i]는 최대 값이 5라서 100개를 더해도
    // 충분히 int형으로 계산할 수 있음
    
    for(int j = i - m + 1; j <= i; j++){
        sum += s.get(j);
    }
    
    if(sum == d){
        result++;
    }
}

마지막으로 result를 반환하면 끝이다.

return result;

경우가 많지 않아 시간복잡도와 공간복잡도는 신경쓰지 않았다.

전체 코드

public static int birthday(List<Integer> s, int d, int m) {
    int result = 0;
        
    for(int i = m - 1; i < s.size(); i++){
        int sum = 0;
            
        for(int j = i - m + 1; j <= i; j++){
            sum += s.get(j);
        }
            
        if(sum == d){
            result++;
        }
    }
    
	return result;
}
profile
내 마음대로 코드 작성하는 세상

0개의 댓글