문제 요약
당신에게는 n개의 일차원 배열이 주어진다.
여기서 k는 (i,j)의 쌍을 나누는 수이다. (단 i < j) k로 나누었을때 나머지가 없는 쌍의 개수를 구해라.
Sample Input
6 3
1 3 2 6 1 2
Sample Output 0
5
설명
- (0,2) -> 1+2=3
- (0,5) -> 1+2=3
- (1,3) -> 3+6=9
- (2,4) -> 2+1=3
- (4,5) -> 1+2=3
내 소스
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
class Solution {
static int divisibleSumPairs(int n, int k, int[] ar) {
// Complete this function
int totalCount = 0;
for (int i = 0; i < n; i++)
{
for (int j = i+1; j < n; j++)
{
if ((ar[i]+ar[j])%k==0)
{
totalCount++;
}
}
}
return totalCount;
}
static void Main(String[] args) {
string[] tokens_n = Console.ReadLine().Split(' ');
int n = Convert.ToInt32(tokens_n[0]);
int k = Convert.ToInt32(tokens_n[1]);
string[] ar_temp = Console.ReadLine().Split(' ');
int[] ar = Array.ConvertAll(ar_temp,Int32.Parse);
int result = divisibleSumPairs(n, k, ar);
Console.WriteLine(result);
}
}
wanbo의 답안
#include <bits/stdc++.h>
using namespace std;
int n, k;
int a[N];
int main() {
cin >> n >> k;
for(int i = 0; i < n; i++) cin >> a[i];
int res = 0;
for(int i = 0; i < n; i++)
for(int j = i + 1; j < n; j++)
if((a[i] + a[j]) % k == 0) res++;
cout << res << endl;
return 0;
}
usinha02
문제를 풀면서 혹시 O(n)으로 푸는 방법이 존재하지 않을까 싶었는데, 역시나 존재한다.
using namespace std;
int main(){
int n;
int k;
cin >> n >> k;
int a[n];
int m[k];
for(int i=0; i<k; i++) {
m[i]=0;
}
for(int i = 0; i < n; i++) {
cin >> a[i];
m[a[i]%k]++;
}
int sum=0;
sum+=(m[0]*(m[0]-1))/2;
for(int i=1; i<=k/2 && i!=k-i; i++) {
sum+=m[i]*m[k-i];
}
if(k%2==0) {
sum+=(m[k/2]*(m[k/2]-1))/2;
}
cout<<sum;
return 0;
}
느낀점
그냥 간단하게 이중 for문을 사용하여 구할 수 있다.