알고리즘 - 12. 그룹(Group)
.NET프로그래밍/C# 3.5 SP1 2009. 8. 18. 16:41 |using System;
using System.Collections.Generic;
using System.Collections;
public class ProductInfo
{
public string Name { get; set; } // 상품명
public int Quantity { get; set; } // 판매량
public ProductInfo()
{
// Empty
}
public ProductInfo(string name, int quantity)
{
this.Name = name; this.Quantity = quantity;
}
}
public class 그룹 {
public static void Main() {
//[1] Input
List<ProductInfo> lst = new List<ProductInfo>(); // 입력데이터
List<ProductInfo> result = new List<ProductInfo>(); // 출력데이터
#region 콘솔로부터 데이터입력
//ProductInfo pi; string[] temp; string btn = "n";
//do
//{
// Console.Write("데이터 입력 : ");
// temp = Console.ReadLine().Trim().Split(' ');
// pi = new ProductInfo();
// pi.Name = temp[0].Trim().ToUpper();
// pi.Quantity = Convert.ToInt32(temp[1]);
// lst.Add(pi); // 컬렉션에 추가
// Console.Write("입력(y), 종료(n) : ");
// btn = Console.ReadLine().ToLower(); // 소문자로 y, n
//} while (btn == "y");
#endregion
#region 기본값으로 초기화
lst.Add(new ProductInfo("RADIO", 3));
lst.Add(new ProductInfo("TV", 1));
lst.Add(new ProductInfo("RADIO", 2));
lst.Add(new ProductInfo("DVD", 4));
#endregion
//[2] Process
//[A] 원본
for (int i = 0; i < lst.Count; i++) {
Console.WriteLine("{0} {1}", lst[i].Name, lst[i].Quantity);
}
//[B] 정렬
ProductInfo imsi = new ProductInfo();
for (int i = 0; i < lst.Count - 1; i++) {
for (int j = i + 1; j < lst.Count; j++) {
if ( String.Compare(lst[i].Name, lst[j].Name) > 0 ) {
imsi = lst[i]; lst[i] = lst[j]; lst[j] = imsi;
}
}
}
for (int i = 0; i < lst.Count; i++) {
Console.WriteLine("{0} {1}", lst[i].Name, lst[i].Quantity);
}
//[C] 그룹
#region 마지막레코드를 입력 후 계산
//int subTotal = 0; // 소계
//ProductInfo final = new ProductInfo();
//final.Name = ""; final.Quantity = 0;
//lst.Add(final); // 마지막 레코드용 빈값
//for (int i = 0; i < lst.Count - 1; i++) // 마지막 레코드(빈) 전까지
//{
// subTotal += lst[i].Quantity;
// if (String.Compare(lst[i].Name, lst[i + 1].Name) != 0) // 다르다면
// {
// if (lst[i].Name.Trim() != "") // 마지막 데이터가 아닐때까지
// {
// ProductInfo rlt = new ProductInfo();
// rlt.Name = lst[i].Name;
// rlt.Quantity = subTotal; // 현재까지 소계
// result.Add(rlt); // 한개 그룹 저장
// subTotal = 0;
// }
// }
//}
#endregion
int subTotal = 0; // 소계
for (int i = 0; i < lst.Count; i++)
{
subTotal += lst[i].Quantity;
if ((i + 1) == lst.Count || // 단락(short circuiting)
String.Compare(lst[i].Name, lst[i + 1].Name) != 0)
{
ProductInfo rlt = new ProductInfo();
rlt.Name = lst[i].Name;
rlt.Quantity = subTotal; // 현재까지 소계
result.Add(rlt); // 한개 그룹 저장
subTotal = 0;
}
}
//[3] Output
Console.WriteLine("그룹화된 자료 출력");
for (int i = 0; i < result.Count; i++) {
Console.WriteLine("{0} {1}", result[i].Name, result[i].Quantity);
}
}
}
// 원본 데이터가 아래와 같이 들어온다면???
// 이 데이터를 상품명으로 그룹화하자
// RADIO 5 DVD 5
// TV 6 --> PHONE 5
// PHONE 3 RADIO 7
// RADIO 2 TV 16
// PHONE 2
// TV 10
// DVD 5
'.NET프로그래밍 > C# 3.5 SP1' 카테고리의 다른 글
(테스트) 학점 계산 프로그램 (0) | 2009.08.19 |
---|---|
79. 초기화자(Initializer) (0) | 2009.08.18 |
78. 특성(Attribute) (0) | 2009.08.18 |
77. 형식매개변수에 대한 제약조건 (0) | 2009.08.18 |
76. 제네릭클래스 (0) | 2009.08.18 |