골드 2 문제라 살짝 겁먹고 들어갔는데
투포인터에 익숙하지 않아서(?) 오히려 잘 풀렸던 것 같기도 하다.
생각보다 간단하다.
(컴파일 에러는 배열을 int index[1001] 로 사용했는데 index가 이미 백준 컴파일러에 정의가 되어있다나... 그래서 오류가 난 듯 하다)
반복 하면서
한 반에서 제일 큰놈이 전체 비교중 가장 작다면 그다음에 종료 (이보다 작은 차이를 만들 수 없음)
여기서 중요한점은 각 반별로 인덱스(포인터)를 지정해줘야 한다 출발과 끝 두가지만 있다면 st, en 으로 설정했겠지만
이 문제에서는 각 반마다 현재 인덱스가 필요하므로 index 배열을 선언한다.
#include <bits/stdc++.h>
using namespace std;
int n, m;
int arr[1001][1001];
int idx[1001];
long long result = 9999999999;
int main()
{
cin >> n >> m;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin >> arr[i][j];
}
}
for (int i = 0; i < n; i++)
{
sort(arr[i], arr[i] + m);
}
while (1)
{
long long Max = 0;
long long Min = 9999999999;
int Min_idx = 0;
int Max_idx = 0;
for (int i = 0; i < n; i++)
{
if (arr[i][idx[i]] < Min)
{
Min = arr[i][idx[i]];
Min_idx = i;
}
if (arr[i][idx[i]] > Max)
{
Max = arr[i][idx[i]];
Max_idx = i;
}
}
// 최솟값끼리 비교해서
result = min(Max - Min, result);
idx[Min_idx]++;
if (idx[Min_idx] == m)
break;
}
cout << result;
return 0;
}