{"componentChunkName":"component---src-templates-blog-post-js","path":"/algorithm/이진-탐색-binary-search/","result":{"data":{"site":{"siteMetadata":{"title":"Bottlehs Tech Blog","description":"웹·앱·AI 개발자 전병훈(bottlehs)의 기술 블로그. AI·LLM, JavaScript·Vue, Spring Boot, 알고리즘, 블록체인 실무 가이드를 다룹니다","siteUrl":"https://www.bottlehs.dev","author":{"name":"Jeon Byung Hun","summary":"개발을 즐기는 bottlehs - Engineer, MS, AI, FE, BE, OS, IOT, Blockchain, 설계, 테스트"},"social":{"github":"bottlehs","codepen":"bottlehs"}}},"markdownRemark":{"id":"bc26bcd7-272b-55c2-bf75-9ce13b961965","excerpt":"이진 탐색 (Binary Search…","html":"<p><img src=\"/assets/algorithm.png\" alt=\"이진 탐색 (Binary Search)\" title=\"이진 탐색 (Binary Search)\"></p>\n<p>이진 탐색은 정렬이 전제되어야 하며, 중간값과의 비교를 반복하여 빠르게 목표를 찾는다.</p>\n<h2 id=\"정의\" style=\"position:relative;\"><a href=\"#%EC%A0%95%EC%9D%98\" aria-label=\"정의 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>정의</h2>\n<p>정렬된 배열에서 중간값을 기준으로, 찾는 값이 왼쪽에 있을지 오른쪽에 있을지를 판단해 탐색 구간을 절반으로 줄여 나간다. 한 번 비교할 때마다 가능한 후보의 수가 반으로 준다는 점이 핵심이다. 이 덕분에 선형 탐색보다 훨씬 빠른 O(log N) 시간 안에 값을 찾거나, 없다는 사실을 확실히 알 수 있다.</p>\n<h2 id=\"구현\" style=\"position:relative;\"><a href=\"#%EA%B5%AC%ED%98%84\" aria-label=\"구현 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>구현</h2>\n<p>두 포인터 <code class=\"language-text\">lo</code>와 <code class=\"language-text\">hi</code>로 현재 탐색 구간의 양 끝을 가리키고, 중간 인덱스 <code class=\"language-text\">mid=(lo+hi)>>1</code>에서 값을 확인한다. 목표가 더 크면 왼쪽 절반을 버리고 <code class=\"language-text\">lo=mid+1</code>, 더 작으면 오른쪽 절반을 버리고 <code class=\"language-text\">hi=mid-1</code>로 좁힌다. 값이 일치하면 인덱스를, 구간이 엇갈리면 존재하지 않으므로 -1을 반환한다.</p>\n<p>부동소수점 오차를 피하기 위해 중간 계산은 정수 덧셈·시프트로 처리하고, 중복 값이 있는 배열에서 “첫/마지막 인덱스”를 찾고 싶다면 등호(=)의 위치를 조정해 하한/상한 탐색(lower/upper bound) 형태로 바꾸면 된다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">function</span> <span class=\"token function\">binarySearch</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">arr<span class=\"token punctuation\">,</span> target</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> lo <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> hi <span class=\"token operator\">=</span> arr<span class=\"token punctuation\">.</span>length <span class=\"token operator\">-</span> <span class=\"token number\">1</span>\n  <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>lo <span class=\"token operator\">&lt;=</span> hi<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> mid <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>lo <span class=\"token operator\">+</span> hi<span class=\"token punctuation\">)</span> <span class=\"token operator\">>></span> <span class=\"token number\">1</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>arr<span class=\"token punctuation\">[</span>mid<span class=\"token punctuation\">]</span> <span class=\"token operator\">===</span> target<span class=\"token punctuation\">)</span> <span class=\"token keyword\">return</span> mid\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>arr<span class=\"token punctuation\">[</span>mid<span class=\"token punctuation\">]</span> <span class=\"token operator\">&lt;</span> target<span class=\"token punctuation\">)</span> lo <span class=\"token operator\">=</span> mid <span class=\"token operator\">+</span> <span class=\"token number\">1</span>\n    <span class=\"token keyword\">else</span> hi <span class=\"token operator\">=</span> mid <span class=\"token operator\">-</span> <span class=\"token number\">1</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">return</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// 예시 실행</span>\n<span class=\"token keyword\">const</span> a <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span> <span class=\"token number\">7</span><span class=\"token punctuation\">,</span> <span class=\"token number\">9</span><span class=\"token punctuation\">,</span> <span class=\"token number\">12</span><span class=\"token punctuation\">]</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">binarySearch</span><span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">,</span> <span class=\"token number\">7</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>  <span class=\"token comment\">// 3</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">binarySearch</span><span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">,</span> <span class=\"token number\">8</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>  <span class=\"token comment\">// -1</span></code></pre></div>\n<h2 id=\"데모\" style=\"position:relative;\"><a href=\"#%EB%8D%B0%EB%AA%A8\" aria-label=\"데모 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>데모</h2>\n<p><a href=\"https://codepen.io/pen/?template=yLgbWPj\">https://codepen.io/pen/?template=yLgbWPj</a></p>","tableOfContents":"<ul>\n<li><a href=\"/algorithm/%EC%9D%B4%EC%A7%84-%ED%83%90%EC%83%89-binary-search/#%EC%A0%95%EC%9D%98\">정의</a></li>\n<li><a href=\"/algorithm/%EC%9D%B4%EC%A7%84-%ED%83%90%EC%83%89-binary-search/#%EA%B5%AC%ED%98%84\">구현</a></li>\n<li><a href=\"/algorithm/%EC%9D%B4%EC%A7%84-%ED%83%90%EC%83%89-binary-search/#%EB%8D%B0%EB%AA%A8\">데모</a></li>\n</ul>","wordCount":{"words":136},"fields":{"slug":"/algorithm/이진-탐색-binary-search/","image":"/assets/algorithm.png","faq":[]},"frontmatter":{"title":"이진 탐색 (Binary Search)","date":"2025년 10월 30일","dateISO":"2025-10-30T00:00:00.000Z","updatedISO":null,"category":"algorithm","description":"정렬된 배열에서 중간값을 기준으로 탐색 범위를 절반으로 줄여가며 값을 찾는 알고리즘. 시간복잡도는 O(log N)이다.","tags":["이진 탐색","Binary Search","알고리즘","Algorithm","JavaScript"]}}},"pageContext":{"slug":"/algorithm/이진-탐색-binary-search/","previous":{"fields":{"slug":"/algorithm/최소-동전수-dp-coin-change/"},"frontmatter":{"title":"최소 동전 수 (Coin Change, DP)","tags":["동적 계획법","Dynamic Programming","Coin Change","알고리즘","Algorithm","JavaScript"]}},"next":{"fields":{"slug":"/algorithm/다익스트라-dijkstra/"},"frontmatter":{"title":"다익스트라 알고리즘 (Dijkstra)","tags":["다익스트라","Dijkstra","최단 경로","알고리즘","Algorithm","JavaScript"]}}}},"staticQueryHashes":["213619243","3262363727"]}