문제 개요
marks라는 이름의 배열이 있다고 가정해 보겠습니다. 이 배열에는 학생들의 성적이 저장되어 있으며, 짝수 인덱스(marks[0], marks[2] 등)에는 남학생의 성적이, 홀수 인덱스에는 여학생의 성적이 들어 있습니다.
여기에 추가 입력으로 gender가 주어집니다. gender의 값은 'b' 또는 'g' 중 하나입니다. 값이 'b'이면 모든 남학생 성적의 합계를 반환하고, 'g'이면 모든 여학생 성적의 합계를 반환해야 합니다. (배열의 크기는 N)
예를 들어 입력이 N = 9, marks = [8,5,2,6,7,5,9,9,7], gender = 'g'라고 하면 출력은 25가 됩니다. 홀수 인덱스의 값인 5 + 6 + 5 + 9 = 25이기 때문입니다.
해결 접근 방법
이 문제는 다음 단계를 따라 해결할 수 있습니다:
- 여학생 성적 합계(g_sum)와 남학생 성적 합계(b_sum)를 각각 0으로 초기화합니다.
- i를 0부터 n-1까지 반복하면서 다음을 수행합니다:
- i mod 2가 1, 즉 홀수 인덱스이면 g_sum에 marks[i]를 더합니다.
- 그렇지 않으면(짝수 인덱스) b_sum에 marks[i]를 더합니다.
- 반복이 끝난 후 gender가 'b'와 같으면 b_sum을 반환합니다.
- 그 외의 경우 g_sum을 반환합니다.
구현 예제
아래 구현 예제를 통해 더 자세히 이해해 보겠습니다:
#include <stdio.h>
#define N 9
int solve(int marks[], int n, char gender){
int g_sum = 0;
int b_sum = 0;
for(int i = 0; i < n; i++){
if(i % 2 != 0){
g_sum += marks[i];
}else{
b_sum += marks[i];
}
}
if(gender == 'b')
return b_sum;
return g_sum;
}
int main(){
int marks[N] = {8,5,2,6,7,5,9,9,7};
char gender = 'g';
int sum = solve(marks, N, gender);
printf("%d", sum);
}
입력
{8,5,2,6,7,5,9,9,7}, 'g'
출력
25
코드 설명 및 복잡도
solve 함수는 배열 전체를 한 번만 순회하면서 인덱스의 홀짝 여부에 따라 값을 누적합니다. 따라서 시간 복잡도는 O(N)이며, 별도의 추가 메모리 없이 두 그룹의 합계를 동시에 계산할 수 있습니다. 이 방식은 데이터 양이 많아져도 선형 시간 안에 결과를 얻을 수 있어 매우 효율적입니다.