{
    "componentChunkName": "component---src-templates-blog-template-js",
    "path": "/db-basic-sql-queries/",
    "result": {"data":{"cur":{"id":"9b9f488f-897b-5b25-9a02-60a6b4dc4571","html":"<h2 id=\"-기본-검색-query\" style=\"position:relative;\"><a href=\"#-%EA%B8%B0%EB%B3%B8-%EA%B2%80%EC%83%89-query\" aria-label=\" 기본 검색 query permalink\" class=\"anchor 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>🔍 기본 검색 Query</h2>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token keyword\">SELECT</span>      <span class=\"token operator\">&lt;</span>attribute list<span class=\"token operator\">></span>\n<span class=\"token keyword\">FROM</span>        <span class=\"token operator\">&lt;</span>relation list<span class=\"token operator\">></span>\n<span class=\"token punctuation\">[</span> <span class=\"token keyword\">WHERE</span>     <span class=\"token operator\">&lt;</span>condition<span class=\"token operator\">></span> <span class=\"token punctuation\">]</span>\n<span class=\"token comment\">-- for aggregates</span>\n<span class=\"token punctuation\">[</span> <span class=\"token keyword\">GROUP</span> <span class=\"token keyword\">BY</span>  <span class=\"token operator\">&lt;</span>attribute list<span class=\"token operator\">></span> <span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">[</span> <span class=\"token keyword\">HAVING</span>    <span class=\"token operator\">&lt;</span>condition<span class=\"token operator\">></span> <span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">[</span> <span class=\"token keyword\">ORDER</span> <span class=\"token keyword\">BY</span>  <span class=\"token operator\">&lt;</span>attribute list<span class=\"token operator\">></span> <span class=\"token punctuation\">[</span><span class=\"token keyword\">DESC</span><span class=\"token punctuation\">]</span> <span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"select-문\" style=\"position:relative;\"><a href=\"#select-%EB%AC%B8\" aria-label=\"select 문 permalink\" class=\"anchor 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>SELECT 문</h3>\n<p>데이터베이스에서 정보 <strong>검색</strong>을 하는데 가장 기본이 되는 구문으로, <code class=\"language-text\">SELECT-FROM-WHERE</code> 형태가 기본적인 형태다.</p>\n<blockquote>\n<p><strong>relational algebra</strong>에서 <strong>selection</strong>과는 다름</p>\n</blockquote>\n<p>ex)</p>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token keyword\">SELECT</span> Name\n<span class=\"token keyword\">FROM</span> Employee\n<span class=\"token keyword\">WHERE</span> Age <span class=\"token operator\">>=</span> <span class=\"token number\">20</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"aliasing--renaming\" style=\"position:relative;\"><a href=\"#aliasing--renaming\" aria-label=\"aliasing  renaming permalink\" class=\"anchor 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>Aliasing / Renaming</h3>\n<p>두 개 이상의 attribute들이 서로 이름이 같은 경우에는 다음과 같이 이름을 바꾸거나 명시해 표현할 수 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token keyword\">SELECT</span> E<span class=\"token punctuation\">.</span>Fname<span class=\"token punctuation\">,</span> E<span class=\"token punctuation\">.</span>Lname<span class=\"token punctuation\">,</span> S<span class=\"token punctuation\">.</span>Fname<span class=\"token punctuation\">,</span> S<span class=\"token punctuation\">.</span>Lname\n<span class=\"token keyword\">FROM</span> EMPLOYEE <span class=\"token punctuation\">(</span><span class=\"token keyword\">AS</span><span class=\"token punctuation\">)</span> E<span class=\"token punctuation\">,</span> EMPLOYEE <span class=\"token punctuation\">(</span><span class=\"token keyword\">AS</span><span class=\"token punctuation\">)</span> S\n<span class=\"token keyword\">WHERE</span> E<span class=\"token punctuation\">.</span>Super_ssn <span class=\"token operator\">=</span> S<span class=\"token punctuation\">.</span>ssn<span class=\"token punctuation\">;</span></code></pre></div>\n<blockquote>\n<p>SQL 질의는 데이터를 검색할 때, <strong>“어떻게”</strong> 가 아닌 <strong>“어떤”</strong> 데이터를 검색하기 원하는지 기술하기 때문에 <strong>비절차적(non-procedural)</strong> 이고, <strong>선언적(declarative)</strong> 이다.</p>\n</blockquote>\n<hr>\n<h2 id=\"-sql-집합-연산자\" style=\"position:relative;\"><a href=\"#-sql-%EC%A7%91%ED%95%A9-%EC%97%B0%EC%82%B0%EC%9E%90\" aria-label=\" sql 집합 연산자 permalink\" class=\"anchor 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>📦 SQL 집합 연산자</h2>\n<p><strong>SQL은 중복된 튜플을 제거하지 않는다.</strong></p>\n<ol>\n<li>중복 제거는 비용이 많이 든다.</li>\n<li>사용자가 쿼리 결과에서 중복 튜플을 보기 원할 수도 있다.</li>\n<li>집계 함수(sum, avg, max, distinct, …)를 사용할 때 대부분 중복 제거를 원하지 않는다.</li>\n</ol>\n<p>중복 제거를 원한다면 다음과 같이 <code class=\"language-text\">DISTINCT</code>를 사용할 수 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token keyword\">SELECT</span> <span class=\"token keyword\">DISTINCT</span> Salary\n<span class=\"token keyword\">FROM</span> EMPLOYEE<span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"set-연산자\" style=\"position:relative;\"><a href=\"#set-%EC%97%B0%EC%82%B0%EC%9E%90\" aria-label=\"set 연산자 permalink\" class=\"anchor 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>Set 연산자</h3>\n<p><strong>UNION</strong> (합집합) / <strong>EXCEPT</strong> (차집합) / <strong>INTERSECT</strong> (교집합)\nSet 연산자를 사용하기 위해서는 두 테이블이 <strong>Type-compatible</strong> 해야 한다.</p>\n<blockquote>\n<p><strong>Type-compatible</strong></p>\n<ol>\n<li>두 relation은 같은 attribute를 가져야 함</li>\n<li>attribute는 두 relation에서 같은 순서로 나타나야 함</li>\n</ol>\n</blockquote>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token punctuation\">(</span>\n  <span class=\"token keyword\">SELECT</span> <span class=\"token keyword\">DISTINCT</span> Pnumber\n  <span class=\"token keyword\">FROM</span> PROJECT<span class=\"token punctuation\">,</span> WORKS_ON<span class=\"token punctuation\">,</span> EMPLOYEE\n  <span class=\"token keyword\">WHERE</span> Pnumber <span class=\"token operator\">=</span> Pno <span class=\"token operator\">AND</span> Essn <span class=\"token operator\">=</span> Ssn <span class=\"token operator\">AND</span> Lname <span class=\"token operator\">=</span> <span class=\"token string\">'Smith'</span>\n<span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">UNION</span>\n<span class=\"token punctuation\">(</span>\n  <span class=\"token keyword\">SELECT</span> <span class=\"token keyword\">DISTINCT</span> Pnumber\n  <span class=\"token keyword\">FROM</span> PROJECT<span class=\"token punctuation\">,</span> DEPARTMENT<span class=\"token punctuation\">,</span> EMPLOYEE\n  <span class=\"token keyword\">WHERE</span> Dnum <span class=\"token operator\">=</span> Dnumber <span class=\"token operator\">AND</span> Mgr_ssn <span class=\"token operator\">=</span> Ssn <span class=\"token operator\">AND</span> Lname <span class=\"token operator\">=</span> <span class=\"token string\">'Smith'</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<hr>\n<h2 id=\"-sql-추가-기능\" style=\"position:relative;\"><a href=\"#-sql-%EC%B6%94%EA%B0%80-%EA%B8%B0%EB%8A%A5\" aria-label=\" sql 추가 기능 permalink\" class=\"anchor 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>⚙ SQL 추가 기능</h2>\n<h3 id=\"substring-pattern-matching\" style=\"position:relative;\"><a href=\"#substring-pattern-matching\" aria-label=\"substring pattern matching permalink\" class=\"anchor 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>Substring Pattern Matching</h3>\n<p><code class=\"language-text\">LIKE</code> 비교 연산자</p>\n<ul>\n<li><strong>%</strong> : 0개 이상의 문자를 대체\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token keyword\">SELECT</span> Fname<span class=\"token punctuation\">,</span> Lname\n<span class=\"token keyword\">FROM</span> EMPLOYEE\n<span class=\"token keyword\">WHERE</span> Address <span class=\"token operator\">LIKE</span> <span class=\"token string\">'%Houston, TX%'</span><span class=\"token punctuation\">;</span></code></pre></div>\n</li>\n<li><strong>_</strong> : 1개 문자를 대체\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token keyword\">SELECT</span> Fname<span class=\"token punctuation\">,</span> Lname\n<span class=\"token keyword\">FROM</span> EMPLOYEE\n<span class=\"token keyword\">WHERE</span> Bdate <span class=\"token operator\">LIKE</span> <span class=\"token string\">'199_____-1______'</span><span class=\"token punctuation\">;</span></code></pre></div>\n</li>\n</ul>\n<h3 id=\"산술-연산자\" style=\"position:relative;\"><a href=\"#%EC%82%B0%EC%88%A0-%EC%97%B0%EC%82%B0%EC%9E%90\" aria-label=\"산술 연산자 permalink\" class=\"anchor 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>산술 연산자</h3>\n<ul>\n<li><strong>표준 산술 연산자</strong> : +, -, *, /</li>\n<li><code class=\"language-text\">BETWEEN</code> 비교 연산자\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token keyword\">SELECT</span> <span class=\"token operator\">*</span>\n<span class=\"token keyword\">FROM</span> EMPLOYEE\n<span class=\"token keyword\">WHERE</span> <span class=\"token punctuation\">(</span>Salary <span class=\"token operator\">BETWEEN</span> <span class=\"token number\">30000</span> <span class=\"token operator\">AND</span> <span class=\"token number\">40000</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">AND</span> Dno <span class=\"token operator\">=</span> <span class=\"token number\">5</span><span class=\"token punctuation\">;</span></code></pre></div>\n</li>\n</ul>\n<h3 id=\"질의-결과-정렬\" style=\"position:relative;\"><a href=\"#%EC%A7%88%EC%9D%98-%EA%B2%B0%EA%B3%BC-%EC%A0%95%EB%A0%AC\" aria-label=\"질의 결과 정렬 permalink\" class=\"anchor 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>질의 결과 정렬</h3>\n<p><code class=\"language-text\">ORDER BY</code> 절</p>\n<ul>\n<li><strong>DESC</strong> : attribute 값들을 내림차순으로 결과 정렬</li>\n<li><strong>ASC</strong> : attribute 값들을 오름차순으로 결과 정렬</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token punctuation\">[</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">]</span>\n<span class=\"token keyword\">ORDER</span> <span class=\"token keyword\">BY</span> D<span class=\"token punctuation\">.</span>Dname <span class=\"token keyword\">DESC</span><span class=\"token punctuation\">,</span> E<span class=\"token punctuation\">.</span>Lname <span class=\"token keyword\">ASC</span><span class=\"token punctuation\">,</span> E<span class=\"token punctuation\">.</span>Fname <span class=\"token keyword\">ASC</span><span class=\"token punctuation\">;</span></code></pre></div>\n<hr>\n<h2 id=\"-insert-문\" style=\"position:relative;\"><a href=\"#-insert-%EB%AC%B8\" aria-label=\" insert 문 permalink\" class=\"anchor 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>✔ INSERT 문</h2>\n<p>relation에 tuple을 <strong>추가</strong>하기 위해 사용</p>\n<ul>\n<li>attribute 값은 <code class=\"language-text\">CREATE TABLE</code>문에 지정된 attribute와 같은 순서로 나열되어야 한다.</li>\n<li>데이터 타입에 대한 <strong>제약 조건</strong>은 자동으로 작동하여, 잘못된 값이 들어오면 거부된다.</li>\n<li>DDL문으로서 <strong>무결성 제약조건</strong>이 적용된다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token keyword\">INSERT</span> <span class=\"token keyword\">INTO</span> EMPLOYEE <span class=\"token punctuation\">(</span>Fname<span class=\"token punctuation\">,</span> Lname<span class=\"token punctuation\">,</span> Dno<span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">VALUES</span> <span class=\"token punctuation\">(</span><span class=\"token string\">'Fernando'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Tatis'</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>위 예시와 같이 원하는 attribute 값만 명시하여 INSERT문을 작성할 수 있다.<br>\n(=> 명시되지 않은 값들은 <strong>DEFAULT</strong> 또는 <strong>NULL</strong>로 설정됨)<br>\nattribute 값을 명시하지 않을 경우, <strong>NULL</strong>을 포함한 모든 값을 작성해야 한다.</p>\n<hr>\n<h2 id=\"-delete-문\" style=\"position:relative;\"><a href=\"#-delete-%EB%AC%B8\" aria-label=\" delete 문 permalink\" class=\"anchor 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>❌ DELETE 문</h2>\n<p>조건에 맞는 relation에서 tuple을 삭제하기 위해 사용</p>\n<ul>\n<li><code class=\"language-text\">WHERE</code> 절의 조건에 만족하는 tuple을 선택해 제거한다.</li>\n<li>tuple은 한 번에 하나의 테이블에서만 삭제된다.</li>\n<li><strong>참조 무결성</strong>이 지켜져야한다.</li>\n<li><code class=\"language-text\">CASCADE</code>가 <strong>참조 무결성 제약조건</strong>에 설정되어 있으면, 삭제할 tuple을 참조하는 모든 tuple이 삭제된다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token keyword\">DELETE</span> <span class=\"token keyword\">FROM</span> EMPLOYEE\n<span class=\"token keyword\">WHERE</span> Dno <span class=\"token operator\">=</span> <span class=\"token number\">5</span><span class=\"token punctuation\">;</span></code></pre></div>\n<hr>\n<h2 id=\"-update-문\" style=\"position:relative;\"><a href=\"#-update-%EB%AC%B8\" aria-label=\" update 문 permalink\" class=\"anchor 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>✂ UPDATE 문</h2>\n<p>조건에 맞는 relation에서 tuple을 업데이트하기 위해 사용</p>\n<ul>\n<li><code class=\"language-text\">WHERE</code> 절의 조건에 만족하는 tuple을 선택한다.</li>\n<li><code class=\"language-text\">SET</code> 절은 수정할 attribute와 그 값을 지정한다.</li>\n<li>이런 트리거 작업이 <strong>참조 무결성 제약조건</strong>에 설정되어 있으면, <strong>Primary Key</strong> 값 업데이트는 다른 테이블에 있는 tuple의 <strong>Foreign Key</strong> 값으로 전파될 수 있다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token keyword\">UPDATE</span> EMPLOYEE E\n<span class=\"token keyword\">SET</span> E<span class=\"token punctuation\">.</span>Dno <span class=\"token operator\">=</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span>\n<span class=\"token keyword\">WHERE</span> E<span class=\"token punctuation\">.</span>Lname <span class=\"token operator\">=</span> <span class=\"token string\">'Tatis'</span><span class=\"token punctuation\">;</span></code></pre></div>\n<div class=\"table-of-contents\">\n<ul>\n<li>\n<p><a href=\"#-%EA%B8%B0%EB%B3%B8-%EA%B2%80%EC%83%89-query\">🔍 기본 검색 Query</a></p>\n<ul>\n<li><a href=\"#select-%EB%AC%B8\">SELECT 문</a></li>\n<li><a href=\"#aliasing--renaming\">Aliasing / Renaming</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"#-sql-%EC%A7%91%ED%95%A9-%EC%97%B0%EC%82%B0%EC%9E%90\">📦 SQL 집합 연산자</a></p>\n<ul>\n<li><a href=\"#set-%EC%97%B0%EC%82%B0%EC%9E%90\">Set 연산자</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"#-sql-%EC%B6%94%EA%B0%80-%EA%B8%B0%EB%8A%A5\">⚙ SQL 추가 기능</a></p>\n<ul>\n<li><a href=\"#substring-pattern-matching\">Substring Pattern Matching</a></li>\n<li><a href=\"#%EC%82%B0%EC%88%A0-%EC%97%B0%EC%82%B0%EC%9E%90\">산술 연산자</a></li>\n<li><a href=\"#%EC%A7%88%EC%9D%98-%EA%B2%B0%EA%B3%BC-%EC%A0%95%EB%A0%AC\">질의 결과 정렬</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"#-insert-%EB%AC%B8\">✔ INSERT 문</a></p>\n</li>\n<li>\n<p><a href=\"#-delete-%EB%AC%B8\">❌ DELETE 문</a></p>\n</li>\n<li>\n<p><a href=\"#-update-%EB%AC%B8\">✂ UPDATE 문</a></p>\n</li>\n</ul>\n</div>","excerpt":"🔍 기본 검색 Query SELECT 문 데이터베이스에서 정보 검색을 하는데 가장 기본이 되는 구문으로,  형태가 기본적인 형태다. relational algebra에서 selection과는 다름 ex) Aliasing / Renaming 두 개 이상의 attribute들이 서로 이름이 같은 경우에는 다음과 같이 이름을 바꾸거나 명시해 표현할 수 있다. SQL 질의는 데이터를 검색할 때, “어떻게” 가 아닌 “어떤” 데이터를 검색하기 원하는지 기술하기 때문에 비절차적(non-procedural) 이고, 선언적(declarative) 이다. 📦 SQL 집합 연산자 SQL은 중복된 튜플을 제거하지 않는다. 중복 제거는 비용이 많이 든다. 사용자가 쿼리 결과에서 중복 튜플을 보기 원할 수도 있다. 집계 함수(sum, avg, max, distinct, …)를 사용할 때 대부분 중복 제거를 원하지 않는다. 중복 제거를 원한다면 다음과 같이 를 사용할 수 있다. Set 연산자 UNION (…","frontmatter":{"date":"March 16, 2022","title":"[Database] Basic SQL Queries","categories":"Database","author":"JFe","emoji":"🙋‍♀️"},"fields":{"slug":"/db-basic-sql-queries/"}},"next":{"id":"3b9115f0-464e-53d2-9908-0d5c171d5e69","html":"<h2 id=\"문제\" style=\"position:relative;\"><a href=\"#%EB%AC%B8%EC%A0%9C\" aria-label=\"문제 permalink\" class=\"anchor 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://www.acmicpc.net/problem/17136\">https://www.acmicpc.net/problem/17136</a></p>\n<p>&#x3C;그림 1>과 같이 정사각형 모양을 한 다섯 종류의 색종이가 있다. 색종이의 크기는 1×1, 2×2, 3×3, 4×4, 5×5로 총 다섯 종류가 있으며, 각 종류의 색종이는 5개씩 가지고 있다.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 28.888888888888886%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAlElEQVQY032QjQ7DIAiE+/4va+p/tUrzkbC4zc3k4gHegRyyOXNOGWPoDVprcl2X4r5vqbVKjFFyzpJSUs47zmEiDBD03vU2ARxRCEFzpRTNE5MH3vt3w7Vg3Dkn53mqAUZw6jYVdWLy8K8J+QpiJrIvISRmGoQAQ2DNrdnL8N8ObY+sof3YIdjucMWnOQZreqcxwweTyNZAuD+RSQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"17136-size.png\"\n        title=\"17136-size.png\"\n        src=\"/static/79f4837b71964b9a6adc9c10a3cb3eed/37523/17136-size.png\"\n        srcset=\"/static/79f4837b71964b9a6adc9c10a3cb3eed/e9ff0/17136-size.png 180w,\n/static/79f4837b71964b9a6adc9c10a3cb3eed/f21e7/17136-size.png 360w,\n/static/79f4837b71964b9a6adc9c10a3cb3eed/37523/17136-size.png 720w,\n/static/79f4837b71964b9a6adc9c10a3cb3eed/302a4/17136-size.png 1080w,\n/static/79f4837b71964b9a6adc9c10a3cb3eed/07a9c/17136-size.png 1440w,\n/static/79f4837b71964b9a6adc9c10a3cb3eed/10d53/17136-size.png 1724w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>색종이를 크기가 10×10인 종이 위에 붙이려고 한다. 종이는 1×1 크기의 칸으로 나누어져 있으며, 각각의 칸에는 0 또는 1이 적혀 있다. 1이 적힌 칸은 모두 색종이로 덮여져야 한다. 색종이를 붙일 때는 종이의 경계 밖으로 나가서는 안되고, 겹쳐도 안 된다. 또, 칸의 경계와 일치하게 붙여야 한다. 0이 적힌 칸에는 색종이가 있으면 안 된다.</p>\n<p>종이가 주어졌을 때, 1이 적힌 모든 칸을 붙이는데 필요한 색종이의 최소 개수를 구해보자.</p>\n<hr>\n<h2 id=\"입력\" style=\"position:relative;\"><a href=\"#%EC%9E%85%EB%A0%A5\" aria-label=\"입력 permalink\" class=\"anchor 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>총 10개의 줄에 종이의 각 칸에 적힌 수가 주어진다.</p>\n<hr>\n<h2 id=\"출력\" style=\"position:relative;\"><a href=\"#%EC%B6%9C%EB%A0%A5\" aria-label=\"출력 permalink\" class=\"anchor 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>모든 1을 덮는데 필요한 색종이의 최소 개수를 출력한다. 1을 모두 덮는 것이 불가능한 경우에는 -1을 출력한다.</p>\n<hr>\n<h2 id=\"-algorithm\" style=\"position:relative;\"><a href=\"#-algorithm\" aria-label=\" algorithm permalink\" class=\"anchor 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>🔍 Algorithm</h2>\n<p><strong>Brute Force, Backtracking</strong></p>\n<h2 id=\"-logic\" style=\"position:relative;\"><a href=\"#-logic\" aria-label=\" logic permalink\" class=\"anchor 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>💻 Logic</h2>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">check_attach</span><span class=\"token punctuation\">(</span>y<span class=\"token punctuation\">,</span> x<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    arr <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n    <span class=\"token comment\"># 1부터 5까지 크기별 색종이 전부 확인</span>\n    <span class=\"token keyword\">for</span> k <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">6</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>k<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">for</span> j <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>k<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n                <span class=\"token comment\"># 범위에 벗어나거나 0을 만나서 색종이를 붙일 수 없는 경우</span>\n                <span class=\"token keyword\">if</span> y<span class=\"token operator\">+</span>i <span class=\"token operator\">>=</span> <span class=\"token number\">10</span> <span class=\"token keyword\">or</span> x<span class=\"token operator\">+</span>j <span class=\"token operator\">>=</span> <span class=\"token number\">10</span> <span class=\"token keyword\">or</span> field<span class=\"token punctuation\">[</span>y<span class=\"token operator\">+</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>x<span class=\"token operator\">+</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n                    <span class=\"token keyword\">return</span> arr\n        arr<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>k<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> arr</code></pre></div>\n<ul>\n<li>붙일 수 있는 색종이 계산하는 함수\n<ul>\n<li><strong>1부터 5까지 크기별 색종이 전부 확인</strong><br>\n<strong>1부터 5까지</strong> 크기별 색종이들을 붙일 수 있는지 확인하고,<br>\n붙일 수 있으면 해당 크기 <code class=\"language-text\">k</code>를 <code class=\"language-text\">arr</code> 리스트에 <strong>append</strong></li>\n<li><strong>범위에 벗어나거나 0을 만나서 색종이를 붙일 수 없는 경우</strong><br>\n<strong>범위</strong>에 벗어나거나 <strong>0</strong>을 만나는 경우에는 색종이를 붙일 수 없고,<br>\n더 큰 크기의 색종이도 붙일 수 없기 때문에 바로 <code class=\"language-text\">arr</code> 리스트 <strong>return</strong></li>\n</ul>\n</li>\n</ul>\n<hr>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">search</span><span class=\"token punctuation\">(</span>one_cnt<span class=\"token punctuation\">,</span> cnt<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">global</span> result<span class=\"token punctuation\">,</span> paper_cnt\n    <span class=\"token comment\"># 1을 전부 덮은 경우, 최소 result 계산</span>\n    <span class=\"token keyword\">if</span> one_cnt <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n        result <span class=\"token operator\">=</span> <span class=\"token builtin\">min</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">,</span> cnt<span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">return</span>\n    <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">for</span> j <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            <span class=\"token comment\"># 1인 경우 붙일 수 있는 색종이 확인</span>\n            <span class=\"token keyword\">if</span> field<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token number\">1</span><span class=\"token punctuation\">:</span>\n                arr <span class=\"token operator\">=</span> check_attach<span class=\"token punctuation\">(</span>i<span class=\"token punctuation\">,</span> j<span class=\"token punctuation\">)</span>\n                <span class=\"token keyword\">for</span> n <span class=\"token keyword\">in</span> arr<span class=\"token punctuation\">:</span>\n                    <span class=\"token comment\"># 해당 색종이가 남아 있으면 계산 후 재귀</span>\n                    <span class=\"token keyword\">if</span> paper_cnt<span class=\"token punctuation\">[</span>n<span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n                        paper_cnt<span class=\"token punctuation\">[</span>n<span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">-=</span> <span class=\"token number\">1</span>\n                        <span class=\"token keyword\">for</span> y <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n                            <span class=\"token keyword\">for</span> x <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n                                field<span class=\"token punctuation\">[</span>i<span class=\"token operator\">+</span>y<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token operator\">+</span>x<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n                        search<span class=\"token punctuation\">(</span>one_cnt <span class=\"token operator\">-</span> <span class=\"token punctuation\">(</span>n <span class=\"token operator\">**</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> cnt <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n                        paper_cnt<span class=\"token punctuation\">[</span>n<span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">+=</span> <span class=\"token number\">1</span>\n                        <span class=\"token keyword\">for</span> y <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n                            <span class=\"token keyword\">for</span> x <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n                                field<span class=\"token punctuation\">[</span>i<span class=\"token operator\">+</span>y<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token operator\">+</span>x<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token number\">1</span>\n                <span class=\"token keyword\">return</span></code></pre></div>\n<ul>\n<li>색종이를 최소한으로 붙일 수 있는 방법을 탐색하는 함수\n<ul>\n<li><strong>1을 전부 덮은 경우</strong><br>\n<code class=\"language-text\">result</code>와 <code class=\"language-text\">cnt</code> 사이의 최솟값 계산해서 <code class=\"language-text\">result</code>에 저장 후, <strong>return</strong></li>\n<li><strong>1인 경우 붙일 수 있는 색종이 확인</strong>\n<code class=\"language-text\">field</code> 값이 <strong>1</strong>인 경우에는 <code class=\"language-text\">check_attach()</code> 함수를 이용해서 붙일 수 있는 색종이를 <code class=\"language-text\">arr</code> 리스트로 받아오고,<br>\n붙일 수 있는 색종이마다 해당 색종이가 남아 있는지 확인하고,<br>\n남아 있으면 해당 <code class=\"language-text\">paper_cnt</code>를 하나 감소시키고 <code class=\"language-text\">field</code> 값을 <strong>0</strong>으로 바꾼 뒤 <strong>재귀</strong><br>\n재귀가 끝나면 다시 원래대로 원상복귀</li>\n</ul>\n</li>\n</ul>\n<hr>\n<h2 id=\"-code\" style=\"position:relative;\"><a href=\"#-code\" aria-label=\" code permalink\" class=\"anchor 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>🧩 Code</h2>\n<details><summary>전체 코드 확인</summary>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">import</span> sys\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">check_attach</span><span class=\"token punctuation\">(</span>y<span class=\"token punctuation\">,</span> x<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    arr <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n    <span class=\"token comment\"># 1부터 5까지 크기별 색종이 전부 확인</span>\n    <span class=\"token keyword\">for</span> k <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">6</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>k<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">for</span> j <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>k<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n                <span class=\"token comment\"># 범위에 벗어나거나 0을 만나서 색종이를 붙일 수 없는 경우</span>\n                <span class=\"token keyword\">if</span> y<span class=\"token operator\">+</span>i <span class=\"token operator\">>=</span> <span class=\"token number\">10</span> <span class=\"token keyword\">or</span> x<span class=\"token operator\">+</span>j <span class=\"token operator\">>=</span> <span class=\"token number\">10</span> <span class=\"token keyword\">or</span> field<span class=\"token punctuation\">[</span>y<span class=\"token operator\">+</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>x<span class=\"token operator\">+</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n                    <span class=\"token keyword\">return</span> arr\n        arr<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span>k<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> arr\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">search</span><span class=\"token punctuation\">(</span>one_cnt<span class=\"token punctuation\">,</span> cnt<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">global</span> result<span class=\"token punctuation\">,</span> paper_cnt\n    <span class=\"token comment\"># 1을 전부 덮은 경우, 최소 result 계산</span>\n    <span class=\"token keyword\">if</span> one_cnt <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n        result <span class=\"token operator\">=</span> <span class=\"token builtin\">min</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">,</span> cnt<span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">return</span>\n    <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">for</span> j <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            <span class=\"token comment\"># 1인 경우 붙일 수 있는 색종이 확인</span>\n            <span class=\"token keyword\">if</span> field<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token number\">1</span><span class=\"token punctuation\">:</span>\n                arr <span class=\"token operator\">=</span> check_attach<span class=\"token punctuation\">(</span>i<span class=\"token punctuation\">,</span> j<span class=\"token punctuation\">)</span>\n                <span class=\"token keyword\">for</span> n <span class=\"token keyword\">in</span> arr<span class=\"token punctuation\">:</span>\n                    <span class=\"token comment\"># 해당 색종이가 남아 있으면 계산 후 재귀</span>\n                    <span class=\"token keyword\">if</span> paper_cnt<span class=\"token punctuation\">[</span>n<span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n                        paper_cnt<span class=\"token punctuation\">[</span>n<span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">-=</span> <span class=\"token number\">1</span>\n                        <span class=\"token keyword\">for</span> y <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n                            <span class=\"token keyword\">for</span> x <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n                                field<span class=\"token punctuation\">[</span>i<span class=\"token operator\">+</span>y<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token operator\">+</span>x<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n                        search<span class=\"token punctuation\">(</span>one_cnt <span class=\"token operator\">-</span> <span class=\"token punctuation\">(</span>n <span class=\"token operator\">**</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> cnt <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n                        paper_cnt<span class=\"token punctuation\">[</span>n<span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">+=</span> <span class=\"token number\">1</span>\n                        <span class=\"token keyword\">for</span> y <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n                            <span class=\"token keyword\">for</span> x <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n                                field<span class=\"token punctuation\">[</span>i<span class=\"token operator\">+</span>y<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token operator\">+</span>x<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token number\">1</span>\n                <span class=\"token keyword\">return</span>\n\nfield <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">[</span><span class=\"token builtin\">int</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span> <span class=\"token keyword\">for</span> x <span class=\"token keyword\">in</span> sys<span class=\"token punctuation\">.</span>stdin<span class=\"token punctuation\">.</span>readline<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>split<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token keyword\">for</span> _ <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span>\npaper_cnt <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token number\">5</span><span class=\"token punctuation\">]</span>\none_cnt<span class=\"token punctuation\">,</span> result <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> sys<span class=\"token punctuation\">.</span>maxsize\n\n<span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">for</span> j <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">if</span> field<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token number\">1</span><span class=\"token punctuation\">:</span>\n            one_cnt <span class=\"token operator\">+=</span> <span class=\"token number\">1</span>\nsearch<span class=\"token punctuation\">(</span>one_cnt<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">if</span> result <span class=\"token operator\">==</span> sys<span class=\"token punctuation\">.</span>maxsize<span class=\"token punctuation\">:</span>\n    result <span class=\"token operator\">=</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">)</span></code></pre></div>\n</details>\n<hr>\n<h2 id=\"-review\" style=\"position:relative;\"><a href=\"#-review\" aria-label=\" review permalink\" class=\"anchor 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>📝 Review</h2>\n<p>처음에는 제일 큰 색종이부터 붙이면 되겠지라고 생각하고 그리디 방식으로 풀려고 했는데 아니었다…<br>\n백트래킹 방식으로 풀어야 되는걸 알고나서 재귀로 풀려고 했는데 감이 안잡혀서 몇몇 힌트를 참고했다,,<br>\n나중에 다시 한번 풀어봐야 하는 문제. 재귀는 어려워</p>\n<div class=\"table-of-contents\">\n<ul>\n<li><a href=\"#%EB%AC%B8%EC%A0%9C\">문제</a></li>\n<li><a href=\"#%EC%9E%85%EB%A0%A5\">입력</a></li>\n<li><a href=\"#%EC%B6%9C%EB%A0%A5\">출력</a></li>\n<li><a href=\"#-algorithm\">🔍 Algorithm</a></li>\n<li><a href=\"#-logic\">💻 Logic</a></li>\n<li><a href=\"#-code\">🧩 Code</a></li>\n<li><a href=\"#-review\">📝 Review</a></li>\n</ul>\n</div>","frontmatter":{"date":"March 15, 2022","title":"[BOJ] 17136번: 색종이 붙이기 (Python)","categories":"Algorithm","author":"JFe","emoji":"💻"},"fields":{"slug":"/boj-17136/"}},"prev":{"id":"9c341e89-4d8d-53f6-b8b7-018aafb7091a","html":"<h2 id=\"문제\" style=\"position:relative;\"><a href=\"#%EB%AC%B8%EC%A0%9C\" aria-label=\"문제 permalink\" class=\"anchor 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://www.acmicpc.net/problem/17472\">https://www.acmicpc.net/problem/17472</a></p>\n<p>섬으로 이루어진 나라가 있고, 모든 섬을 다리로 연결하려고 한다. 이 나라의 지도는 N×M 크기의 이차원 격자로 나타낼 수 있고, 격자의 각 칸은 땅이거나 바다이다.</p>\n<p>섬은 연결된 땅이 상하좌우로 붙어있는 덩어리를 말하고, 아래 그림은 네 개의 섬으로 이루어진 나라이다. 색칠되어있는 칸은 땅이다.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 17.22222222222222%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAUklEQVQI152MSwqAMBBDe/8rqitBCgNObWyri06kIK78gIFHIJDnzIx3tLQeNRMpUwI4xe3an3CvwlrZCxgi2HmlruW/0M7jjEK/JA4Cato/hQcvNuxRRO2BFQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"17472-map.png\"\n        title=\"17472-map.png\"\n        src=\"/static/ebd61c5231ff2dedb5cd558ae09333a0/37523/17472-map.png\"\n        srcset=\"/static/ebd61c5231ff2dedb5cd558ae09333a0/e9ff0/17472-map.png 180w,\n/static/ebd61c5231ff2dedb5cd558ae09333a0/f21e7/17472-map.png 360w,\n/static/ebd61c5231ff2dedb5cd558ae09333a0/37523/17472-map.png 720w,\n/static/ebd61c5231ff2dedb5cd558ae09333a0/302a4/17472-map.png 1080w,\n/static/ebd61c5231ff2dedb5cd558ae09333a0/07a9c/17472-map.png 1440w,\n/static/ebd61c5231ff2dedb5cd558ae09333a0/828bd/17472-map.png 2310w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>다리는 바다에만 건설할 수 있고, 다리의 길이는 다리가 격자에서 차지하는 칸의 수이다. 다리를 연결해서 모든 섬을 연결하려고 한다. 섬 A에서 다리를 통해 섬 B로 갈 수 있을 때, 섬 A와 B를 연결되었다고 한다. 다리의 양 끝은 섬과 인접한 바다 위에 있어야 하고, 한 다리의 방향이 중간에 바뀌면 안된다. 또, 다리의 길이는 2 이상이어야 한다.</p>\n<p>다리의 방향이 중간에 바뀌면 안되기 때문에, 다리의 방향은 가로 또는 세로가 될 수 밖에 없다. 방향이 가로인 다리는 다리의 양 끝이 가로 방향으로 섬과 인접해야 하고, 방향이 세로인 다리는 다리의 양 끝이 세로 방향으로 섬과 인접해야 한다.</p>\n<p>섬 A와 B를 연결하는 다리가 중간에 섬 C와 인접한 바다를 지나가는 경우에 섬 C는 A, B와 연결되어있는 것이 아니다.</p>\n<p>아래 그림은 섬을 모두 연결하는 올바른 2가지 방법이고, 다리는 회색으로 색칠되어 있다. 섬은 정수, 다리는 알파벳 대문자로 구분했다.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 27.77777777777778%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA8UlEQVQY03WQXW+CMABF/f+/bMmeZkLmVLB+oCBKS1sBwfYs1LktzDW5D7335KTpxHsPeJprR6k0RknWR0laNaF33uOcY+AesXWDqioqpYiPClVfGc7ATlwQwkq2vCxSxHLONNmxTIvQ/xbdUc/0YHhbCJJ4SbQt0M31m534L+FJ10SLFXmW8ZpkCLF+IryzIi+JV4L1Pmd2kLi++yuUtiHa5Gxlzfu+ZHMs/xXuCslHekKcL8wzhRm/sO972q6j1JasOKGMpe360Psnf9j2N85Kh1T2gnM/WxBaa9FaY7TGWoM1JtyHfix7xLkbfthG+ydpG9Cxs+RhLQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"17472-ex1.png\"\n        title=\"17472-ex1.png\"\n        src=\"/static/fb222058925654d3afcf6a0a3498f39f/37523/17472-ex1.png\"\n        srcset=\"/static/fb222058925654d3afcf6a0a3498f39f/e9ff0/17472-ex1.png 180w,\n/static/fb222058925654d3afcf6a0a3498f39f/f21e7/17472-ex1.png 360w,\n/static/fb222058925654d3afcf6a0a3498f39f/37523/17472-ex1.png 720w,\n/static/fb222058925654d3afcf6a0a3498f39f/302a4/17472-ex1.png 1080w,\n/static/fb222058925654d3afcf6a0a3498f39f/07a9c/17472-ex1.png 1440w,\n/static/fb222058925654d3afcf6a0a3498f39f/f60cd/17472-ex1.png 2318w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>다음은 올바르지 않은 3가지 방법이다</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 23.333333333333332%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAABYlAAAWJQFJUiTwAAABAUlEQVQY002Q226DQAxE8///1peqpLkBBRouAdYLC4Ul2T0VpK06kh+so7HH3o2zpVEarVqiSriZGfB47xknSysdnSjCUmiGGbzHA8YMSHhhCk98JAW3wW6+3bkZeU0qivxKkFaoYeJXK3s5Z0ThhSCrkXH+Y4fKEMQFqiw45y1qeLJdIYY0yeijiH0uzNZu6VaVquMUJ3xeC/ZpjbXLP9ZzjBLSvCTIhWVZngObfuQtzLjEV46F/KR4mmptOOYNcak4JRXdtPyxddl7diOuew65Qg1fz5OX+51aCY1oGiWsvXcO5xwP5+nMQCt6++fDuS2htRalNdIb6lZtJVpvKb8Bj8p88OmtOxoAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"17472-ex2.png\"\n        title=\"17472-ex2.png\"\n        src=\"/static/9e37269ada0c375f9d337c3a8677ee6f/37523/17472-ex2.png\"\n        srcset=\"/static/9e37269ada0c375f9d337c3a8677ee6f/e9ff0/17472-ex2.png 180w,\n/static/9e37269ada0c375f9d337c3a8677ee6f/f21e7/17472-ex2.png 360w,\n/static/9e37269ada0c375f9d337c3a8677ee6f/37523/17472-ex2.png 720w,\n/static/9e37269ada0c375f9d337c3a8677ee6f/302a4/17472-ex2.png 1080w,\n/static/9e37269ada0c375f9d337c3a8677ee6f/07a9c/17472-ex2.png 1440w,\n/static/9e37269ada0c375f9d337c3a8677ee6f/8126d/17472-ex2.png 2316w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>다리가 교차하는 경우가 있을 수도 있다. 교차하는 다리의 길이를 계산할 때는 각 칸이 각 다리의 길이에 모두 포함되어야 한다. 아래는 다리가 교차하는 경우와 기타 다른 경우에 대한 2가지 예시이다.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 720px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 35.55555555555556%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAABYlAAAWJQFJUiTwAAAA9klEQVQoz22R626CQBCFff8na/+aEI1KsSIIK7gshIvu5WsgxQJlk9nJzJycM2d3Y63FOUefddcSyppENTzbZuiPsz5wjpexnOOUQ5jgpxJZNYDD/mI3/dUfbSyHVLEPQjz/m5Moh/5IOuKctaQPxYd35HO7w79XM9ybsFf2borgcmXr7fAjsUporeGal3ix5BScaZtmTjhaNtYOVi+Pmi+huMm58mAZx0sbjqJkn5SE94KubWeim2lhtMYY/c7T2XRLVUhEmhBFEXVdr1s2xpDnOVmWoZSiqqq/d1sQFkohhCCOY5ql5Sl4/M21zZbRC3Zd96//AzXBITlBW3QAAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"17472-ex3.png\"\n        title=\"17472-ex3.png\"\n        src=\"/static/fc9929b236e8414a8899a11eeb728d8c/37523/17472-ex3.png\"\n        srcset=\"/static/fc9929b236e8414a8899a11eeb728d8c/e9ff0/17472-ex3.png 180w,\n/static/fc9929b236e8414a8899a11eeb728d8c/f21e7/17472-ex3.png 360w,\n/static/fc9929b236e8414a8899a11eeb728d8c/37523/17472-ex3.png 720w,\n/static/fc9929b236e8414a8899a11eeb728d8c/302a4/17472-ex3.png 1080w,\n/static/fc9929b236e8414a8899a11eeb728d8c/07a9c/17472-ex3.png 1440w,\n/static/fc9929b236e8414a8899a11eeb728d8c/f5aa5/17472-ex3.png 2312w\"\n        sizes=\"(max-width: 720px) 100vw, 720px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>나라의 정보가 주어졌을 때, 모든 섬을 연결하는 다리 길이의 최솟값을 구해보자.</p>\n<hr>\n<h2 id=\"입력\" style=\"position:relative;\"><a href=\"#%EC%9E%85%EB%A0%A5\" aria-label=\"입력 permalink\" class=\"anchor 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>첫째 줄에 지도의 세로 크기 N과 가로 크기 M이 주어진다. 둘째 줄부터 N개의 줄에 지도의 정보가 주어진다. 각 줄은 M개의 수로 이루어져 있으며, 수는 0 또는 1이다. 0은 바다, 1은 땅을 의미한다.</p>\n<hr>\n<h2 id=\"출력\" style=\"position:relative;\"><a href=\"#%EC%B6%9C%EB%A0%A5\" aria-label=\"출력 permalink\" class=\"anchor 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>모든 섬을 연결하는 다리 길이의 최솟값을 출력한다. 모든 섬을 연결하는 것이 불가능하면 -1을 출력한다.</p>\n<hr>\n<h2 id=\"-algorithm\" style=\"position:relative;\"><a href=\"#-algorithm\" aria-label=\" algorithm permalink\" class=\"anchor 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>🔍 Algorithm</h2>\n<p><strong>Brute Force, BFS, DFS, Kruskal</strong></p>\n<h2 id=\"-logic\" style=\"position:relative;\"><a href=\"#-logic\" aria-label=\" logic permalink\" class=\"anchor 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>💻 Logic</h2>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">number_island</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">,</span> cnt<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    q <span class=\"token operator\">=</span> deque<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    q<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    map_list<span class=\"token punctuation\">[</span>y<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> cnt\n    <span class=\"token comment\"># BFS 탐색</span>\n    <span class=\"token keyword\">while</span> q<span class=\"token punctuation\">:</span>\n        x<span class=\"token punctuation\">,</span> y <span class=\"token operator\">=</span> q<span class=\"token punctuation\">.</span>popleft<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            next_x<span class=\"token punctuation\">,</span> next_y <span class=\"token operator\">=</span> x <span class=\"token operator\">+</span> dx<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> y <span class=\"token operator\">+</span> dy<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span>\n            <span class=\"token keyword\">if</span> <span class=\"token number\">0</span> <span class=\"token operator\">&lt;=</span> next_x <span class=\"token operator\">&lt;</span> M <span class=\"token keyword\">and</span> <span class=\"token number\">0</span> <span class=\"token operator\">&lt;=</span> next_y <span class=\"token operator\">&lt;</span> N<span class=\"token punctuation\">:</span>\n                <span class=\"token keyword\">if</span> <span class=\"token keyword\">not</span> visited<span class=\"token punctuation\">[</span>next_y<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>next_x<span class=\"token punctuation\">]</span> <span class=\"token keyword\">and</span> map_list<span class=\"token punctuation\">[</span>next_y<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>next_x<span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token number\">1</span><span class=\"token punctuation\">:</span>\n                    map_list<span class=\"token punctuation\">[</span>next_y<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>next_x<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> cnt\n                    q<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>next_x<span class=\"token punctuation\">,</span> next_y<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n                    visited<span class=\"token punctuation\">[</span>next_y<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>next_x<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token boolean\">True</span></code></pre></div>\n<ul>\n<li><strong>BFS</strong> 탐색을 통해 섬 분류하는 함수\n<ul>\n<li><strong>BFS 탐색</strong><br>\n상하좌우, <code class=\"language-text\">visited</code> 확인하고 <code class=\"language-text\">map_list</code> 값이 <strong>1</strong>이면<br>\n해당 <code class=\"language-text\">cnt</code>로 섬 숫자 지정하는 방식으로 연결된 땅들 섬으로 분류</li>\n</ul>\n</li>\n</ul>\n<hr>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">make_bridge</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">,</span> dest<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    result <span class=\"token operator\">=</span> sys<span class=\"token punctuation\">.</span>maxsize\n    <span class=\"token comment\"># 방향 4군데</span>\n    <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        stack <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n        stack<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        length <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n        <span class=\"token comment\"># 그 방향으로 DFS 탐색</span>\n        <span class=\"token keyword\">while</span> stack<span class=\"token punctuation\">:</span>\n            cur_x<span class=\"token punctuation\">,</span> cur_y <span class=\"token operator\">=</span> stack<span class=\"token punctuation\">.</span>pop<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n            next_x<span class=\"token punctuation\">,</span> next_y <span class=\"token operator\">=</span> cur_x <span class=\"token operator\">+</span> dx<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> cur_y <span class=\"token operator\">+</span> dy<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span>\n            <span class=\"token comment\"># 범위 벗어나는 경우</span>\n            <span class=\"token keyword\">if</span> <span class=\"token keyword\">not</span> <span class=\"token punctuation\">(</span><span class=\"token number\">0</span> <span class=\"token operator\">&lt;=</span> next_x <span class=\"token operator\">&lt;</span> M <span class=\"token keyword\">and</span> <span class=\"token number\">0</span> <span class=\"token operator\">&lt;=</span> next_y <span class=\"token operator\">&lt;</span> N<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n                <span class=\"token keyword\">break</span>\n            <span class=\"token comment\"># 바다인 경우</span>\n            <span class=\"token keyword\">elif</span> map_list<span class=\"token punctuation\">[</span>next_y<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>next_x<span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n                length <span class=\"token operator\">+=</span> <span class=\"token number\">1</span>\n                stack<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>next_x<span class=\"token punctuation\">,</span> next_y<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n            <span class=\"token comment\"># 목적지인 경우</span>\n            <span class=\"token keyword\">elif</span> map_list<span class=\"token punctuation\">[</span>next_y<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>next_x<span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> dest<span class=\"token punctuation\">:</span>\n                <span class=\"token keyword\">if</span> length <span class=\"token operator\">>=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">:</span>\n                    result <span class=\"token operator\">=</span> <span class=\"token builtin\">min</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">,</span> length<span class=\"token punctuation\">)</span>\n                <span class=\"token keyword\">break</span>\n            <span class=\"token comment\"># 목적지가 아닌 땅인 경우</span>\n            <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n                <span class=\"token keyword\">break</span>\n    <span class=\"token keyword\">return</span> result</code></pre></div>\n<ul>\n<li><strong>DFS</strong> 탐색을 통해 다리 연결하는 함수\n<ul>\n<li><strong>방향 4군데 확인</strong><br>\n상하좌우 방향 4군데 전부 반복문을 돌면서 확인</li>\n<li><strong>DFS 탐색</strong>\n그 방향으로 <strong>DFS</strong> 탐색하면서 다리를 만들 수 있는지 확인<br>\n범위에 벗어나거나 목적지가 아닌 땅인 경우에는 다리를 만들 수 없으므로 <strong>break</strong><br>\n<code class=\"language-text\">map_list</code> 값이 <strong>0</strong>이어서 바다인 경우에는 <code class=\"language-text\">length</code> <strong>+1</strong> 해서 다리 길이 늘리고,<br>\n<code class=\"language-text\">map_list</code> 값이 <code class=\"language-text\">dest</code>면 목적지에 도착한 경우이므로 <code class=\"language-text\">result</code>와 <code class=\"language-text\">length</code> 비교해서 <strong>최솟값</strong>을 저장<br>\n이 때, 문제 조건에서 다리 길이는 <strong>2 이상</strong>이어야 하기 때문에 조건 확인하고 저장</li>\n</ul>\n</li>\n</ul>\n<hr>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">find_parent</span><span class=\"token punctuation\">(</span>parent<span class=\"token punctuation\">,</span> x<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">if</span> parent<span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">]</span> <span class=\"token operator\">!=</span> x<span class=\"token punctuation\">:</span>\n        parent<span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> find_parent<span class=\"token punctuation\">(</span>parent<span class=\"token punctuation\">,</span> parent<span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> parent<span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">]</span>\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">union_parent</span><span class=\"token punctuation\">(</span>parent<span class=\"token punctuation\">,</span> a<span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    a <span class=\"token operator\">=</span> find_parent<span class=\"token punctuation\">(</span>parent<span class=\"token punctuation\">,</span> a<span class=\"token punctuation\">)</span>\n    b <span class=\"token operator\">=</span> find_parent<span class=\"token punctuation\">(</span>parent<span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>a <span class=\"token operator\">&lt;</span> b<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        parent<span class=\"token punctuation\">[</span>b<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> a\n    <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n        parent<span class=\"token punctuation\">[</span>a<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> b\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">kruskal</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    result<span class=\"token punctuation\">,</span> cnt <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span>\n    <span class=\"token keyword\">while</span> h<span class=\"token punctuation\">:</span>\n        l<span class=\"token punctuation\">,</span> a<span class=\"token punctuation\">,</span> b <span class=\"token operator\">=</span> heapq<span class=\"token punctuation\">.</span>heappop<span class=\"token punctuation\">(</span>h<span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">if</span> find_parent<span class=\"token punctuation\">(</span>parent<span class=\"token punctuation\">,</span> a<span class=\"token punctuation\">)</span> <span class=\"token operator\">!=</span> find_parent<span class=\"token punctuation\">(</span>parent<span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            union_parent<span class=\"token punctuation\">(</span>parent<span class=\"token punctuation\">,</span> a<span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">)</span>\n            result <span class=\"token operator\">+=</span> l\n            cnt <span class=\"token operator\">+=</span> <span class=\"token number\">1</span>\n    <span class=\"token comment\"># 모든 노드 방문했는지 확인</span>\n    <span class=\"token keyword\">if</span> cnt <span class=\"token operator\">!=</span> island_cnt<span class=\"token operator\">-</span><span class=\"token number\">2</span><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 keyword\">return</span> result</code></pre></div>\n<ul>\n<li><strong>Kruskal</strong> 알고리즘 이용해서 <strong>MST</strong> 확인하는 함수\n<ul>\n<li><strong>우선순위 큐를 이용해서 MST 확인</strong></li>\n<li><strong>모든 노드 방문했는지 확인</strong></li>\n</ul>\n</li>\n</ul>\n<hr>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>N<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">for</span> j <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>M<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">if</span> <span class=\"token keyword\">not</span> visited<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token keyword\">and</span> map_list<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token number\">1</span><span class=\"token punctuation\">:</span>\n            number_island<span class=\"token punctuation\">(</span>j<span class=\"token punctuation\">,</span> i<span class=\"token punctuation\">,</span> island_cnt<span class=\"token punctuation\">)</span>\n            island_cnt <span class=\"token operator\">+=</span> <span class=\"token number\">1</span>\n\nparent <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token builtin\">int</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span> <span class=\"token keyword\">for</span> x <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>island_cnt<span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span>\n<span class=\"token comment\"># 섬 조합 쌍 생성</span>\ncomb_list <span class=\"token operator\">=</span> combinations<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token builtin\">int</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span> <span class=\"token keyword\">for</span> x <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> island_cnt<span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">for</span> comb <span class=\"token keyword\">in</span> comb_list<span class=\"token punctuation\">:</span>\n    comb <span class=\"token operator\">=</span> <span class=\"token builtin\">list</span><span class=\"token punctuation\">(</span>comb<span class=\"token punctuation\">)</span>\n    bridge_len <span class=\"token operator\">=</span> sys<span class=\"token punctuation\">.</span>maxsize\n    <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>N<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">for</span> j <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>M<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            <span class=\"token comment\"># 해당 조합에 맞는 다리 만들고 길이 최솟값 저장</span>\n            <span class=\"token keyword\">if</span> map_list<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> comb<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n                result <span class=\"token operator\">=</span> make_bridge<span class=\"token punctuation\">(</span>j<span class=\"token punctuation\">,</span> i<span class=\"token punctuation\">,</span> comb<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n                bridge_len <span class=\"token operator\">=</span> <span class=\"token builtin\">min</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">,</span> bridge_len<span class=\"token punctuation\">)</span>\n    <span class=\"token comment\"># 섬, 다리 조합 우선순위 큐에 저장</span>\n    <span class=\"token keyword\">if</span> bridge_len <span class=\"token operator\">!=</span> sys<span class=\"token punctuation\">.</span>maxsize<span class=\"token punctuation\">:</span>\n        heapq<span class=\"token punctuation\">.</span>heappush<span class=\"token punctuation\">(</span>h<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span>bridge_len<span class=\"token punctuation\">,</span> comb<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> comb<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\"># 크루스칼 알고리즘 수행</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>kruskal<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<ul>\n<li><code class=\"language-text\">number_island</code> 함수 실행해서 섬 넘버링</li>\n<li>섬 조합 쌍 생성하고 둘 사이에 다리를 만들 수 있는지 <code class=\"language-text\">make_bridge</code> 함수를 실행해서 확인하고 다리 생성</li>\n<li>섬, 다리 조합 <strong>우선순위 큐</strong>에 저장하고 <strong>Kruskal</strong> 알고리즘 수행</li>\n</ul>\n<hr>\n<h2 id=\"-code\" style=\"position:relative;\"><a href=\"#-code\" aria-label=\" code permalink\" class=\"anchor 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>🧩 Code</h2>\n<details><summary>전체 코드 확인</summary>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">import</span> sys<span class=\"token punctuation\">,</span> heapq\n<span class=\"token keyword\">from</span> collections <span class=\"token keyword\">import</span> deque\n<span class=\"token keyword\">from</span> itertools <span class=\"token keyword\">import</span> combinations\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">number_island</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">,</span> cnt<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    q <span class=\"token operator\">=</span> deque<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    q<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    map_list<span class=\"token punctuation\">[</span>y<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> cnt\n    <span class=\"token comment\"># BFS 탐색</span>\n    <span class=\"token keyword\">while</span> q<span class=\"token punctuation\">:</span>\n        x<span class=\"token punctuation\">,</span> y <span class=\"token operator\">=</span> q<span class=\"token punctuation\">.</span>popleft<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            next_x<span class=\"token punctuation\">,</span> next_y <span class=\"token operator\">=</span> x <span class=\"token operator\">+</span> dx<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> y <span class=\"token operator\">+</span> dy<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span>\n            <span class=\"token keyword\">if</span> <span class=\"token number\">0</span> <span class=\"token operator\">&lt;=</span> next_x <span class=\"token operator\">&lt;</span> M <span class=\"token keyword\">and</span> <span class=\"token number\">0</span> <span class=\"token operator\">&lt;=</span> next_y <span class=\"token operator\">&lt;</span> N<span class=\"token punctuation\">:</span>\n                <span class=\"token keyword\">if</span> <span class=\"token keyword\">not</span> visited<span class=\"token punctuation\">[</span>next_y<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>next_x<span class=\"token punctuation\">]</span> <span class=\"token keyword\">and</span> map_list<span class=\"token punctuation\">[</span>next_y<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>next_x<span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token number\">1</span><span class=\"token punctuation\">:</span>\n                    map_list<span class=\"token punctuation\">[</span>next_y<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>next_x<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> cnt\n                    q<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>next_x<span class=\"token punctuation\">,</span> next_y<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n                    visited<span class=\"token punctuation\">[</span>next_y<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>next_x<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token boolean\">True</span>\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">make_bridge</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">,</span> dest<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    result <span class=\"token operator\">=</span> sys<span class=\"token punctuation\">.</span>maxsize\n    <span class=\"token comment\"># 방향 4군데</span>\n    <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        stack <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n        stack<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">,</span> y<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        length <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n        <span class=\"token comment\"># 그 방향으로 DFS 탐색</span>\n        <span class=\"token keyword\">while</span> stack<span class=\"token punctuation\">:</span>\n            cur_x<span class=\"token punctuation\">,</span> cur_y <span class=\"token operator\">=</span> stack<span class=\"token punctuation\">.</span>pop<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n            next_x<span class=\"token punctuation\">,</span> next_y <span class=\"token operator\">=</span> cur_x <span class=\"token operator\">+</span> dx<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> cur_y <span class=\"token operator\">+</span> dy<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span>\n            <span class=\"token comment\"># 범위 벗어나는 경우</span>\n            <span class=\"token keyword\">if</span> <span class=\"token keyword\">not</span> <span class=\"token punctuation\">(</span><span class=\"token number\">0</span> <span class=\"token operator\">&lt;=</span> next_x <span class=\"token operator\">&lt;</span> M <span class=\"token keyword\">and</span> <span class=\"token number\">0</span> <span class=\"token operator\">&lt;=</span> next_y <span class=\"token operator\">&lt;</span> N<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n                <span class=\"token keyword\">break</span>\n            <span class=\"token comment\"># 바다인 경우</span>\n            <span class=\"token keyword\">elif</span> map_list<span class=\"token punctuation\">[</span>next_y<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>next_x<span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n                length <span class=\"token operator\">+=</span> <span class=\"token number\">1</span>\n                stack<span class=\"token punctuation\">.</span>append<span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>next_x<span class=\"token punctuation\">,</span> next_y<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n            <span class=\"token comment\"># 목적지인 경우</span>\n            <span class=\"token keyword\">elif</span> map_list<span class=\"token punctuation\">[</span>next_y<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>next_x<span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> dest<span class=\"token punctuation\">:</span>\n                <span class=\"token keyword\">if</span> length <span class=\"token operator\">>=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">:</span>\n                    result <span class=\"token operator\">=</span> <span class=\"token builtin\">min</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">,</span> length<span class=\"token punctuation\">)</span>\n                <span class=\"token keyword\">break</span>\n            <span class=\"token comment\"># 목적지가 아닌 땅인 경우</span>\n            <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n                <span class=\"token keyword\">break</span>\n    <span class=\"token keyword\">return</span> result\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">find_parent</span><span class=\"token punctuation\">(</span>parent<span class=\"token punctuation\">,</span> x<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">if</span> parent<span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">]</span> <span class=\"token operator\">!=</span> x<span class=\"token punctuation\">:</span>\n        parent<span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> find_parent<span class=\"token punctuation\">(</span>parent<span class=\"token punctuation\">,</span> parent<span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> parent<span class=\"token punctuation\">[</span>x<span class=\"token punctuation\">]</span>\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">union_parent</span><span class=\"token punctuation\">(</span>parent<span class=\"token punctuation\">,</span> a<span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    a <span class=\"token operator\">=</span> find_parent<span class=\"token punctuation\">(</span>parent<span class=\"token punctuation\">,</span> a<span class=\"token punctuation\">)</span>\n    b <span class=\"token operator\">=</span> find_parent<span class=\"token punctuation\">(</span>parent<span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>a <span class=\"token operator\">&lt;</span> b<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        parent<span class=\"token punctuation\">[</span>b<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> a\n    <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n        parent<span class=\"token punctuation\">[</span>a<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> b\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">kruskal</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    result<span class=\"token punctuation\">,</span> cnt <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span>\n    <span class=\"token keyword\">while</span> h<span class=\"token punctuation\">:</span>\n        l<span class=\"token punctuation\">,</span> a<span class=\"token punctuation\">,</span> b <span class=\"token operator\">=</span> heapq<span class=\"token punctuation\">.</span>heappop<span class=\"token punctuation\">(</span>h<span class=\"token punctuation\">)</span>\n        <span class=\"token keyword\">if</span> find_parent<span class=\"token punctuation\">(</span>parent<span class=\"token punctuation\">,</span> a<span class=\"token punctuation\">)</span> <span class=\"token operator\">!=</span> find_parent<span class=\"token punctuation\">(</span>parent<span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            union_parent<span class=\"token punctuation\">(</span>parent<span class=\"token punctuation\">,</span> a<span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">)</span>\n            result <span class=\"token operator\">+=</span> l\n            cnt <span class=\"token operator\">+=</span> <span class=\"token number\">1</span>\n    <span class=\"token comment\"># 모든 노드 방문했는지 확인</span>\n    <span class=\"token keyword\">if</span> cnt <span class=\"token operator\">!=</span> island_cnt<span class=\"token operator\">-</span><span class=\"token number\">2</span><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 keyword\">return</span> result\n\nN<span class=\"token punctuation\">,</span> M <span class=\"token operator\">=</span> <span class=\"token builtin\">map</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">int</span><span class=\"token punctuation\">,</span> sys<span class=\"token punctuation\">.</span>stdin<span class=\"token punctuation\">.</span>readline<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>split<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\nmap_list <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">[</span><span class=\"token builtin\">int</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span> <span class=\"token keyword\">for</span> x <span class=\"token keyword\">in</span> sys<span class=\"token punctuation\">.</span>stdin<span class=\"token punctuation\">.</span>readline<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>split<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span> <span class=\"token keyword\">for</span> _ <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>N<span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span>\nvisited <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">[</span><span class=\"token boolean\">False</span> <span class=\"token keyword\">for</span> _ <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>M<span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span> <span class=\"token keyword\">for</span> _ <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>N<span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span>\ndx <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\">0</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">]</span>\ndy <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span>\nisland_cnt<span class=\"token punctuation\">,</span> h <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n\n<span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>N<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">for</span> j <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>M<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">if</span> <span class=\"token keyword\">not</span> visited<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token keyword\">and</span> map_list<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token number\">1</span><span class=\"token punctuation\">:</span>\n            number_island<span class=\"token punctuation\">(</span>j<span class=\"token punctuation\">,</span> i<span class=\"token punctuation\">,</span> island_cnt<span class=\"token punctuation\">)</span>\n            island_cnt <span class=\"token operator\">+=</span> <span class=\"token number\">1</span>\n\nparent <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token builtin\">int</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span> <span class=\"token keyword\">for</span> x <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>island_cnt<span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span>\n<span class=\"token comment\"># 섬 조합 쌍 생성</span>\ncomb_list <span class=\"token operator\">=</span> combinations<span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token builtin\">int</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span> <span class=\"token keyword\">for</span> x <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> island_cnt<span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">for</span> comb <span class=\"token keyword\">in</span> comb_list<span class=\"token punctuation\">:</span>\n    comb <span class=\"token operator\">=</span> <span class=\"token builtin\">list</span><span class=\"token punctuation\">(</span>comb<span class=\"token punctuation\">)</span>\n    bridge_len <span class=\"token operator\">=</span> sys<span class=\"token punctuation\">.</span>maxsize\n    <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>N<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">for</span> j <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span>M<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n            <span class=\"token comment\"># 해당 조합에 맞는 다리 만들고 길이 최솟값 저장</span>\n            <span class=\"token keyword\">if</span> map_list<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> comb<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n                result <span class=\"token operator\">=</span> make_bridge<span class=\"token punctuation\">(</span>j<span class=\"token punctuation\">,</span> i<span class=\"token punctuation\">,</span> comb<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n                bridge_len <span class=\"token operator\">=</span> <span class=\"token builtin\">min</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">,</span> bridge_len<span class=\"token punctuation\">)</span>\n    <span class=\"token comment\"># 섬, 다리 조합 우선순위 큐에 저장</span>\n    <span class=\"token keyword\">if</span> bridge_len <span class=\"token operator\">!=</span> sys<span class=\"token punctuation\">.</span>maxsize<span class=\"token punctuation\">:</span>\n        heapq<span class=\"token punctuation\">.</span>heappush<span class=\"token punctuation\">(</span>h<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span>bridge_len<span class=\"token punctuation\">,</span> comb<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> comb<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\"># 크루스칼 알고리즘 수행</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>kruskal<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n</details>\n<hr>\n<h2 id=\"-review\" style=\"position:relative;\"><a href=\"#-review\" aria-label=\" review permalink\" class=\"anchor 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>📝 Review</h2>\n<p>DFS, BFS, MST 다 섞여있는 복잡한 문제였다.<br>\n아직은 문제를 보고 어떤 알고리즘을 사용해야 되는지 판단하는게 익숙하지 않아서 문제에 적혀있는 알고리즘 분류를 보고 문제를 풀었다,,<br>\nKruskal 알고리즘은 기억이 잘 안나서 이코테 파이썬 코드를 참고해서 다시 공부하고 구현했다.<br>\n문제마다 어떤 알고리즘을 사용해야 되는지 잘 판단할 수 있도록 연습해야겠다..!</p>\n<div class=\"table-of-contents\">\n<ul>\n<li><a href=\"#%EB%AC%B8%EC%A0%9C\">문제</a></li>\n<li><a href=\"#%EC%9E%85%EB%A0%A5\">입력</a></li>\n<li><a href=\"#%EC%B6%9C%EB%A0%A5\">출력</a></li>\n<li><a href=\"#-algorithm\">🔍 Algorithm</a></li>\n<li><a href=\"#-logic\">💻 Logic</a></li>\n<li><a href=\"#-code\">🧩 Code</a></li>\n<li><a href=\"#-review\">📝 Review</a></li>\n</ul>\n</div>","frontmatter":{"date":"March 24, 2022","title":"[BOJ] 17472번: 다리 만들기 2 (Python)","categories":"Algorithm","author":"JFe","emoji":"💻"},"fields":{"slug":"/boj-17472/"}},"site":{"siteMetadata":{"siteUrl":"https://jfelog.netlify.app","comments":{"utterances":{"repo":"Go-Jaecheol/Jfe_Blog"}}}}},"pageContext":{"slug":"/db-basic-sql-queries/","nextSlug":"/boj-17136/","prevSlug":"/boj-17472/"}},
    "staticQueryHashes": ["1073350324","1956554647","2938748437"]}