반응형

1. IComparer, IComparable 인터페이스
: 개체의 값을 비교하기 위한 인터페이스.
.NET 프레임워크에서 제공하는 객체의 선후 관계를 정의하는 인터페이스입니다.
2. IComparer, IComparable의 차이점
: 둘 다 개체의 값을 비교하는 인터페이스인데요, 사용 방법은 거의 비슷한데 차이점을 둔다면, IComparable은 현재의 개체를 같은 타입의 다른 개체와 비교(같은 타입끼리 비교)한다면 IComparer는 두 개의 서로 다른 개체를 비교(제 3자와 비교하는 것)한다는 것입니다.
3. IComparable
IComparable 인터페이스에는 CompareTo()라는 메서드만 정의되어 있습니다.
CompareTo() 메서드를 정의해두면, Array.Sort()메서드를 사용했을 때 CompareTo를 사용해 정렬해줍니다.
* CompareTo() : 현재의 객체가 대상 객체보다 작으면 0보다 작은 값을, 같으면 0을, 크면 0보다 큰 값을 반환.
using System;
public class GreedyAlgorithm : IComparable
{
int weight, value;
public GreedyAlgorithm(int weight, int value)
{
this.weight = weight;
this.value = value;
}
void Start()
{
//부분 배낭 문제
// 무게 제한이 k인 배낭에 최대 가치를 가지도록 물건을 넣는 문제
//풀이 방법 : 무게 당 가치가 높은 물건 먼저 가방에 넣음
GreedyAlgorithm[] objectArray = new GreedyAlgorithm[5];
objectArray[0] = new GreedyAlgorithm(10, 10);
objectArray[1] = new GreedyAlgorithm(30, 5);
objectArray[2] = new GreedyAlgorithm(25, 8);
objectArray[3] = new GreedyAlgorithm(20, 10);
objectArray[4] = new GreedyAlgorithm(15, 12);
sortObjects(50, objectArray);
}
public int CompareTo(object obj) //IComparable 메서드
{
GreedyAlgorithm nowObj = obj as GreedyAlgorithm;
if (nowObj.weight == 0) Debug.Log("개체x");
return (weight / value).CompareTo(nowObj.weight / nowObj.value);
}
public void sortObjects(int totalWeight, GreedyAlgorithm[] objectArray)
{
Array.Sort(objectArray); //CompareTo 메서드를 이용해 정렬
int totalValue = 0;
int nowWeight = totalWeight;
for (int i = 0; i < objectArray.Length; i++)
{
if(totalWeight > objectArray[i].weight)
{
totalWeight -= objectArray[i].weight;
totalValue += objectArray[i].value;
}
}
}
}
4. IComparer
위의 코드와 비교했을 때, CompareTo 메서드 대신 Compare 메서드를 썼다는 차이점이 있습니다.
public class GreedyAlgorithm : IComparer
{
int weight, value;
public GreedyAlgorithm(int weight, int value)
{
this.weight = weight;
this.value = value;
}
void Start()
{
//부분 배낭 문제
// 무게 제한이 k인 배낭에 최대 가치를 가지도록 물건을 넣는 문제
//풀이 방법 : 무게 당 가치가 높은 물건 먼저 가방에 넣음
GreedyAlgorithm[] objectArray = new GreedyAlgorithm[5];
objectArray[0] = new GreedyAlgorithm(10, 10);
objectArray[1] = new GreedyAlgorithm(30, 5);
objectArray[2] = new GreedyAlgorithm(25, 8);
objectArray[3] = new GreedyAlgorithm(20, 10);
objectArray[4] = new GreedyAlgorithm(15, 12);
sortObjects(50, objectArray);
}
// 양수값이 리턴되면 x가 앞으로 오고,
// 음수값이 리턴되면 y가 앞으로 오면서 정렬
public int Compare(object x, object y)
{
GreedyAlgorithm _x = x as GreedyAlgorithm;
GreedyAlgorithm _y = y as GreedyAlgorithm;
return (_x.weight /_x.value) - (_y.weight / _y.value); //오름차순
return (_y.weight / _y.value) - (_x.weight / _x.value); //내림차순
}
public void sortObjects(int totalWeight, GreedyAlgorithm[] objectArray)
{
Array.Sort(objectArray); //CompareTo 메서드를 이용해 정렬
int totalValue = 0;
int nowWeight = totalWeight;
for (int i = 0; i < objectArray.Length; i++)
{
if(totalWeight > objectArray[i].weight)
{
totalWeight -= objectArray[i].weight;
totalValue += objectArray[i].value;
}
}
}
}
반응형
'[Unity] > [Unity]' 카테고리의 다른 글
[Unity] UI터치와 게임 화면 터치 분리해주는 방법 (0) | 2022.03.19 |
---|---|
[Unity] Button onClick 이벤트 연결 방법(feat. AddListener()) (0) | 2022.02.13 |
[Unity] 유니티 빌드 버전 관리하는 법 (0) | 2021.12.19 |
[Unity] Shader(셰이더)와 Rendering Pipeline(렌더링 파이프라인) (0) | 2021.12.16 |
[Unity] 웹사이트 URL 연결하는 법(feat. Application.OpenURL) (1) | 2021.10.03 |