[Coding] 2차원 벡터의 선언, 공간할당, 초기화 & 백준 10986 나머지 합 구하기 C++

문채영·2023년 4월 4일
0

💻 2차원 벡터 선언

vector<vector<int>>v;

2차원 vector의 선언은 일반적인 vector의 형식과 동일하게 vector안에 vector 자료형을 담는다는 느낌으로 이렇게 선언한다.

💻2차원 벡터의 공간 할당

vector<vector<int>>v(5,vector<int>(5))//5 x 5 벡터이다

이렇게 vector<vector> v (행 크기, vector(열 크기)) 이렇게 넣어주면 된다.

💻 2차원 벡터의 초기화

vector<vector<int>> v(5,vector<int>(5,3))//5x5 벡터가 3으로 다 초기화된다

💻백준 10986 나머지 합 구하기

연속으로 주어진 수에 대해 구간 나머지 합 구하기

  1. 합배열 S의 원소를 나눌 수 (M) 으로 나머지 연산을 수행 해 값을 업데이트. 원소가 0인 애들은 연속합에서의 나머지가 0 이므로 answer에 ++
  2. 변경된 합 배열 S에서 원소값이 같은 2개의 원소를 뽑는 경우의 수 구하기.
    nCr =n!/r!(n-r)! , nCn=1
    C[i] 개 중에 2개를 뽑는 경우의 수 계산 공식: C[i]*(C[i]-1])/2
#include<iostream>
using namespace std;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int N, M;
	cin >> N >> M;
	long answer = 0;
	long S[1000001] = { 0 };//합 배열
	long C[1000001] = { 0 };//같은 나머지 갖는 인덱스 카운트 배열

	
	for (int i = 1; i <=N; i++) {
		int temp;
		cin >> temp;
		S[i] = S[i - 1] + temp;
	}

	for (int i = 0; i < N; i++) {//합배열에 M으로 나눗셈 연산하기
		int remainder = S[i] % M;//합배열을 M으로 나눈 나머지 값
		if (remainder == 0) {
			answer++;
		}
		C[remainder]++;
	}

	for (int i = 0; i < N; i++) {
		if (C[i] > 1) {
			//나머지가 같은 인덱스 중 2개 뽑는 경우의 수 더하기
			answer = answer + (C[i] * (C[i] - 1) / 2);
			//C[i]개 중에 2개를 뽑는 경우의 수 계산 공식: C[i] * (C[i] - 1) / 2
		}
	}
	cout << answer << "\n";
}

0개의 댓글