본문 바로가기

개발/알고리즘

백준 실버 5 - 1268) 임시 반장 정하기 - 구현

 

해당 문제를 푸는 방법은 입력을 받는 arr이라는 배열과 해당 번호와 일치하는지를 체크하는 brr 배열이  있습니다.

5
2 3 1 7 3
4 1 9 6 8
5 5 2 4 4
6 5 2 6 7
8 4 2 2 2

 

위의 같은 상황이라면 첫번째 예로  2학년때 3번째 학생과 4번쨰 학생이 같은 5반이기 때문에

j와 k가 똑같다면 continue를 하는 조건에 성립되지 않고 비교할 arr[j][i]의 값과 arr[k][i]가 똑같기 때문에

 

brr[3][4] = 1이라는 값을 대입하고  brr[4][3] = 1이라는 값을 대입하게 됩니다.

5 * n * n 로 for문을 돌리면 brr이 채워지게 됩니다. 

 

그리고 해당 번호를 n * n 으로 해당 번호와 겹치는 경우를 카운트하여 가장 높고 값이 같을 때에는 작은 인덱스로 적용하여 들어가도록 max 조건을 주고 maxIndx를 출력하면 됩니다

 

여기서 하나의 경우가 또 있는데 만약 아무것도 겹치지 않게 되는 경우가 있을 수 있습니다 이러한 경우에는

indx가 0으로 나올것이니 n이 얼마를 입력받든 1이 가장 낮은 인덱스이므로 0일시 1을 출력하게 해주면 됩니다!

 

#include <iostream>
#include <map>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
	
	int n;
	
	
	cin>> n;
	int arr[n+1][6];
	int brr[n+1][n+1];
	
	map<int,int> mp;
	vector<pair<int,int>> v;
	
	
	for(int i = 0; i < n; i++) {
		for(int j = 0; j < n; j++) {
			brr[i][j] = 0;
		}		
	}
	
	
	for(int i = 0; i < n; i++) {
		for(int j = 0; j < 5; j++) {
			cin >> arr[i][j];
		}		
	}
	

	
	for(int i = 0; i < 5; i++) {
		
		for(int j = 0; j < n; j++) {
			int xs = arr[j][i];	
			
			for(int k = 0; k < n; k++){
				
				if(j == k) continue;
				if(xs == arr[k][i]) {
					brr[j][k] = 1;
				}	
			}
		}
	}
	
	int maxs = 0;
	int maxIndx = 0;
	
	for(int j = 0; j < n; j++) {
		int count = 0;
		
		for(int k = 0; k < n; k++){
			
			if(j == k) continue;
			if(brr[j][k]) {
				count++;
			}	
		}
		
		if(count > maxs) {
			maxs = count;
			maxIndx = j+1;
		}
	}
	
	if(maxIndx == 0) {
		maxIndx = 1;
	}
	
	cout << maxIndx;


	return 0;
}