해당 문제를 푸는 방법은 입력을 받는 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;
}
'개발 > 알고리즘' 카테고리의 다른 글
백준 17413 실버 3 ) 단어 뒤집기 2 (0) | 2024.09.19 |
---|---|
백준 1874 실버2) 스택 수열 (0) | 2024.09.14 |
백준 실버 2- 백트래킹 ) 만족도 점수 16501 (2) | 2024.09.02 |
경북SW 한‧베 국제SW코딩경진대회 참가후기 (0) | 2024.09.02 |
백준 15683번 감시 (골드 3) 백트래킹, 시뮬레이션 (0) | 2024.07.19 |