첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
본 블로그는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 블로그 콘텐츠 향상을 위해 쓰여집니다.

728x90
반응형
728x170
using System;

/// <summary>
/// 정수 범위
/// </summary>
public class IntegerRange
{
    //////////////////////////////////////////////////////////////////////////////////////////////////// Field
    ////////////////////////////////////////////////////////////////////////////////////////// Private

    #region Field

    /// <summary>
    /// 최소 값
    /// </summary>
    private int minimum;

    /// <summary>
    /// 최대 값
    /// </summary>
    private int maximum;

    #endregion

    //////////////////////////////////////////////////////////////////////////////////////////////////// Property
    ////////////////////////////////////////////////////////////////////////////////////////// Public

    #region 최소 값 - Minimum

    /// <summary>
    /// 최소 값
    /// </summary>
    public int Minimum
    {
        get
        {
            return this.minimum;
        }
        set
        {
            this.minimum = value;
        }
    }

    #endregion

    #region 최대 값 - Maximum

    /// <summary>
    /// 최대 값
    /// </summary>
    public int Maximum
    {
        get
        {
            return this.maximum;
        }
        set
        {
            this.maximum = value;
        }
    }

    #endregion

    #region 길이 - Length

    /// <summary>
    /// 길이
    /// </summary>
    public int Length
    {
        get
        {
            return this.maximum - this.minimum;
            }
    }

    #endregion

    //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
    ////////////////////////////////////////////////////////////////////////////////////////// Public

    #region 생성자 - IntegerRange(minimum, maximum)

    /// <summary>
    /// 생성자
    /// </summary>
    /// <param name="minimum">최소 값</param>
    /// <param name="maximum">최대 값</param>
    public IntegerRange(int minimum, int maximum)
    {
        this.minimum = minimum;
        this.maximum = maximum;
    }

    #endregion

    ////////////////////////////////////////////////////////////////////////////////////////// Private

    #region 생성자 - IntegerRange()

    /// <summary>
    /// 생성자
    /// </summary>
    private IntegerRange()
    {
    }

    #endregion

    //////////////////////////////////////////////////////////////////////////////////////////////////// Method
    ////////////////////////////////////////////////////////////////////////////////////////// Public

    #region 포함 여부 조사하기 - IsInside(x)

    /// <summary>
    /// 포함 여부 조사하기
    /// </summary>
    /// <param name="x">X</param>
    /// <returns>포함 여부 조사 결과</returns>
    public bool IsInside(int x)
    {
        return (x >= this.minimum) && (x <= this.maximum);
    }

    #endregion

    #region 포함 여부 조사하기 - IsInside(integerRange)

    /// <summary>
    /// 포함 여부 조사하기
    /// </summary>
    /// <param name="integerRange">범위</param>
    /// <returns>포함 여부 조사 결과</returns>
    public bool IsInside(IntegerRange integerRange)
    {
        return (IsInside(integerRange.Minimum)) && (IsInside(integerRange.Maximum));
    }

    #endregion

    #region 중첩 여부 조사하기 - IsOverlapping(integerRange)

    /// <summary>
    /// 중첩 여부 조사하기
    /// </summary>
    /// <param name="integerRange">범위</param>
    /// <returns>중첩 여부 조사 결과</returns>
    public bool IsOverlapping(IntegerRange integerRange)
    {
        return (IsInside(integerRange.Minimum)) || (IsInside(integerRange.Maximum));
    }

    #endregion
}


#region 범위 구하기 - GetRange(valueArray, percent)

/// <summary>
/// 범위 구하기
/// </summary>
/// <param name="valueArray">값 배열</param>
/// <param name="percent">퍼센트</param>
/// <returns>범위</returns>
public IntegerRange GetRange(int[] valueArray, double percent)
{
    int total  = 0;
    int length = valueArray.Length;

    for(int i = 0; i < length; i++)
    {
        total += valueArray[i];
    }

    int minimum;
    int maximum;
    int hitCount;
    int upperCount = (int)(total * (percent + (1d - percent) / 2d));

    for(minimum = 0, hitCount = total; minimum < length; minimum++)
    {
        hitCount -= valueArray[minimum];

        if(hitCount < upperCount)
        {
            break;
        }
    }

    for(maximum = length - 1, hitCount = total; maximum >= 0; maximum--)
    {
        hitCount -= valueArray[maximum];

        if(hitCount < upperCount)
        {
            break;
        }
    }

    return new IntegerRange(minimum, maximum);
}

#endregion
728x90
반응형
그리드형
Posted by 사용자 icodebroker
TAG , ,

댓글을 달아 주세요