첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
유용한 소스 코드가 있으면 icodebroker@naver.com으로 보내주시면 감사합니다.
블로그 자료는 자유롭게 사용하세요.

■ 범위 구하기

------------------------------------------------------------------------------------------------------------------------

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

------------------------------------------------------------------------------------------------------------------------

Posted by 사용자 icodebroker
TAG

댓글을 달아 주세요