n개의 요소를 가진 배열 A가 있다고 가정해 보겠습니다. A[i]는 i번째 학생의 프로그래밍 실력을 나타내며, 배열의 모든 요소는 서로 다릅니다. 우리는 이 학생들을 다음 조건에 맞게 팀으로 나누려고 합니다.
- |A[i] - A[j]| = 1인 두 학생 i와 j가 같은 팀에 속하지 않도록 합니다.
- 팀의 수는 가능한 한 최소여야 합니다.
예를 들어 입력이 A = [2, 3, 4, 99, 100]이라면 출력은 2가 됩니다. 그룹이 [2, 3, 4]와 [99, 100]으로 나뉘기 때문입니다.
풀이 접근 방식
이 문제를 해결하기 위해 다음 단계를 따릅니다.
핵심 아이디어는 간단합니다. 배열을 오름차순으로 정렬한 뒤, 인접한 두 요소의 차이가 정확히 1인 경우가 하나라도 존재하면 최소 2개의 팀이 필요합니다. 그렇지 않다면 실력 차이가 1인 학생 쌍이 없으므로 모든 학생을 한 팀으로 묶을 수 있습니다.
dem := 1
배열 A를 정렬합니다
i := 1부터 A의 크기보다 작을 때까지 반복합니다:
만약 A[i] - A[i - 1]이 1과 같다면:
dem := 2
dem을 반환합니다예제 코드
아래의 C++ 구현을 살펴보면 더 잘 이해할 수 있습니다.
#include <bits/stdc++.h>
using namespace std;
int solve(vector<int> A) {
int dem = 1;
sort(A.begin(), A.end());
for (int i = 1; i < A.size(); i++)
if (A[i] - A[i - 1] == 1)
dem = 2;
return dem;
}
int main() {
vector<int> A = { 2, 3, 4, 99, 100 };
cout << solve(A) << endl;
}입력
{ 2, 3, 4, 99, 100 }출력
2