n>=1개의 서로 다른 정수가 이미 정렬되어 배열 a[0], …, a[n-1]에 저장되어 있다. x=a[j]인 x가 존재하면 j를 반환하고, 그렇지 않으면 -1을 반환한다.

이 집합이 정렬되어 있다는 사실을 이용해서 효율적인 다음 방법을 생각할 수 있다.

 

 left, right는 탐색하고자 하는 배열의 왼쪽, 오른쪽 끝지점을 가리킨다. 초기값으로 left=0, right=n-1로 하고 리스트의 중간 위치 middle=(left+right)/2로 설정한다.

a[middle]과  x를 비교할 경우 다음 세 가지의 경우 중에서 하나를 고려할 수 있다.

 

 (1) x<a[middle] : 이 경우 x가 존재한다면 그것은 0과 middle-1 사이에 있으므로 right는 middle-1로 설정한다.

 (2) x==a[middle] : 이 경우는 middle을 반환한다.

 (3) x>a[middle] : 이 경우 x가 존재한다면 middle+1과 n-1사이에 있으므로 left를 middle+1로 설정한다.

 

 x가 발견되지 않고 검사할 정수도 아직 남아 있다면 middle을 다시 계산하고 탐색을 계속한다. 알고리즘은 두 작업을 한다.

 

 (1) 검사할 정수가 아직 남아 있는지 결정하고

 (2) x를 a[middle]과 비교한다.

 

 

C# 코드

namespace 이진탐색
{
    class Program
    {

        static void Main(string[] args)
        {
            //이미 정렬되어있는 int 배열
              int[] datas = new int[] { 1,2,3,5,12,13,31,53,56};

            int result = BinarySearch(datas, 1);

            View(result);

            Console.ReadKey();
        }

        /// <summary>
        /// 이진 탐색을 수행한다.
        /// </summary>
        /// <param name="datas">배열</param>
        /// <param name="data">검색할 데이터</param>
        /// <returns></returns>
        private static int BinarySearch(int[] datas,int data)
        {
            int right = datas.Length - 1;
            for (int left = 0; left <= right; )
            {
                int middle = (left + right) / 2;
                switch (Compare(data, datas[middle]))
                {
                    case '>': left = middle + 1; break;//x>datas[middle] 
                    case '<': right = middle - 1; break;//x<datas[middle]
                    case '=': return middle; //x==datas[middle]
                }
               
            }
            //발견되지 않음
            return -1;
        }

        /// <summary>
        /// x와 y를 비교한다.
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        private static char Compare(int x, int y)
        {
            if (x > y)
                return '>';
            else if (x < y)
                return '<';
            else 
                return '=';
        }

        

        /// <summary>
        /// 화면에 출력한다.
        /// </summary>
        /// <param name="result"></param>
        private static void View(int result)
        {
            Console.Write("{0} ", result);
        }
    }
}

 

 

 

 

이진탐색.zip

참고 : C++ 자료구조론 - 이석호


 

'.Net > Algorithm' 카테고리의 다른 글

C# 순열  (2) 2012.10.10
C# 선택정렬  (1) 2012.10.10
            for (int i = 0; i < n; i++)
            {
                //a[i]에서부터 a[n-1]까지의 정수 값을 검사한 결과 a[j]가 가장 작은 값이라고 하자;
                //a[i]와 a[j]를 서로교환;
            }

 

위의 코드를 완전한  C# 프로그램으로 변환하기 위해서는 두 가지 작업이 필요하다. 즉, 최소 정수를 찾는 작업과 이 최소 정수 값을 a[i]값과 교환하는 작업이다.

두번째 작업을 처리하기 위해서는 다음 코드를 사용한다.

 

temp=a[i]; a[i] = a[j]; a[j] = temp;

 

첫번째 작업에서는 먼저 최소값이 a[i]라 가정하고, a[i]를 a[i+1], a[i+2], …와 비교하여 작은 값이 나타날 때마다 그 값을 새로운 최소값으로 간주한다.

마지막으로 a[n-1]을 현재의 최소값과 비교하면 종료된다. 이런 과정을 모두 종합하면 함수 SelectSort를 얻는다.

 

C# 코드

namespace 선택정렬
{
    class Program
    {

        static void Main(string[] args)
        {
            int[] datas = new int[] { 32,12,51,2,13,12,53,10,2,3 };

            int[] result = SelectSort(datas);

            View(result);

            Console.ReadKey();
        }

        /// <summary>
        /// 선택정렬을 수행한다.
        /// </summary>
        /// <param name="datas"></param>
        /// <returns></returns>
        private static int[] SelectSort(int[] datas)
        {
            for (int i = 0; i < datas.Length; i++)
            {
                for (int j = i+1; j < datas.Length; j++)
                {
                    if (datas[i] > datas[j])
                    {
                        int temp = datas[j];
                        datas[j] = datas[i];
                        datas[i] = temp;
                    }
                }
            }
            return datas;
        }

        /// <summary>
        /// 화면에 출력한다.
        /// </summary>
        /// <param name="result"></param>
        private static void View(int[] result)
        {
            foreach (var data in result)
            {
                Console.Write("{0} ", data);
            }
        }
    }
}


 

선택정렬.zip

 

 

참고 : C++ 자료구조론 - 이석호

'.Net > Algorithm' 카테고리의 다른 글

C# 순열  (2) 2012.10.10
C# 이진탐색  (0) 2012.10.10

Clng, Cint, Csng, Cstr, Cdbl 함수를 이용하여 캐스팅

 

Clng : long

Cint : int

Csng : float

Cstr : string

Cdbl : double

 

//Code를 문자열로 캐스팅

select Cstr(Code) from somthing

'기타 프로그래밍 > Query' 카테고리의 다른 글

[MSSQL] 컬럼 변경시 경고 메세지  (0) 2013.03.13
[MSSQL] 자동 증가값 초기화하기  (0) 2013.03.11

 

 

 

    public partial class TestCheckBoxInGridView : Form
    {
        public TestCheckBoxInGridView()
        {
            InitializeComponent();
        }

        private void TestCheckBoxInGridView_Load(object sender, EventArgs e)
        {
            this.dataGridView.Rows.Add(false, "test1");
            this.dataGridView.Rows.Add(false, "test2");
        }

        private void button_check_Click(object sender, EventArgs e)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("체크된 항목 : \r\n");
            for(int i=0;i<this.dataGridView.Rows.Count;i++)
            {
                DataGridViewRow dr =  this.dataGridView.Rows[i];
                bool state = (bool)dr.Cells[0].Value;
                if (state == true)
                {
                    sb.AppendLine(dr.Cells[1].Value.ToString());
                }
            }
            MessageBox.Show(sb.ToString());
        }

        
    }


 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
ㅜ[
  

 

 

유니코드 = (44032+ 초성)* (588+ 중성) * (28+종성);

 

 

 

유니코드표.txt

 

 

 

 

    public partial class TransparentPanel : System.Windows.Forms.Panel
    {
        public TransparentPanel()
        {

        }

        public TransparentPanel(IContainer container)
        {
            container.Add(this);
        }

        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= 0x20;
                return cp;
            }
        }

        protected override void OnPaintBackground(PaintEventArgs e) { }

    }

 

JavaScript의 메서드를 호출 하는 것은 지난번에 포스팅하였다.

http://ehdrn.tistory.com/197

 

이번에는 JavaScript에서 이벤트가 발생하였을 때

CallBack 받는 부분을 작성하려고 한다.

 

 

Class Atttribute 아래의 코드 작성과

[System.Runtime.InteropServices.ComVisibleAttribute(true)]

 


CallBack 받을 메서드 Attribute에 아래의 코드를 작성 해주면된다.

[System.Runtime.InteropServices.DispId(0)]

 

 

C# 호출 부분

인스턴스를 넘겨주어야한다.

 

this.Document.InvokeScript("CreateSimpleTextMarker", new object[] { marker.LatLng.Lat, marker.LatLng.Lng, marker.Content, cssText, marker.MarkerDrawEvent });


 

 

 

C# Class

 

    /// <summary>
    /// Marker의 Draw Event를 받기 위한 Class
    /// </summary>
    [System.Runtime.InteropServices.ComVisibleAttribute(true)]
    public class MarkerDrawEvent
    {
        /// <summary>
        /// Marker Draw Delegate
        /// </summary>
        /// <param name="point"></param>
        public delegate void MarkerDrawEventHandler(Point point);

        /// <summary>
        /// Marker Click EventHandler
        /// </summary>
        public event MarkerDrawEventHandler MarkerDraw;


        /// <summary>
        /// 자바스크립트 코드에서 CallBack 받기위한 메서드
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        
        [System.Runtime.InteropServices.DispId(0)]
        public void MarkerDrawRaised(string _point)
        {
            string []xy = _point.Split(new char[] { ',','(',')' }, StringSplitOptions.RemoveEmptyEntries);
            string x = xy[0];
            string y = xy[1];
            if (MarkerDraw != null)
            {
                MarkerDraw(new Point(Convert.ToInt32(x),Convert.ToInt32(y)));
            }
        }
    }


 

JavaScript

    //간단한 텍스트 마커를 생성합니다.
    function CreateSimpleTextMarker( lat, lng, content, cssText, markerDrawEventHandler) {

 

......생략.....

 

SimpleTextMarker.prototype.draw = function () { var projection = this.getProjection(); self.m_projection = projection; var point = projection.pointFromCoords(this.position_); var width = this.node_.offsetWidth; var height = this.node_.offsetHeight; this.node_.style.cssText = cssText + 'position: absolute; white-space: nowrap; left: ' + (point.x - width / 2) + 'px; top: ' + (point.y - height / 2) + 'px'; if (markerDrawEventHandler != null) { markerDrawEventHandler(point.toString()); } }; ......생략.....

 

}


 

 

WebBrowser 컨트롤의 Document 개체를 이용해서

JavaScript의 GetPoint function을 호출하고 문자열을 리턴받기

 

 

C#

string value = (string)this.Document.InvokeScript("GetPoint", new object[] { latLng.Lat, latLng.Lng }).ToString();


 

 

JavaScript

    //해당 위도경도에 해당하는 Point를 가져온다.
    function GetPoint(lat, lng) {
        var point = m_projection.pointFromCoords(new daum.maps.LatLng(lat, lng));
        return point.toString();
    }


 

WebBrowser 컨트롤을 이용하여 윈폼에서

Daum Map API를 사용하는 예제입니다.

 

웹이 아닌 CS상에서 구현하기 위하여

테스트 중에 있습니다.

 

다음의 지도 API 시작하기의 Hello World를 따라하였습니다.

http://dna.daum.net/apis/maps/intro#toc-hello-world

 

아래의 소스와 같습니다.

 

 Test를 위해

Debug파일에 daumMapAPI.html 이름으로 작성하였습니다.

<!DOCTYPE html>
<html>
<head>
<title>Hello, World!</title>
<meta name="viewport" content="initial-scale=1.0,user-scalable=no">
<style type="text/css">
html { height: 100% }
body { height: 100%; margin: 0; padding: 0 }
#map { width: 100%; height: 100% }
</style>
<script type="text/javascript" src="http://apis.daum.net/maps/maps3.js?apikey=APIKEY를 넣어주세요"></script>
<script type="text/javascript">
 window.onload = function() {
 var position = new daum.maps.LatLng(37.537123, 127.005523);

 var map = new daum.maps.Map(document.getElementById('map'), {
  center: position,
  level: 4,
  mapTypeId: daum.maps.MapTypeId.HYBRID
 });

 var marker = new daum.maps.Marker({
  position: position
 });
 marker.setMap(map);

 var infowindow = new daum.maps.InfoWindow({
  content: 'Hello, World!'
 });
 infowindow.open(map, marker);
 };
</script>
</head>
<body>
<div id="map"></div>
</body>
</html> 

 

 

 

cs상에서 간단하게

WebBrowser 개체의 Navigate 메서드를 호출해주시면 됩니다.

 

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                string url = Environment.CurrentDirectory + "\\daumMapAPI.html";
                this.webBrowser.Navigate(url);
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }


 

 

 

[ 이미지 1] 결과화면

 

 

 

아고...웹을 하나도 몰라 몇시간 삽질했네요.....ㅡㅜ

웹 공부도 해야하는데 흑흑...

 

다음 글에서는 CS에서 자바스크립트

호출하는 부분에 대해 작성할 것 같습니다~

+ Recent posts