반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

코딩하기 좋은날

백준 10986 나머지 합 본문

백준(Baekjoon) 문제

백준 10986 나머지 합

huiung 2019. 1. 15. 21:49
반응형

문제와 채점은 위 사이트에서 확인 하실 수 있습니다.

 

이 문제는 연속된 수들의 합중 M으로 나누어 떨어지는 수의 개수를 구하는 문제인데 시간 제한이 1초라서

 

O(N^2)의 복잡도로는 해결이 불가능하다. 따라서 입력받은 숫자들을 첫 번째부터 더하면서 나눈 나머지를 배열에 저장한 뒤

 

예를 들어 예제 입력인 1 2 3 1 2 라면 각각 3으로 나눈 1 0 0 1 0 이 된다. 이때 1과 1사이에 있는 연속 적인 수들의 합이 나누어 떨어지게 된다는 것을 알  수 있다. 즉 나머지가 동일한 숫자 들이 있으면 그중 어떤 2개를 뽑으면 그사이에서 나머지가 0인 것이 반드시 존재하게 된다. 따라서 존재 하는 나머지 들을 2개를 택하는 조합으로 생각해서 nC2로 생각하면 시간안에 해결 할 수 있다. 시간 제한이 있어서 조합을 생각하는게 어려운 문제였습니다.. 풀이를 보고 그저 감탄 했습니다.

 

코드입니다.

 

#include <iostream>

using namespace std;

int main(void) {
	ios_base::sync_with_stdio(false);
	int N,M;
	long long sum[1001] = {0,};
	int asum = 0;
	long long fre = 0; // 오버 플로우 발생 가능성이 있으므로 long long 선언 
	
	cin>>N>>M;
	
	for(int i = 0; i < N; i++) {
		int x;
		cin >> x;
		asum = (asum + x) % M; // i번째 까지 입력 받은 수들의 합을 M으로 나눈 나머지를 저장 
		
		if(!asum)
			fre++;

		sum[asum]++; //나머지가 asum인 요소 개수 증가 
	}
	
	for(int i = 0; i < M; i++) { 
			fre += sum[i]*(sum[i] - 1) / 2; // sum[i] 의 개수 중 2개를 고르면 그사이의 합이 나머지가 0 이된다. sum[i]C2 
	}
	
	cout<<fre<<'\n';
	
	return 0;	
}
반응형

'백준(Baekjoon) 문제' 카테고리의 다른 글

백준 2751 수 정렬하기2 (merge sort)  (0) 2019.01.15
백준 1427 소트인사이드  (0) 2019.01.15
백준 11441 합 구하기  (0) 2019.01.15
백준 3052 나머지  (0) 2019.01.14
백준 2953 나는 요리사다.  (0) 2019.01.14