[투포인터] 2461 대표 선수 C++

Seunghyeon·2023년 5월 27일
0

백준 문제 푼다.

목록 보기
19/21

골드 2 문제라 살짝 겁먹고 들어갔는데

투포인터에 익숙하지 않아서(?) 오히려 잘 풀렸던 것 같기도 하다.

생각보다 간단하다.

(컴파일 에러는 배열을 int index[1001] 로 사용했는데 index가 이미 백준 컴파일러에 정의가 되어있다나... 그래서 오류가 난 듯 하다)

풀이

  1. 학생들의 능력치를 반별로 sort 해준다.(오름차순 정렬)
  2. 각 반에서 능력치가 가장 작은 친구들끼리 비교해서 가장 큰놈과 가장 작은놈을 찾아내고
  3. 그 둘을 비교해서 차이를 result에 저장한다.
  4. 그 후 (가장 작은놈이 속한 반)에서 그 다음으로 큰놈을 다음 비교 대상으로 세운다.

반복 하면서

한 반에서 제일 큰놈이 전체 비교중 가장 작다면 그다음에 종료 (이보다 작은 차이를 만들 수 없음)

여기서 중요한점은 각 반별로 인덱스(포인터)를 지정해줘야 한다 출발과 끝 두가지만 있다면 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;
}
profile
그냥 합니다.

0개의 댓글