728x90
반응형
728x170
▶ MainForm.cs
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Windows.Forms;
namespace TestProject
{
/// <summary>
/// 메인 폼
/// </summary>
public partial class MainForm : Form
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - MainForm()
/// <summary>
/// 생성자
/// </summary>
public MainForm()
{
InitializeComponent();
#region 이벤트를 설정한다.
this.generateButton.Click += generateButton_Click;
#endregion
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Private
//////////////////////////////////////////////////////////////////////////////// Event
#region 생성 버튼 클릭시 처리하기 - generateButton_Click(sender, e)
/// <summary>
/// 생성 버튼 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void generateButton_Click(object sender, EventArgs e)
{
string[] itemArray = txtItems.Text.Split(' ');
int selectionCount = int.Parse(this.selectionCountTextBox.Text);
List<List<string>> resultList = GetCombinationList<string>(itemArray.ToList(), selectionCount);
this.combinationListBox.Items.Clear();
foreach(List<string> result in resultList)
{
this.combinationListBox.Items.Add(string.Join(" ", result.ToArray()));
}
decimal combinationCount = GetCombinationCount(itemArray.Length, selectionCount);
this.combinationCountTextBox.Text = combinationCount.ToString();
Debug.Assert(this.combinationListBox.Items.Count == combinationCount);
}
#endregion
//////////////////////////////////////////////////////////////////////////////// Function
#region 항목 선택하기 - SelectItem<T>(itemList, selectionArray, resultList, selectionCount, firstItemIndex)
/// <summary>
/// 항목 선택하기
/// </summary>
/// <typeparam name="T">항목 타입</typeparam>
/// <param name="itemList">항목 리스트</param>
/// <param name="selectionArray">선택 배열</param>
/// <param name="resultList">결과 리스트</param>
/// <param name="selectionCount">선택 카운트</param>
/// <param name="firstItemIndex">첫번째 항목 인덱스</param>
private void SelectItem<T>(List<T> itemList, bool[] selectionArray, List<List<T>> resultList, int selectionCount, int firstItemIndex)
{
if(selectionCount == 0)
{
List<T> selectionList = new List<T>();
for(int i = 0; i < itemList.Count; i++)
{
if(selectionArray[i])
{
selectionList.Add(itemList[i]);
}
}
resultList.Add(selectionList);
}
else
{
for(int i = firstItemIndex; i < itemList.Count; i++)
{
selectionArray[i] = true;
SelectItem(itemList, selectionArray, resultList, selectionCount - 1, i + 1);
selectionArray[i] = false;
}
}
}
#endregion
#region 조합 리스트 구하기 - GetCombinationList<T>(itemList, selectionCount)
/// <summary>
/// 조합 리스트 구하기
/// </summary>
/// <typeparam name="T">항목 타입</typeparam>
/// <param name="itemList">항목 리스트</param>
/// <param name="selectionCount">선택 카운트</param>
/// <returns>조합 리스트</returns>
private List<List<T>> GetCombinationList<T>(List<T> itemList, int selectionCount)
{
bool[] selectionArray = new bool[itemList.Count];
List<List<T>> resultList = new List<List<T>>();
SelectItem<T>(itemList, selectionArray, resultList, selectionCount, 0);
return resultList;
}
#endregion
#region 조합 카운트 구하기 - GetCombinationCount(itemCount, selectionCount)
/// <summary>
/// 조합 카운트 구하기
/// </summary>
/// <param name="itemCount">항목 카운트</param>
/// <param name="selectionCount">선택 카운트</param>
/// <returns>조합 카운트</returns>
private decimal GetCombinationCount(decimal itemCount, decimal selectionCount)
{
Debug.Assert(itemCount >= 0);
Debug.Assert(selectionCount >= 0);
Debug.Assert(itemCount >= selectionCount);
decimal result = 1;
for(int i = 1; i <= selectionCount; i++)
{
result *= itemCount - (selectionCount - i);
result /= i;
}
return result;
}
#endregion
}
}
728x90
반응형
그리드형(광고전용)
'C# > Common' 카테고리의 다른 글
[C#/COMMON] TimeZoneInfo 클래스 : GetSystemTimeZones 정적 메소드를 사용해 표준 시간대 나열하기 (0) | 2018.12.08 |
---|---|
[C#/COMMON] 스레드 안전 우선 순위 큐 사용하기 (0) | 2018.12.07 |
[C#/COMMON] 스레드 안전 리스트/리스트 큐 사용하기 (0) | 2018.12.06 |
[C#/COMMON] 경로 결합하기 (0) | 2018.12.05 |
[C#/COMMON] 최대 공약수(GCD)/최소 공배수(LCM) 구하기 (0) | 2018.12.05 |
[C#/COMMON] 순열(Permutation) 구하기 (0) | 2018.12.04 |
[C#/COMMON] Thread 클래스 : 반복 작업자 사용하기 (0) | 2018.12.04 |
[C#/COMMON] WMI를 사용해 운영 체제 정보 구하기 (0) | 2018.12.03 |
[C#/COMMON] WMI를 이용해 프린터 정보 구하기 (0) | 2018.12.02 |
[C#/COMMON] 수식 평가하기 (0) | 2018.12.02 |
댓글을 달아 주세요