<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>dukongmon</title>
    <link>https://kongs-code.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 29 Sep 2026 14:29:40 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>duiiminish</managingEditor>
    <item>
      <title>LG전자 AX SCHOOL 1기 지원 후기</title>
      <link>https://kongs-code.tistory.com/21</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;936&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Lao4I/dJMcac4A5bV/wcukNxwZfjuBw3ayCLReAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Lao4I/dJMcac4A5bV/wcukNxwZfjuBw3ayCLReAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Lao4I/dJMcac4A5bV/wcukNxwZfjuBw3ayCLReAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLao4I%2FdJMcac4A5bV%2FwcukNxwZfjuBw3ayCLReAk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;400&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;936&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSAFY, SKALA 전형이 모두 끝난 후 최종결과를 기다리면서 LG전자 AX School을 알게되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번이 1기이긴 하지만 LG전자 주관이라는 점과 교육장소가 집에서 10분거리라는 엄청난 장점에 바로 자세히 알아봤다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;지원 동기&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-21 오후 10.45.20.png&quot; data-origin-width=&quot;1654&quot; data-origin-height=&quot;1214&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dLbSdF/dJMcaaeG5fl/fW45JqEUbiCUh8Tukwu1XK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dLbSdF/dJMcaaeG5fl/fW45JqEUbiCUh8Tukwu1XK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dLbSdF/dJMcaaeG5fl/fW45JqEUbiCUh8Tukwu1XK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdLbSdF%2FdJMcaaeG5fl%2FfW45JqEUbiCUh8Tukwu1XK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;477&quot; data-filename=&quot;스크린샷 2026-06-21 오후 10.45.20.png&quot; data-origin-width=&quot;1654&quot; data-origin-height=&quot;1214&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LG전자의 AX와 관련된 3가지 직무중 1가지를 선택할 수 있었고 이중 나는 'AI 엔지니어' 과정을 선택했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 엔지니어 과정 커리큘럼을 봤을 때 고객 데이터를 분석하고, 최종적으로 LLM&amp;middot;Agent&amp;middot;Docker 등을 활용해서 AI Agent 서비스를 구현하는 과정인 것 같았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나의 경우 대기업 부트캠프에 관심을 갖게 된 가장 큰 이유는 현업 데이터와 실제 비즈니스 문제를 기반으로 서비스 개발 프로젝트 경험을 쌓기 위함이었는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;LG전자 AX School에서 진행하는 3가지 프로젝트가 이를 충족시킬 수 있을 것 같았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;교육과정 외에 장점이라고 생각되었던 부분은 팀단위 일일미팅을 통해 교육과정이 느슨해지지 않게 유지해주는 점과 LG전자 HS본부 채용 가산점이었다!&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;전형과정&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-21 오후 10.51.47.png&quot; data-origin-width=&quot;2370&quot; data-origin-height=&quot;556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ec6CW9/dJMcabkokN9/7mhZKO8awlad79ubPkNXV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ec6CW9/dJMcabkokN9/7mhZKO8awlad79ubPkNXV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ec6CW9/dJMcabkokN9/7mhZKO8awlad79ubPkNXV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fec6CW9%2FdJMcabkokN9%2F7mhZKO8awlad79ubPkNXV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;176&quot; data-filename=&quot;스크린샷 2026-06-21 오후 10.51.47.png&quot; data-origin-width=&quot;2370&quot; data-origin-height=&quot;556&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전형 과정은 서류전형, 인적성검사, 온라인면접으로 총 세 단계였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깨알이지만 LG전자 AX School 장점중 하나는 지원 후 전형 상세 일정을 바로 알려주셨다...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반 채용도 그렇고 다른 교육과정도 상세 일정은 잘 안알려주기 때문에 항상 언제나오나 하고 기다렸는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전형 일정과 각 전형별 결과 발표일도 함께 알려주는게 별거 아니지만 너무 좋았다!!! ㅎㅅㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;서류 전형&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지원서 양식은 다른 교육과정에 비해 상대적으로 간단했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 인적사항과 함께 지원동기, 데이터분석/프로그래밍 역량, 디지털 역량 관련 자격증을 모두 100자 내외로 작성하면 됐었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;채용 지원서 작성할 때마다 700자 1000자 작성하던 것과 비교하면 너무 분량이 작아서 마음이 한결 편했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디지털 역량과 자격증은 있는대로 작성했고, 지원동기는 LG전자 AX School을 통해 얻어가고 싶은 점 위주로 작성했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지원서를 접수하고, 생각해보니 이 교육과정은 LG careers로 지원한 것도 아니고 제출 확인 메일도 안와서 전형 진행 안내가 어떻게 되나 했는데 전형 결과 및 공지사항은 모두 문자로 왔다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에 공지해준 날짜에 전형 결과와 함께 다음 전형 안내가 함께 온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;인적성 검사&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인적성 검사가 좀 걱정됐었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SKALA의 경우 홈페이지에 SKCT 전과정이 아니라 심층 검사만 진행한다고 공지되어있는데, LG전자 AX School은 별다른 공지가 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러다 누군가 문의를 한건지 최소한의 요건만 평가하기 때문에 부담없이 응시해도 된다는 안내 문자가 왔다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인적성 검사를 실제로 응시해보니 LG Way Fit은 아니었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램을 따로 다운받지도 않았고, 그냥 메일로 온 검사 사이트에서 응시했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소요시간은 90분 정도 걸렸고, 시험은 일반 대기업 인적성검사 문제들과 인성검사 2종류로 총 세 종류로 구성되었었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제 난이도는 왜 부담없이 응시해도 된다고 했는지 알 수 있었던 정도였다. &lt;span style=&quot;color: #9d9d9d;&quot;&gt;(인적성 검사 준비해본 경험이 없어도 그냥 풀 수 있는 정도?)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 제한시간이 좀 당황스러웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 인적성 검사는 큰 카테고리와 제한시간을 주는데 (ex. 언어 N문제 15분, 수리 N문제 15분)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 검사는 카테고리도 여러가지고 제한시간도 상대적으로 짧아서 처음엔 연습문제인가? 하고 천천히 구경하다가 첫 카테고리 그냥 날렸다 ㅎ하핳ㅎ하&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무튼 대기업 인적성검사 공부를 시작한지 얼마 안됐기에... LG Way Fit 그대로였다면 꽤 힘들었을 것 같다...힛&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;온라인 면접&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인적성 검사 전형까지 합격하고 마지막으로 온라인 면접을 안내받았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LG전자 AX School 전형 중에 SKALA 합격 결과를 받아서 온라인 면접은 응시하지 않기로 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;응시하지는 않았지만, 안내 문자를 보니 면접은 30분 정도 소요되고 다대다 면접인 것 같았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>etc./회고</category>
      <category>1기</category>
      <category>AX School</category>
      <category>LG전자</category>
      <author>duiiminish</author>
      <guid isPermaLink="true">https://kongs-code.tistory.com/21</guid>
      <comments>https://kongs-code.tistory.com/21#entry21comment</comments>
      <pubDate>Mon, 22 Jun 2026 14:37:41 +0900</pubDate>
    </item>
    <item>
      <title>SKALA 4기 합격 수기</title>
      <link>https://kongs-code.tistory.com/20</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2466&quot; data-origin-height=&quot;916&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ho76C/dJMcabEBl4Y/3o0vcTBLbJsRkjceKj6AM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ho76C/dJMcabEBl4Y/3o0vcTBLbJsRkjceKj6AM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ho76C/dJMcabEBl4Y/3o0vcTBLbJsRkjceKj6AM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHo76C%2FdJMcabEBl4Y%2F3o0vcTBLbJsRkjceKj6AM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2466&quot; height=&quot;916&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2466&quot; data-origin-height=&quot;916&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SKALA 야호 마떼루용 &lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2026 상반기 AI 엔지니어 직무로 첫 취준을 해보며 느낀 점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2026년 상반기가 끝나고 그동안 지원한 AI 엔지니어 직무 채용 공고를 분석하며 기업들이 요구하는 역량에 대해 다시 생각해보게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삼성리서치, CJ제일제당 BIO AI, 롯데이노베이트 등 여러 기업의 JD를 살펴보며 느낀 점은, 기업들은 AI 이론과 모델 구현 능력은 기본 역량으로 보고, '데이터 처리, 소프트웨어 개발, Cloud&amp;middot;MLOps, LLM&amp;middot;Agent 서비스 개발 역량, 비즈니스 문제 정의 및 해결 능력'을 중요하게 보는 것 같았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 서비스 개발 능력 + 인공지능 인재를 원하는 느낌...!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나의 경우 AI 석사 과정을 거치며 연구 및 모델 개발 경험은 있었지만, 실제 서비스 환경에서 요구되는 Cloud&amp;middot;MLOps&amp;middot;Backend&amp;middot;서비스 개발 경험과 산업 문제를 정의하여 서비스로 연결하는 경험은 상대적으로 부족하다고 판단했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 그동안 진행했던 의료 AI 도메인 프로젝트들은 연구적으로는 의미가 있었지만, 채용 과정에서 직관적으로 실력을 보여줄 수 있는 서비스형 프로젝트나 산업 문제 해결 사례는 부족하다고 느껴졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 고민 끝에 나는 부족한 부분을 보완하기 위한 선택지로 SKALA를 선택하게 되었다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;SKALA를 선택한 이유&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-19 오후 4.11.09.png&quot; data-origin-width=&quot;2114&quot; data-origin-height=&quot;1086&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FZazN/dJMcaffZ4fr/UTfJVrOPoYWdzJzA8iraCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FZazN/dJMcaffZ4fr/UTfJVrOPoYWdzJzA8iraCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FZazN/dJMcaffZ4fr/UTfJVrOPoYWdzJzA8iraCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFZazN%2FdJMcaffZ4fr%2FUTfJVrOPoYWdzJzA8iraCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2114&quot; height=&quot;1086&quot; data-filename=&quot;스크린샷 2026-06-19 오후 4.11.09.png&quot; data-origin-width=&quot;2114&quot; data-origin-height=&quot;1086&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;솔직히 SSAFY랑 SKALA를 둘다 지원했고, 어떤 과정을 선택할지 고민했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSFAY 역시 AI 이론, 코딩 공부, 데이터 처리, 프로젝트 등 탄탄한 교육과정이고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반년동안 공부하고 반년동안 프로젝트를 한다는 점에서 충분한 학습과 프로젝트 경험을 모두 가져갈 수 있다는 점은 큰 장점이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 내가 이번에 부트캠프를 하는 가장 큰 이유는 &lt;b&gt;'현업 문제를 다루는 프로젝트 경험'&lt;/b&gt;을 쌓는 것이기 때문에 이를 위해 반년을 기다려야 한다는 점이 아쉬웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 점에서 SKALA는 내가 부족하다고 느낀 부분들을 집중적으로 보완할 수 있는 과정이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 &lt;b&gt;백엔드, 데이터분석, AIOps, Cloud(쿠버네티스, DevOps), SK 현업 문제를 다루는 AI 프로젝트&lt;/b&gt;를 배우고 경험할 수 있다는 점이 매우 매력적이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 프로젝트 전 과정에서는 현직자 멘토링이 함께하기 때문에 실무적으로 배울 점이 많을 것 같았다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Gemini_Generated_Image_nkrjkjnkrjkjnkrj.png&quot; data-origin-width=&quot;1597&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HXWGP/dJMcaf1hVzl/e6N99h8Nil40bOSVzm0Gj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HXWGP/dJMcaf1hVzl/e6N99h8Nil40bOSVzm0Gj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HXWGP/dJMcaf1hVzl/e6N99h8Nil40bOSVzm0Gj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHXWGP%2FdJMcaf1hVzl%2Fe6N99h8Nil40bOSVzm0Gj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;722&quot; height=&quot;304&quot; data-filename=&quot;Gemini_Generated_Image_nkrjkjnkrjkjnkrj.png&quot; data-origin-width=&quot;1597&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 하나 크게 고려했던 부분은 &lt;b&gt;'채용 연계&lt;/b&gt;'였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SKALA는 교육 과정 우수 수료자들에게 SK그룹 채용 연계 기회를 제공해주는데, 요즘 같이 어려운 채용 시장에서는 이런 채용 연계 기회가 중요하다는걸 지난 상반기에 정말 많이 느꼈다... &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;심지어 수료생 전원에게 SK AX 채용 연계 기회를 제공하고,&amp;nbsp;26년부터는 아예 SKALA 수료생을 대상으로만 채용을 진행한다니... 대박사건..bb&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;전형과정&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2391&quot; data-origin-height=&quot;1348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qzrOe/dJMcahrlRUw/gJbDSzdSxSxdL2swEDQQOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qzrOe/dJMcahrlRUw/gJbDSzdSxSxdL2swEDQQOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qzrOe/dJMcahrlRUw/gJbDSzdSxSxdL2swEDQQOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqzrOe%2FdJMcahrlRUw%2FgJbDSzdSxSxdL2swEDQQOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2391&quot; height=&quot;1348&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2391&quot; data-origin-height=&quot;1348&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전형 과정은&amp;nbsp;서류 접수, SKCT + AI 역량면접으로 크게 두 단계였다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;지원서 접수&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 4기에서는 캠퍼스가 3개로 늘어난만큼 입과 희망 캠퍼스 1,2,3지망을 작성할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 나는 연고가 없는 광주, 울산에 5개월간 내려갈 자신이 없어서 1지망만 작성했었다...ㅎㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지원서에서 특이했던 점은 경험 기술서 부분이 구체적이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 언어, 개발 환경, 데이터베이스, AI/Data에 대한 활용 수준을 각각 최대 5개까지 기재해야했는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 인공지능 직무와 밀접하다고 생각되는 순으로 가능한 꽉꽉 채워넣었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자소서는 지원동기(800자 이내)와 기술 경험(1000자 이내) 총 두 문항으로 구성되어있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지원동기는 SKALA가 교육과정이라는 점에서 SKALA를 통해 얻어가고 싶은 점과 내 목표 위주로 작성했고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기술 경험은 AI 경험 관련 어려움 극복 경험 문항이라서 SK 인재상을 참고하며 상황설명, 구체적인 나의 역할, 느낀점 위주로 작성했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외에 &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;github, 블로그, 노션, 드라이브 공유 링크 등 추가 자료를 제출할 수 있는 란이 있었는데 따로 제출하지 않았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;(근데 오픈카톡에서 다른 사람들이 이 부분 화려하게 제출한걸 알고 좀 쫄렸음,,ㅎ)&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;SKCT + AI 역량면접&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;SKALA SKCT는 SK그룹 채용과 달리 온라인으로 심층 검사만 진행해서 그냥 마음 편히 봤다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;파워 I인 INTJ이지만 살짝 활발한 척만 조금 했달까 하핳ㅎㅎ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;AI 역량면접이 좀 충격적이었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;JOBDA 외에 AI 면접을 SKALA에서 처음 봤는데 그냥 사람이랑 면접보는 느낌이라 기술의 발전에 놀랐달까..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;지원서 기반으로 질문이 나오지 않을까 해서 클로드랑 예상 질문 열심히 뽑아봤는데 별로 의미 없었던 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;오히려 JOBDA AI 면접 문항 기준으로 예전부터 면접스터디 해왔던게 도움이 되었다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;SKALA랑 별개로 예전부터 면접스터디를 했었는데 여러 경험기반 질문에 대해 고민하고 내 경험을 계속 정리해왔던게 많은 도움이 되었다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;누군가 이 글을 본다면.. 자소서랑 본인 프로젝트 및 경험 정리를 하시는걸 추천드립니당 b&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;결과&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1406&quot; data-origin-height=&quot;1826&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UEMLj/dJMcaayYRei/OULZToyOfR16XEzi84GJ70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UEMLj/dJMcaayYRei/OULZToyOfR16XEzi84GJ70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UEMLj/dJMcaayYRei/OULZToyOfR16XEzi84GJ70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUEMLj%2FdJMcaayYRei%2FOULZToyOfR16XEzi84GJ70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;525&quot; height=&quot;682&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1406&quot; data-origin-height=&quot;1826&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전형을 다 끝내고, 어디서 솟아나는지 모를 근자감이 들었다. ㅋㅎㅋㅎㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 지난 상반기 채용 때도 항상 근자감'만'은 있었는데 다 떨어져서 너무 슬펐지만 SKALA는 다행히 붙어서 간만에 기분이 좋았다 히히&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5개월간 매일 왕복 3시간 통학하며 저 커리큘럼을 내 것으로 만들려면 부단히 노력해야겠지만,,,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에 정리했던 부족한 역량들을 보완하고 채용 연계까지 잡을 수 있도록 최선을 다해볼 생각이다.&amp;nbsp;아쟈쟈&lt;/p&gt;</description>
      <category>etc./회고</category>
      <category>SK</category>
      <category>skala</category>
      <author>duiiminish</author>
      <guid isPermaLink="true">https://kongs-code.tistory.com/20</guid>
      <comments>https://kongs-code.tistory.com/20#entry20comment</comments>
      <pubDate>Fri, 19 Jun 2026 18:46:26 +0900</pubDate>
    </item>
    <item>
      <title>[그래프] 깊이/너비 우선 탐색(DFS/BFS)문제 6</title>
      <link>https://kongs-code.tistory.com/19</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제&amp;nbsp;설명&lt;/b&gt;&lt;br /&gt;n개의 섬 사이에 다리를 건설하는 비용(costs)이 주어질 때, 최소의 비용으로 모든 섬이 서로 통행 가능하도록 만들 때 필요한 최소 비용을 return 하도록 solution을 완성하세요.&lt;br /&gt;다리를&amp;nbsp;여러&amp;nbsp;번&amp;nbsp;건너더라도,&amp;nbsp;도달할&amp;nbsp;수만&amp;nbsp;있으면&amp;nbsp;통행&amp;nbsp;가능하다고&amp;nbsp;봅니다.&amp;nbsp;예를&amp;nbsp;들어&amp;nbsp;A&amp;nbsp;섬과&amp;nbsp;B&amp;nbsp;섬&amp;nbsp;사이에&amp;nbsp;다리가&amp;nbsp;있고,&amp;nbsp;B&amp;nbsp;섬과&amp;nbsp;C&amp;nbsp;섬&amp;nbsp;사이에&amp;nbsp;다리가&amp;nbsp;있으면&amp;nbsp;A&amp;nbsp;섬과&amp;nbsp;C&amp;nbsp;섬은&amp;nbsp;서로&amp;nbsp;통행&amp;nbsp;가능합니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;제한사항&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;섬의 개수 n은 1 이상 100 이하입니다.&lt;/li&gt;
&lt;li&gt;costs의&amp;nbsp;길이는&amp;nbsp;((n-1)&amp;nbsp;*&amp;nbsp;n)&amp;nbsp;/&amp;nbsp;2이하입니다.&lt;/li&gt;
&lt;li&gt;임의의&amp;nbsp;i에&amp;nbsp;대해,&amp;nbsp;costs[i][0]&amp;nbsp;와&amp;nbsp;costs[i]&amp;nbsp;[1]에는&amp;nbsp;다리가&amp;nbsp;연결되는&amp;nbsp;두&amp;nbsp;섬의&amp;nbsp;번호가&amp;nbsp;들어있고,&amp;nbsp;&lt;br /&gt;costs[i]&amp;nbsp;[2]에는&amp;nbsp;이&amp;nbsp;두&amp;nbsp;섬을&amp;nbsp;연결하는&amp;nbsp;다리를&amp;nbsp;건설할&amp;nbsp;때&amp;nbsp;드는&amp;nbsp;비용입니다.&lt;/li&gt;
&lt;li&gt;같은&amp;nbsp;연결은&amp;nbsp;두&amp;nbsp;번&amp;nbsp;주어지지&amp;nbsp;않습니다.&amp;nbsp;또한&amp;nbsp;순서가&amp;nbsp;바뀌더라도&amp;nbsp;같은&amp;nbsp;연결로&amp;nbsp;봅니다.&amp;nbsp;&lt;br /&gt;즉&amp;nbsp;0과&amp;nbsp;1&amp;nbsp;사이를&amp;nbsp;연결하는&amp;nbsp;비용이&amp;nbsp;주어졌을&amp;nbsp;때,&amp;nbsp;1과&amp;nbsp;0의&amp;nbsp;비용이&amp;nbsp;주어지지&amp;nbsp;않습니다.&lt;/li&gt;
&lt;li&gt;모든&amp;nbsp;섬&amp;nbsp;사이의&amp;nbsp;다리&amp;nbsp;건설&amp;nbsp;비용이&amp;nbsp;주어지지&amp;nbsp;않습니다.&amp;nbsp;이&amp;nbsp;경우,&amp;nbsp;두&amp;nbsp;섬&amp;nbsp;사이의&amp;nbsp;건설이&amp;nbsp;불가능한&amp;nbsp;것으로&amp;nbsp;봅니다.&lt;/li&gt;
&lt;li&gt;연결할&amp;nbsp;수&amp;nbsp;없는&amp;nbsp;섬은&amp;nbsp;주어지지&amp;nbsp;않습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;입출력&amp;nbsp;예&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 54.1861%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 6.70539%; text-align: center;&quot;&gt;n&lt;/td&gt;
&lt;td style=&quot;width: 37.2029%; text-align: center;&quot;&gt;costs&lt;/td&gt;
&lt;td style=&quot;width: 12.4364%; text-align: center;&quot;&gt;return&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 6.70539%; text-align: center;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 37.2029%; text-align: center;&quot;&gt;[[0,1,1],[0,2,2],[1,2,5],[1,3,1],[2,3,8]]&lt;/td&gt;
&lt;td style=&quot;width: 12.4364%; text-align: center;&quot;&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJvDsh/dJMcaaeyRo4/AfFyACTUaatCjCOA1OAID0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJvDsh/dJMcaaeyRo4/AfFyACTUaatCjCOA1OAID0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJvDsh/dJMcaaeyRo4/AfFyACTUaatCjCOA1OAID0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJvDsh%2FdJMcaaeyRo4%2FAfFyACTUaatCjCOA1OAID0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;322&quot; height=&quot;293&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;748&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;오답노트&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[처음에 접근한 방식과 코드]&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;처음에는 모든 섬이 연결만되면 된다는거니까 각 노드에 연결된 edge중 가중치가 가장 작은걸 선택하면 되는거 아닌가?라고 생각함&lt;/li&gt;
&lt;li&gt;테스트 케이스는 통과됐지만, 채점에서 막힘&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1781093750405&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(n, costs):
    answer = 0

    #각 노드에서 연결된 edge 중 가장 가중치가 적은거 고르면 되는거 아닌가?
    cost_graph = {}
    graph =[[] for _ in range(n)]
    low_cost = [0 for _ in range(n)]

    for x,y,z in costs :
        cost_graph[(min(x,y),max(x,y))] = z
        graph[x].append(y)
        graph[y].append(x)

    for i in range(n) :
        min_c = float('inf')
        for j in graph[i] :
            cost = cost_graph[(min(i,j),max(i,j))]
            if min_c &amp;gt; cost :
                print(&quot;cost : &quot;, cost)
                min_c = cost
                low_cost[i] = (min(i,j),max(i,j))

    low_cost=set(low_cost)
    for i in low_cost :
        answer += cost_graph[i]

    return answer


n = 4
costs = [[0,1,1],[0,2,2],[1,2,5],[1,3,1],[2,3,8]]
print(solution(n,costs))&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이전 코드의 문제점 &amp;rarr; 전체 최소 연결이 보장되지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-10 오후 9.19.45.png&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bd91Ss/dJMcahxYuJy/vuNBwpRIKDlYnOA7xUKoWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bd91Ss/dJMcahxYuJy/vuNBwpRIKDlYnOA7xUKoWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bd91Ss/dJMcahxYuJy/vuNBwpRIKDlYnOA7xUKoWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbd91Ss%2FdJMcahxYuJy%2FvuNBwpRIKDlYnOA7xUKoWK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;374&quot; height=&quot;210&quot; data-filename=&quot;스크린샷 2026-06-10 오후 9.19.45.png&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;444&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예를 들어 이런 모양의 그래프가 있다고 할 때, 각 노드에서 가중치가 가장 작은 edge를 고르면 0,1,2 노드끼리 사이클이 생김&lt;/li&gt;
&lt;li&gt;하지만 0-2 노드 사이에 간선이 없어도 전체 그래프 연결이 되기 때문에 이는 최소 연결이 아님&lt;/li&gt;
&lt;li&gt;이런 &lt;b&gt;모든 노드가 연결되고 사이클이 없는 그래프&lt;/b&gt;를 &lt;b&gt;신장 트리(Spanning Tree)&lt;/b&gt;라고 하고&lt;/li&gt;
&lt;li&gt;가중치가 있다고 했을 때, 모든 노드를 연결하며 사이클이 없는데 &lt;b&gt;총 비용이 최소인 그래프&lt;/b&gt;를 &lt;b&gt;최소 신장 트리(Minimum Spanning Tree)&lt;/b&gt; 라고 함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MST&lt;/b&gt; 특징은 edge가 반드시 N-1개여야 하고&lt;/li&gt;
&lt;li&gt;MST를 만들기 위해 크루스칼 알고리즘과 Union-Find를 많이 씀&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1781192158087&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(n, costs):
    answer = 0

    # 처음에는 모든 섬이 자기 자신 그룹
    parent = [i for i in range(n)]

    # x섬이 현재 어느 그룹에 속해있나? 확인
    def find(x):
        if parent[x] != x:
            parent[x] = find(parent[x])
        return parent[x]

    # 두 그룹을 합치는 함수
    # a와 b를 연결해도 괜찮은가? 검사
    def union(a, b):
        root_a = find(a)
        root_b = find(b)

        if root_a == root_b:
            return False  # 이미 같은 그룹 &amp;rarr; 사이클 발생

        parent[root_b] = root_a
        return True

    # 비용 기준으로 정렬해서 가장 비용이 싼 다리부터 보겠다
    # 근데 sort 함수는 기본적으로 각 리스트의 앞에서부터 비교하며 정렬함
    # key=lambda x: x[2] x는 costs 리스트의 각 원소를 의미 ex.costs[0]
    # 근데 우리는 비용 기준이니까 costs[i][2]를 봐야하니까 x[2]
    costs.sort(key=lambda x: x[2]) # 즉, costs 리스트의 2번 원소 기준으로 정렬해
    print(costs)

    edge_count = 0

    for a, b, cost in costs:
        if union(a, b):
            answer += cost
            print(parent)
            print(answer)
            edge_count += 1

            if edge_count == n - 1:
                break

    return answer


n = 4
costs = [[0,1,1],[0,2,2],[1,2,5],[1,3,1],[2,3,8]]
print(solution(n,costs))&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시행착오 및 배운점&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJvDsh/dJMcaaeyRo4/AfFyACTUaatCjCOA1OAID0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJvDsh/dJMcaaeyRo4/AfFyACTUaatCjCOA1OAID0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJvDsh/dJMcaaeyRo4/AfFyACTUaatCjCOA1OAID0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJvDsh%2FdJMcaaeyRo4%2FAfFyACTUaatCjCOA1OAID0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;237&quot; height=&quot;216&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;748&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#1 MST&lt;b&gt;(Minimum Spanning Tree)&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; : &lt;b&gt;&lt;b&gt;최소 신장 트리&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MST : 가중치가 있다고 했을 때, 모든 노드를 연결하며 사이클이 없는데&lt;span&gt;&amp;nbsp;&lt;/span&gt;총 비용이 최소인 그래프&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;[용어]&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;노드(Node) = 정점&lt;span style=&quot;color: #006dd7;&quot;&gt;(섬)&lt;/span&gt; : 그래프에서 동그라미에 해당되는 부분&lt;/li&gt;
&lt;li&gt;간선(Edge) = 거리&lt;span style=&quot;color: #006dd7;&quot;&gt;(비용)&lt;/span&gt; : 그래프에서 선에 해당되는 부분&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;오른쪽 예시에서는 4개의 노드와 5개의 엣지로 구성됨&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;MST 특징&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;MST를 만들기 위해 '크루스칼 알고리즘'과 'Union-Find'를 많이 씀&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;사용되는 Edge의 개수는 반드시 &quot; Node 개수 - 1 &quot;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;사이클이 생기면 절대 X&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) Union-Find 알고리즘 (합집합 찾기)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대표적인 그래프 알고리즘&lt;/li&gt;
&lt;li&gt;'합집합 찾기' 또는 '서로소 집합(Disjoint-Set) 알고리즘'이라고 불림&lt;/li&gt;
&lt;li&gt;여러개의 노드가 존재할 때, 2개의 노드를 선택해서 이 두 노드가 현재 서로 같은 그래프에 속하는지 판별하는 알고리즘&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) 크루스칼 알고리즘(Kruskal Algorithm)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;가장 적은 비용&lt;/b&gt;으로 &lt;b&gt;모든 노드를 연결&lt;/b&gt;하기 위해 사용하는 알고리즘&lt;/li&gt;
&lt;li&gt;그래프를 입력받아서 MST(트리)를 만드는 알고리즘&lt;/li&gt;
&lt;li&gt;모든 노드를 최대한 적은 비용으로 연결시키면 되기 때문에 아래 순서로 알고리즘 작동
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 Edge 정보(비용)를 기준으로 오름차순으로 정렬&lt;/li&gt;
&lt;li&gt;이후 비용이 적은 Edge부터 차근차근 그래프에 포함시키기&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;단, 사이클이 발생되지 않아야 함 (사이클 발생 = 트리 X)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;따라서 사이클이 형성되는 경우 해당 Edge는 그래프에 포함시키지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1781267277277&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;MST와 Union-Find, Kruskal 알고리즘&quot; data-og-description=&quot;[그래프 용어]노드(Node) = 정점 : 그래프에서 동그라미에 해당되는 부분간선(Edge) = 거리(가중치) : 그래프에서 선에 해당되는 부분오른쪽 예시에서는 4개의 노드와 5개의 엣지로 구성됨 1) Union-Find &quot; data-og-host=&quot;kongs-code.tistory.com&quot; data-og-source-url=&quot;https://kongs-code.tistory.com/18&quot; data-og-url=&quot;https://kongs-code.tistory.com/18&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cjmtR8/dJMb8TCihfA/BgWn073pcKmBgJOyKkAsk0/img.png?width=800&amp;amp;height=449&amp;amp;face=0_0_800_449,https://scrap.kakaocdn.net/dn/YD4xz/dJMb84qg4eW/MUBntWYCxToRwKZeK8k5Dk/img.png?width=800&amp;amp;height=449&amp;amp;face=0_0_800_449,https://scrap.kakaocdn.net/dn/dzT0Bg/dJMb87N5bX4/I8kkQzPmugzc5fro1pjKck/img.png?width=1282&amp;amp;height=686&amp;amp;face=0_0_1282_686&quot;&gt;&lt;a href=&quot;https://kongs-code.tistory.com/18&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://kongs-code.tistory.com/18&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cjmtR8/dJMb8TCihfA/BgWn073pcKmBgJOyKkAsk0/img.png?width=800&amp;amp;height=449&amp;amp;face=0_0_800_449,https://scrap.kakaocdn.net/dn/YD4xz/dJMb84qg4eW/MUBntWYCxToRwKZeK8k5Dk/img.png?width=800&amp;amp;height=449&amp;amp;face=0_0_800_449,https://scrap.kakaocdn.net/dn/dzT0Bg/dJMb87N5bX4/I8kkQzPmugzc5fro1pjKck/img.png?width=1282&amp;amp;height=686&amp;amp;face=0_0_1282_686');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;MST와 Union-Find, Kruskal 알고리즘&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;[그래프 용어]노드(Node) = 정점 : 그래프에서 동그라미에 해당되는 부분간선(Edge) = 거리(가중치) : 그래프에서 선에 해당되는 부분오른쪽 예시에서는 4개의 노드와 5개의 엣지로 구성됨 1) Union-Find&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;kongs-code.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;#2 lambda 함수&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;익명 함수라고도 불리며, 간단한 한줄짜리 함수를 정의할 때 사용됨&lt;/li&gt;
&lt;li&gt;복잡한 로직이나 여러줄의 코드 처리에는 적합하지 않음&lt;/li&gt;
&lt;li&gt;함수이지만 def 키워드를 사용하지 않고 lambda 키워드로 함수 정의&lt;/li&gt;
&lt;li&gt;주로 filter(), map(), sorted() 등의 함수와 함께 사용되며 함수 인자로 전달되는 경우가 많음&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1781266742558&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;lambda arguments : expression&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;lambda : 람다 함수 정의 키워드&lt;/li&gt;
&lt;li&gt;arguments : 람다 함수에 전달되는 인자들. 쉼표로 구분해서 여러 인자 전달 가능&lt;/li&gt;
&lt;li&gt;expression : 표현식. 이 표현식의 결과가 람다 함수의 return 값이 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 더하기 함수를 람다 함수로 구현하면 아래와 같음&lt;/p&gt;
&lt;pre id=&quot;code_1781266973566&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;add = lambda a, b: a + b
print(add(10,20))&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1781266990488&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;30&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Python/Coding-test</category>
      <category>MST</category>
      <category>python</category>
      <category>그래프</category>
      <category>크루스칼</category>
      <author>duiiminish</author>
      <guid isPermaLink="true">https://kongs-code.tistory.com/19</guid>
      <comments>https://kongs-code.tistory.com/19#entry19comment</comments>
      <pubDate>Fri, 12 Jun 2026 21:28:29 +0900</pubDate>
    </item>
    <item>
      <title>MST와 Union-Find, Kruskal 알고리즘</title>
      <link>https://kongs-code.tistory.com/18</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock floatRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJvDsh/dJMcaaeyRo4/AfFyACTUaatCjCOA1OAID0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJvDsh/dJMcaaeyRo4/AfFyACTUaatCjCOA1OAID0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJvDsh/dJMcaaeyRo4/AfFyACTUaatCjCOA1OAID0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJvDsh%2FdJMcaaeyRo4%2FAfFyACTUaatCjCOA1OAID0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;174&quot; height=&quot;158&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;748&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;[그래프 용어]&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;노드(Nod&lt;span style=&quot;color: #000000;&quot;&gt;e) = 정점&amp;nbsp;: 그래프에서 동그라미에 해당되는 부분&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;간선(Edge) = 거리(가중치) : &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래프에서 선에 해당되는 부분&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;오른쪽 예시에서는 4개의 노드와 5개의 엣지로 구성됨&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1) Union-Find 알고리즘 (합집합 찾기)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대표적인 그래프 알고리즘&lt;/li&gt;
&lt;li&gt;'&lt;b&gt;합집합 찾기&lt;/b&gt;' 또는 '&lt;b&gt;서로소 집합(Disjoint-Set) 알고리즘&lt;/b&gt;'이라고 불림&lt;/li&gt;
&lt;li&gt;여러개의 노드가 존재할 때, 2개의 노드를 선택해서 이 두 노드가 현재 서로 같은 그래프에 속하는지 판별하는 알고리즘&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-12 오후 5.03.54.png&quot; data-origin-width=&quot;1282&quot; data-origin-height=&quot;686&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vqBH6/dJMcacQWTGA/UrXBISUazos9S7deXmW1M0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vqBH6/dJMcacQWTGA/UrXBISUazos9S7deXmW1M0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vqBH6/dJMcacQWTGA/UrXBISUazos9S7deXmW1M0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvqBH6%2FdJMcacQWTGA%2FUrXBISUazos9S7deXmW1M0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;257&quot; data-filename=&quot;스크린샷 2026-06-12 오후 5.03.54.png&quot; data-origin-width=&quot;1282&quot; data-origin-height=&quot;686&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위와 같이 아직 연결되지 않은 8개의 노드가 있다고 하자&lt;/li&gt;
&lt;li&gt;현재는 각 노드가 자기 자신만을 원소로 갖기 때문에 8개의 집합이 생김&lt;/li&gt;
&lt;li&gt;이를 테이블로 만들면 아래와 같이 만들 수 있음 (= 모든 값이 자기 자신을 가리키도록 테이블 생성)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-12 오후 5.07.28.png&quot; data-origin-width=&quot;1100&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHdsFm/dJMcagMFpec/cnK0ZAimPJZe0SLt4PqYeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHdsFm/dJMcagMFpec/cnK0ZAimPJZe0SLt4PqYeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHdsFm/dJMcagMFpec/cnK0ZAimPJZe0SLt4PqYeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHdsFm%2FdJMcagMFpec%2FcnK0ZAimPJZe0SLt4PqYeK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;95&quot; data-filename=&quot;스크린샷 2026-06-12 오후 5.07.28.png&quot; data-origin-width=&quot;1100&quot; data-origin-height=&quot;262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;테이블 첫 행은 각 노드의 번호&lt;/li&gt;
&lt;li&gt;두번째 행은 부모 노드(집합) 번호&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1781254132196&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 부모 테이블 초기화
parent = [i for i in range(n)]&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-12 오후 5.03.51.png&quot; data-origin-width=&quot;1282&quot; data-origin-height=&quot;686&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lxHeL/dJMcaicEjBc/vo6lPCU6If9EeBaiod8Eq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lxHeL/dJMcaicEjBc/vo6lPCU6If9EeBaiod8Eq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lxHeL/dJMcaicEjBc/vo6lPCU6If9EeBaiod8Eq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlxHeL%2FdJMcaicEjBc%2Fvo6lPCU6If9EeBaiod8Eq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;257&quot; data-filename=&quot;스크린샷 2026-06-12 오후 5.03.51.png&quot; data-origin-width=&quot;1282&quot; data-origin-height=&quot;686&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이때 노드 0과 노드 1이 연결되었다고 하자&lt;/li&gt;
&lt;li&gt;이러한 연결성에 대해 프로그래밍 언어로 어떻게 표현할 수 있나?&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&amp;rArr; &lt;/span&gt;확인하는 2개의 노드 중 더 작은 번호 노드를 부모 노드로 설정하자(=합집합을 만들자)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-12 오후 5.07.44.png&quot; data-origin-width=&quot;1100&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xdlF2/dJMcaicEkgW/x7VT4dCJ7XQ1AJWU0PXkm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xdlF2/dJMcaicEkgW/x7VT4dCJ7XQ1AJWU0PXkm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xdlF2/dJMcaicEkgW/x7VT4dCJ7XQ1AJWU0PXkm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxdlF2%2FdJMcaicEkgW%2Fx7VT4dCJ7XQ1AJWU0PXkm0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;95&quot; data-filename=&quot;스크린샷 2026-06-12 오후 5.07.44.png&quot; data-origin-width=&quot;1100&quot; data-origin-height=&quot;262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;따라서 parent_table[1] = 0이 됨&lt;/li&gt;
&lt;li&gt;이렇게 부모 노드(집합)를 합칠 때는 일반적으로 더 작은 값 기준으로 합치며, 이를 &lt;b&gt;Union(합침)&lt;/b&gt;이라고 함&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-12 오후 5.03.47.png&quot; data-origin-width=&quot;1282&quot; data-origin-height=&quot;686&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/extv4y/dJMcaaeADgu/BNeJvxjWiiZoMn1yF1Wwm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/extv4y/dJMcaaeADgu/BNeJvxjWiiZoMn1yF1Wwm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/extv4y/dJMcaaeADgu/BNeJvxjWiiZoMn1yF1Wwm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fextv4y%2FdJMcaaeADgu%2FBNeJvxjWiiZoMn1yF1Wwm0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;257&quot; data-filename=&quot;스크린샷 2026-06-12 오후 5.03.47.png&quot; data-origin-width=&quot;1282&quot; data-origin-height=&quot;686&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;동일한 방식으로 노드 0과 노드 2가 연결되면&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-12 오후 5.07.52.png&quot; data-origin-width=&quot;1100&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmJdth/dJMcahx0f27/v8FRfrLfwsVL8sVqVrpLXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmJdth/dJMcahx0f27/v8FRfrLfwsVL8sVqVrpLXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmJdth/dJMcahx0f27/v8FRfrLfwsVL8sVqVrpLXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmJdth%2FdJMcahx0f27%2Fv8FRfrLfwsVL8sVqVrpLXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;95&quot; data-filename=&quot;스크린샷 2026-06-12 오후 5.07.52.png&quot; data-origin-width=&quot;1100&quot; data-origin-height=&quot;262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;parent_table은 parent_table[2] = 0 으로 바뀜&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-12 오후 5.03.43.png&quot; data-origin-width=&quot;1282&quot; data-origin-height=&quot;686&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmlVyd/dJMcacXKben/rKZ4OsL3goclMBYzdmwYE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmlVyd/dJMcacXKben/rKZ4OsL3goclMBYzdmwYE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmlVyd/dJMcacXKben/rKZ4OsL3goclMBYzdmwYE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmlVyd%2FdJMcacXKben%2FrKZ4OsL3goclMBYzdmwYE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;257&quot; data-filename=&quot;스크린샷 2026-06-12 오후 5.03.43.png&quot; data-origin-width=&quot;1282&quot; data-origin-height=&quot;686&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;동일한 방식으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;노드 2와 노드 4가 연결되면&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-12 오후 5.31.37.png&quot; data-origin-width=&quot;1100&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYGMdR/dJMcahSfij5/kvnaCa8Wnok5P1pkcdVg91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYGMdR/dJMcahSfij5/kvnaCa8Wnok5P1pkcdVg91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYGMdR/dJMcahSfij5/kvnaCa8Wnok5P1pkcdVg91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYGMdR%2FdJMcahSfij5%2FkvnaCa8Wnok5P1pkcdVg91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;95&quot; data-filename=&quot;스크린샷 2026-06-12 오후 5.31.37.png&quot; data-origin-width=&quot;1100&quot; data-origin-height=&quot;262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;parent_table은&lt;span&gt;&amp;nbsp;&lt;/span&gt;parent_table[4] = 2 로 바뀜&lt;/li&gt;
&lt;li&gt;그럼 이때 노드 0,1,2는 부모 노드가 0을 동일하게 가리키고 있는데, &lt;br /&gt;노드 4는 그래프가 연결되었는지 또는 동일한 집합인지 어떻게 알 수 있나?&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&amp;rArr; Find() 라는 재귀 함수를 활용해서 최종 부모 노드를 찾아가게 하자!&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;노드 4는 노드 2를 가리키고 있고, 노드 2는 노드 0을 가리키고 있다.&lt;br /&gt;즉, 노드 4도 노드 0을 가리키도록 함수가 find 함수&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-12 오후 5.08.03.png&quot; data-origin-width=&quot;1100&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKCSzm/dJMcadh434O/9GAXgfzeIjJaz2Tiq4sMc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKCSzm/dJMcadh434O/9GAXgfzeIjJaz2Tiq4sMc1/img.png&quot; data-alt=&quot;코드 상에서 union(2,4)는 위와 같이 바로 Parent[4]=0이 된다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKCSzm/dJMcadh434O/9GAXgfzeIjJaz2Tiq4sMc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKCSzm%2FdJMcadh434O%2F9GAXgfzeIjJaz2Tiq4sMc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;95&quot; data-filename=&quot;스크린샷 2026-06-12 오후 5.08.03.png&quot; data-origin-width=&quot;1100&quot; data-origin-height=&quot;262&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;코드 상에서 union(2,4)는 위와 같이 바로 Parent[4]=0이 된다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;parent_table[4]&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;parent_table[2]&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;parent_table[0] = 0&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;다시말해, Find 알고리즘은 확인하려는 노드의 최종 부모 노드를 찾는 것&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;이와 같이 연결되는 노드들을 Find 알고리즘을 통해 부모 노드로 Union 시키는게 &quot;Union-Find 알고리즘&quot;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1781254226307&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;node = 8
edge = [(0, 1), (0, 2), (2, 4)]

# 부모 테이블 초기화
parent = [i for i in range(node)]
print(&quot;default table :&quot;,parent)

# 루트(부모) 노드 찾기 재귀함수
def find(x):
    if parent[x] != x:
        parent[x] = find(parent[x])
    return parent[x]

# 두 집합 합치기
def union(a, b):
    root_a = find(a)
    root_b = find(b)

    # 작은 루트 번호 기준으로 부모 union
    if root_a &amp;lt; root_b:
        parent[root_b] = root_a
    else:
        parent[root_a] = root_b

# edge 기준 노드 union
for a,b in edge :
    union(a, b)
    print(f&quot;Union node{a}, node{b} :&quot;,parent)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1781256192150&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;default table : [0, 1, 2, 3, 4, 5, 6, 7]
Union node0, node1 : [0, 0, 2, 3, 4, 5, 6, 7]
Union node0, node2 : [0, 0, 0, 3, 4, 5, 6, 7]
Union node2, node4 : [0, 0, 0, 3, 0, 5, 6, 7]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) 어떤 연결된 edge들이 있는 그래프를 기준으로, Union이 진행된 Parent table이 있다고 할 때,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;어떤 두 노드가 같은 그래프에 속했는지 확인하려면 find 함수로 간단히 찾으면 된다&lt;/p&gt;
&lt;pre id=&quot;code_1781256585602&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if find(a) == find(b):&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2) 크루스칼 알고리즘(Kruskal Algorithm)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;가장 적은 비용&lt;/b&gt;으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;모든 노드를 연결&lt;/b&gt;하기 위해 사용하는 알고리즘&lt;/li&gt;
&lt;li&gt;MST를 구하는 대표 알고리즘&lt;/li&gt;
&lt;li&gt;모든 노드를 최대한 적은 비용으로 '&lt;b&gt;연결만&lt;/b&gt;' 시키면 되기 때문에 알고리즘은 아래와 같음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 Edge 정보(비용)를 기준으로 오름차순으로 정렬&lt;/li&gt;
&lt;li&gt;이후 비용이 적은 Edge부터 차근차근 그래프에 포함시키기&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;단, 사이클이 발생되지 않아야 함 (사이클 발생 = 트리 X)&lt;br /&gt;&lt;/span&gt;따라서 사이클이 형성되지 않는 경우에만 해당 Edge를 그래프에 포함시킴&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Edge 개수는 항상 Node 개수 - 1&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;크루스칼 알고리즘의 핵심 : Edge를 비용이 작은 순서대로 그래프에 포함시키자&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-12 오후 3.58.41.png&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;452&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baeKIF/dJMcadoKq7b/LZJ3fX5KLuwTUhUWswjAM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baeKIF/dJMcadoKq7b/LZJ3fX5KLuwTUhUWswjAM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baeKIF/dJMcadoKq7b/LZJ3fX5KLuwTUhUWswjAM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaeKIF%2FdJMcadoKq7b%2FLZJ3fX5KLuwTUhUWswjAM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;305&quot; height=&quot;175&quot; data-filename=&quot;스크린샷 2026-06-12 오후 3.58.41.png&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;452&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시 1)&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1. 값이 10인 Edge가 가장 비용 작음 &amp;rarr; Node 0과 Node 1 연결&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;2. 값이 20인 Edge가 가장 비용 작음&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&amp;rarr; Node 1과 Node 2 연결&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;3. 값이 30인 Edge가 가장 비용 작음&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&amp;rarr; Node 0과 Node 2 연결&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;사이클 발생&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;연결 X&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;4. 값이 50인 Edge가 가장 비용 작음&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&amp;rarr; Node 2과 Node 3 연결&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;5. 모든 Node 연결 완료. 연결된 Edge 개수는 3개&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시 2)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1285&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NvMDC/dJMcabkhZ80/jNY1VXW6R1P9IkuXvURKW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NvMDC/dJMcabkhZ80/jNY1VXW6R1P9IkuXvURKW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NvMDC/dJMcabkhZ80/jNY1VXW6R1P9IkuXvURKW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNvMDC%2FdJMcabkhZ80%2FjNY1VXW6R1P9IkuXvURKW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;273&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1285&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위와 같은 그래프가 있다고 할 때 크루스칼 알고리즘 구현&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-12 오후 7.53.41.png&quot; data-origin-width=&quot;1858&quot; data-origin-height=&quot;1044&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxAf5z/dJMcab5BVdm/8BKPBtDpXNMBwUDlAvdPE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxAf5z/dJMcab5BVdm/8BKPBtDpXNMBwUDlAvdPE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxAf5z/dJMcab5BVdm/8BKPBtDpXNMBwUDlAvdPE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxAf5z%2FdJMcab5BVdm%2F8BKPBtDpXNMBwUDlAvdPE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;365&quot; data-filename=&quot;스크린샷 2026-06-12 오후 7.53.41.png&quot; data-origin-width=&quot;1858&quot; data-origin-height=&quot;1044&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사이클 테이블(= 자기 자신을 가리키는 parent table) 생성&lt;/li&gt;
&lt;li&gt;사이클이 발생하는지 여부는 이 테이블에 대해 'Union-Find 알고리즘' 적용&lt;/li&gt;
&lt;li&gt;연결된 node들과 edge 값으로 구성된 2차원 배열 생성 (= edges)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1781259901260&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;n = 8 # 노드 개수
parent = [i for i in range(n)] # 사이클 테이블

# [노드,노드,비용]
edges = [[0, 1, 10],[0, 2, 110],[0, 3, 100],[0, 6, 20],[1, 6, 30],[2, 6, 40],
    [2, 4, 60],[3, 5, 90],[3, 4, 70],[4, 7, 50],[5, 6, 120],[5, 7, 80]]&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1858&quot; data-origin-height=&quot;1044&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/diSKtA/dJMcadCftuu/ZQgvhN5K9WKYlMGECYtgg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/diSKtA/dJMcadCftuu/ZQgvhN5K9WKYlMGECYtgg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/diSKtA/dJMcadCftuu/ZQgvhN5K9WKYlMGECYtgg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdiSKtA%2FdJMcadCftuu%2FZQgvhN5K9WKYlMGECYtgg0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;365&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1858&quot; data-origin-height=&quot;1044&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 Edge value(비용)를 기준으로 오름차순 정렬&lt;/li&gt;
&lt;li&gt;즉, Edge 값이 작은 것부터 순서대로 2차원 배열 정렬&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1781260544156&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;edges.sort(key=lambda x: x[2]) # 즉, edges 리스트의 2번 원소 기준으로 정렬&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이후 &quot;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Edge 개수 = Node 개수 -1&lt;/b&gt;&quot;이 될 때 까지&lt;/span&gt; &lt;/span&gt;비용이 적은 Edge부터 차근차근 그래프에 포함시키기&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;단, 사이클이 발생되지 않아야 함 (사이클 발생 = 트리 X)&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;pre id=&quot;code_1781264092909&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def find(x):
    if parent[x] != x:
        parent[x] = find(parent[x])
    return parent[x]

# 사이클 검사 후 두 그룹을 합치는 함수
def union(a, b):
    root_a = find(a)
    root_b = find(b)

    if root_a == root_b:
        return False  # 이미 같은 그룹 &amp;rarr; 사이클 발생

    # 작은 루트 번호 기준으로 부모 union
    if root_a &amp;lt; root_b:
        parent[root_b] = root_a
    else:
        parent[root_a] = root_b

    return True

# Edge 개수 = Node 개수 -1이 되면 알고리즘 종료
edge_count = 0
for a, b, cost in edges:
    if union(a, b):
        # print(parent) # parent table 변화
        edge_count += 1
        graph.append((a,b))

        if edge_count == n - 1:
            break&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위 find(), union(), for문으로 edge 개수가 node 개수 -1이 될 때까지 크루스칼 알고리즘 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-12 오후 7.56.55.png&quot; data-origin-width=&quot;1858&quot; data-origin-height=&quot;1044&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxRtKf/dJMcab5BVvR/PmYtlz3lklK5VkyqHkyzl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxRtKf/dJMcab5BVvR/PmYtlz3lklK5VkyqHkyzl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxRtKf/dJMcab5BVvR/PmYtlz3lklK5VkyqHkyzl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxRtKf%2FdJMcab5BVvR%2FPmYtlz3lklK5VkyqHkyzl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;365&quot; data-filename=&quot;스크린샷 2026-06-12 오후 7.56.55.png&quot; data-origin-width=&quot;1858&quot; data-origin-height=&quot;1044&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Edge 개수 = 1&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-12 오후 7.58.11.png&quot; data-origin-width=&quot;1858&quot; data-origin-height=&quot;1044&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clkJT6/dJMcacpWS6m/Kh1SFeVMoliMywXzidf3RK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clkJT6/dJMcacpWS6m/Kh1SFeVMoliMywXzidf3RK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clkJT6/dJMcacpWS6m/Kh1SFeVMoliMywXzidf3RK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclkJT6%2FdJMcacpWS6m%2FKh1SFeVMoliMywXzidf3RK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;365&quot; data-filename=&quot;스크린샷 2026-06-12 오후 7.58.11.png&quot; data-origin-width=&quot;1858&quot; data-origin-height=&quot;1044&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Edge 개수 = 2&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-12 오후 8.01.10.png&quot; data-origin-width=&quot;1858&quot; data-origin-height=&quot;1044&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bk8xbX/dJMcadoKHj3/08Z2RjKPxRyK3A4qkLs3a1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bk8xbX/dJMcadoKHj3/08Z2RjKPxRyK3A4qkLs3a1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bk8xbX/dJMcadoKHj3/08Z2RjKPxRyK3A4qkLs3a1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbk8xbX%2FdJMcadoKHj3%2F08Z2RjKPxRyK3A4qkLs3a1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;365&quot; data-filename=&quot;스크린샷 2026-06-12 오후 8.01.10.png&quot; data-origin-width=&quot;1858&quot; data-origin-height=&quot;1044&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;사이클 발생&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;find(1)=0, find(6)=0 &amp;rarr; 이미 같은 집합&lt;/li&gt;
&lt;li&gt;그래프 추가 X&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-12 오후 8.07.20.png&quot; data-origin-width=&quot;1858&quot; data-origin-height=&quot;1044&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZRseq/dJMcagy36Jo/kO8KZQWoIEQPdJdpP7WfKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZRseq/dJMcagy36Jo/kO8KZQWoIEQPdJdpP7WfKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZRseq/dJMcagy36Jo/kO8KZQWoIEQPdJdpP7WfKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZRseq%2FdJMcagy36Jo%2FkO8KZQWoIEQPdJdpP7WfKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;365&quot; data-filename=&quot;스크린샷 2026-06-12 오후 8.07.20.png&quot; data-origin-width=&quot;1858&quot; data-origin-height=&quot;1044&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Edge 개수 = 3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-12 오후 8.07.59.png&quot; data-origin-width=&quot;1858&quot; data-origin-height=&quot;1044&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJRLa8/dJMb99Ufre0/EEkO7P6kOQDGxIkhiryBZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJRLa8/dJMb99Ufre0/EEkO7P6kOQDGxIkhiryBZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJRLa8/dJMb99Ufre0/EEkO7P6kOQDGxIkhiryBZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJRLa8%2FdJMb99Ufre0%2FEEkO7P6kOQDGxIkhiryBZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;365&quot; data-filename=&quot;스크린샷 2026-06-12 오후 8.07.59.png&quot; data-origin-width=&quot;1858&quot; data-origin-height=&quot;1044&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Edge 개수 = 4&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-12 오후 8.08.35.png&quot; data-origin-width=&quot;1858&quot; data-origin-height=&quot;1044&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cblGOf/dJMcafUvxDo/tUOQTCiGRZq2r24kMVS8H1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cblGOf/dJMcafUvxDo/tUOQTCiGRZq2r24kMVS8H1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cblGOf/dJMcafUvxDo/tUOQTCiGRZq2r24kMVS8H1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcblGOf%2FdJMcafUvxDo%2FtUOQTCiGRZq2r24kMVS8H1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;365&quot; data-filename=&quot;스크린샷 2026-06-12 오후 8.08.35.png&quot; data-origin-width=&quot;1858&quot; data-origin-height=&quot;1044&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Edge 개수 = 5&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-12 오후 8.09.08.png&quot; data-origin-width=&quot;1858&quot; data-origin-height=&quot;1044&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGUhRQ/dJMcafUvxEK/SfOdPjN9ro2AgNJo48DVkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGUhRQ/dJMcafUvxEK/SfOdPjN9ro2AgNJo48DVkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGUhRQ/dJMcafUvxEK/SfOdPjN9ro2AgNJo48DVkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGUhRQ%2FdJMcafUvxEK%2FSfOdPjN9ro2AgNJo48DVkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;365&quot; data-filename=&quot;스크린샷 2026-06-12 오후 8.09.08.png&quot; data-origin-width=&quot;1858&quot; data-origin-height=&quot;1044&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Edge 개수 = 6&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-12 오후 8.14.05.png&quot; data-origin-width=&quot;1858&quot; data-origin-height=&quot;1044&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRs2OT/dJMcafUvxHr/3VDBQJnHtyjdj9JyERErJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRs2OT/dJMcafUvxHr/3VDBQJnHtyjdj9JyERErJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRs2OT/dJMcafUvxHr/3VDBQJnHtyjdj9JyERErJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRs2OT%2FdJMcafUvxHr%2F3VDBQJnHtyjdj9JyERErJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;365&quot; data-filename=&quot;스크린샷 2026-06-12 오후 8.14.05.png&quot; data-origin-width=&quot;1858&quot; data-origin-height=&quot;1044&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Edge 개수 = 7 = Node 개수 -1&lt;/li&gt;
&lt;li&gt;그래프 edge 추가 종료&lt;/li&gt;
&lt;li&gt;나머지 edge는 무시&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-12 오후 8.15.04.png&quot; data-origin-width=&quot;1858&quot; data-origin-height=&quot;1044&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQoeZM/dJMcabEwCfU/7zRmTAkjRsMR6TRFUOIzp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQoeZM/dJMcabEwCfU/7zRmTAkjRsMR6TRFUOIzp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQoeZM/dJMcabEwCfU/7zRmTAkjRsMR6TRFUOIzp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQoeZM%2FdJMcabEwCfU%2F7zRmTAkjRsMR6TRFUOIzp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;365&quot; data-filename=&quot;스크린샷 2026-06-12 오후 8.15.04.png&quot; data-origin-width=&quot;1858&quot; data-origin-height=&quot;1044&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최종 그래프와 parent table&lt;/li&gt;
&lt;li&gt;최소 비용 신장 트리 완성&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;이와 같이 최소 비용으로 모든 노드를 연결하는게 &quot;크루스칼 알고리즘&quot;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1781264651254&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;n = 8 # 노드 개수
parent = [i for i in range(n)] # 사이클 테이블
edges = [[0, 1, 10], [0, 2, 110], [0, 3, 100], [0, 6, 20], [1, 6, 30], [2, 6, 40],
         [2, 4, 60], [3, 5, 90], [3, 4, 70], [4, 7, 50], [5, 6, 120], [5, 7, 80]]
graph=[] # 크루스칼 알고리즘으로 만든 최종 그래프

# x 루트(부모) 노드 찾기 재귀함수
def find(x):
    if parent[x] != x:
        parent[x] = find(parent[x])
    return parent[x]

# 사이클 검사 후 두 그룹을 합치는 함수
def union(a, b):
    root_a = find(a)
    root_b = find(b)

    if root_a == root_b:
        return False  # 이미 같은 그룹 &amp;rarr; 사이클 발생

    # 작은 루트 번호 기준으로 부모 union
    if root_a &amp;lt; root_b:
        parent[root_b] = root_a
    else:
        parent[root_a] = root_b

    return True

# 비용 기준으로 정렬해서 가장 비용이 싼 것 부터 보겠다
edges.sort(key=lambda x: x[2]) # 즉, edges 리스트의 2번 원소 기준으로 정렬

# Edge 개수 = Node 개수 -1이 되면 알고리즘 종료
edge_count = 0
for a, b, cost in edges:
    if union(a, b):
        # print(parent) # parent table 변화
        edge_count += 1
        graph.append((a,b))

        if edge_count == n - 1:
            break

print(&quot;최종 그래프 :&quot;,graph)&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3) MST(Minimum Spanning Tree)&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;최소 신장 트리&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;MST : 가중치가 있는 그래프가 있을 때 모든 노드를 연결하며 사이클이 없고&lt;span&gt;&amp;nbsp;&lt;/span&gt;총 비용이 최소인 트리를 찾는 &lt;b&gt;문제&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;MST를 구하기 위해 '크루스칼 알고리즘'과 'Union-Find'를 많이 씀&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span&gt;외에도 프림(Prim) 알고리즘 등이 있음&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span&gt;사용되는 Edge의 개수는 반드시 &quot; Node 개수 - 1 &quot;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Edge들의 가중치 합은 최소여야 한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;사이클이 포함되면 안됨&lt;span style=&quot;color: #9d9d9d;&quot;&gt; (사이클이 있으면 그래프는 가능하나 트리는 안됨)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;대표 문제 : 여러 개의 도시가 있을 때, 각 도시를 도로를 이용해 연결하고자 함. 이때 비용을 최소로 해서 모든 도시를 연결해라&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Python/Algorithm &amp;amp; Data Structure</category>
      <category>Algorithm</category>
      <category>MST</category>
      <category>python</category>
      <category>union-find</category>
      <category>그래프</category>
      <category>크루스칼</category>
      <author>duiiminish</author>
      <guid isPermaLink="true">https://kongs-code.tistory.com/18</guid>
      <comments>https://kongs-code.tistory.com/18#entry18comment</comments>
      <pubDate>Fri, 12 Jun 2026 21:09:38 +0900</pubDate>
    </item>
    <item>
      <title>[그래프] 깊이/너비 우선 탐색(DFS/BFS)문제 5</title>
      <link>https://kongs-code.tistory.com/17</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제&amp;nbsp;설명&lt;/b&gt;&lt;br /&gt;n명의&amp;nbsp;권투선수가&amp;nbsp;권투&amp;nbsp;대회에&amp;nbsp;참여했고&amp;nbsp;각각&amp;nbsp;1번부터&amp;nbsp;n번까지&amp;nbsp;번호를&amp;nbsp;받았습니다.&amp;nbsp;&lt;br /&gt;권투&amp;nbsp;경기는&amp;nbsp;1대1&amp;nbsp;방식으로&amp;nbsp;진행이&amp;nbsp;되고,&amp;nbsp;만약&amp;nbsp;A&amp;nbsp;선수가&amp;nbsp;B&amp;nbsp;선수보다&amp;nbsp;실력이&amp;nbsp;좋다면&amp;nbsp;A&amp;nbsp;선수는&amp;nbsp;B&amp;nbsp;선수를&amp;nbsp;항상&amp;nbsp;이깁니다.&amp;nbsp;&lt;br /&gt;심판은 주어진 경기 결과를 가지고 선수들의 순위를 매기려 합니다. 하지만 몇몇 경기 결과를 분실하여 정확하게 순위를 매길 수 없습니다.&lt;br /&gt;선수의 수 n, 경기 결과를 담은 2차원 배열 results가 매개변수로 주어질 때 정확하게 순위를 매길 수 있는 선수의 수를 return 하도록 solution 함수를 작성해주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;제한사항&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;선수의&amp;nbsp;수는&amp;nbsp;1명&amp;nbsp;이상&amp;nbsp;100명&amp;nbsp;이하입니다.&lt;/li&gt;
&lt;li&gt;경기&amp;nbsp;결과는&amp;nbsp;1개&amp;nbsp;이상&amp;nbsp;4,500개&amp;nbsp;이하입니다.&lt;/li&gt;
&lt;li&gt;results&amp;nbsp;배열&amp;nbsp;각&amp;nbsp;행&amp;nbsp;[A,&amp;nbsp;B]는&amp;nbsp;A&amp;nbsp;선수가&amp;nbsp;B&amp;nbsp;선수를&amp;nbsp;이겼다는&amp;nbsp;의미입니다.&lt;/li&gt;
&lt;li&gt;모든 경기 결과에는 모순이 없습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;입출력&amp;nbsp;예&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 49.3024%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 6.26365%; text-align: center;&quot;&gt;n&lt;/td&gt;
&lt;td style=&quot;width: 72.6747%; text-align: center;&quot;&gt;results&lt;/td&gt;
&lt;td style=&quot;width: 64.1046%; text-align: center;&quot;&gt;return&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 6.26365%; text-align: center;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;width: 72.6747%; text-align: center;&quot;&gt;[[4,&amp;nbsp;3],&amp;nbsp;[4,&amp;nbsp;2],&amp;nbsp;[3,&amp;nbsp;2],&amp;nbsp;[1,&amp;nbsp;2],&amp;nbsp;[2,&amp;nbsp;5]]&lt;/td&gt;
&lt;td style=&quot;width: 64.1046%; text-align: center;&quot;&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;오답노트&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[처음에 접근한 방식과 코드]&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;처음에는 각 선수보다 못하는 선수가 몇명인지 리스트업하고, 못하는 선수 명수가 중복되기 전까지를 세는 문제라고 인식&lt;/li&gt;
&lt;li&gt;DFS로 어떤 선수가 이길 수 있는 사람 수 기준으로만 코드 작성&lt;/li&gt;
&lt;li&gt;아래 코드로 실행하니 테스트 케이스만 통과하고, 채점에서는 통과 못함&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1780927106941&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(n, results):
    answer = 0

    graph = [[] for i in range(n+1)]
    for w,l in results :
        graph[w].append(l)
    print(graph)

    def dfs(v) :
        print(v,end='')
        visited[v] = True
        count = 1
        for i in graph[v] :
            if not visited[i] :
                count += dfs(i)
        return count

    stronger = [0 for i in range(n + 1)]
    stronger[0] = -1
    for i in range(n) :
        # print(i,end='')
        visited = [False] * (n + 1)
        stronger[i+1] = dfs(i+1) - 1
        print(&quot;stronger&quot;,(i+1),stronger[i+1])

    # 가장 숫자가 작은 사람이 꼴찌 순위.
    # 숫자가 중복되지 않을 때까지
    stronger.sort()
    if len(stronger) == len(set(stronger)):
        answer = n
    for i in range(n-1) :
        if stronger[i]==stronger[i+1] :
            answer = stronger[i]
            break

    return answer

n = 5 # 권투선수 인원
results = [[4, 3], [4, 2], [3, 2], [1, 2], [2, 5]]
print(solution(n,results))&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이전 코드의 문제점&amp;nbsp;&amp;rarr; 정확한 순위를 잘못 정의함&lt;/li&gt;
&lt;li&gt;정확한 순위란 어떤 선수 i가 있을 때, &quot; i &lt;span&gt;보다&lt;/span&gt; &lt;span&gt;강한&lt;/span&gt; &lt;span&gt;사람&lt;/span&gt; &lt;span&gt;수&lt;/span&gt; + i &lt;span&gt;보다&lt;/span&gt; &lt;span&gt;약한&lt;/span&gt; &lt;span&gt;사람&lt;/span&gt; &lt;span&gt;수&lt;/span&gt; = n - 1 &quot;이 성립되는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[고친 코드]&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780926989150&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(n, results):
    answer = 0

    # 정확한 순위 = i보다 강한 사람 수 + i보다 약한 사람 수 = n - 1
    win_graph = [[] for i in range(n+1)] # 어떤 선수가 이길 수 있는 사람 명단
    lose_graph = [[] for i in range(n + 1)]  # 어떤 선수가 항상 지는 사람 명단

    for w,l in results :
        win_graph[w].append(l)
        lose_graph[l].append(w)

    def dfs(v,graph) :
        # print(v,end='')
        visited[v] = True
        count = 1
        for i in graph[v] :
            if not visited[i] :
                count += dfs(i,graph)
        return count

    for i in range(n) :
        # print(i,end='')
        # 정확한 순위 = i보다 강한 사람 수 + i보다 약한 사람 수 = n - 1
        visited = [False] * (n + 1)
        win = dfs(i+1,win_graph) -1
        
        visited = [False] * (n + 1)
        lose = dfs(i+1,lose_graph) -1
        
        if (win + lose) == n - 1 :
            answer += 1

    return answer

n = 5 # 권투선수 인원
results = [[4, 3], [4, 2], [3, 2], [1, 2], [2, 5]]
print(solution(n,results))&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;GPT&lt;span&gt;&amp;nbsp;&lt;/span&gt;추천 답안&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780928039848&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(n, results):
    answer = 0

    win_graph = [[] for _ in range(n + 1)]
    lose_graph = [[] for _ in range(n + 1)]

    for winner, loser in results:
        win_graph[winner].append(loser)
        lose_graph[loser].append(winner)

    def dfs(graph, start):
        visited = [False] * (n + 1)
        stack = [start]
        count = 0

        while stack:
            now = stack.pop()

            for next_player in graph[now]:
                if not visited[next_player]:
                    visited[next_player] = True
                    count += 1
                    stack.append(next_player)

        return count

    for player in range(1, n + 1):
        win_count = dfs(win_graph, player)    # 내가 이길 수 있는 사람 수
        lose_count = dfs(lose_graph, player)  # 나를 이길 수 있는 사람 수

        if win_count + lose_count == n - 1:
            answer += 1

    return answer&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;나는 재귀 DFS로 구현했는데 GPT는 stack을 쓴 반복 DFS로 구현&lt;/li&gt;
&lt;li&gt;GPT가 모범 답안으로 반복 DFS로 쓴 이유는 보통 코테에서 더 안전하기 때문&lt;/li&gt;
&lt;li&gt;재귀 DFS는 코드는 직관적이지만 재귀 깊이 제한에 걸릴 수 있음. &lt;br /&gt;파이썬은 재귀가 깊어지면 RecursionError가 날 수 있어서, 노드 수가 큰 문제에서는 반복 DFS가 더 안정적.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;노드 수 작고 구조 이해가 중요함 &amp;rarr; 재귀 DFS 추천&lt;/li&gt;
&lt;li&gt;노드&amp;nbsp;수&amp;nbsp;크거나&amp;nbsp;실전&amp;nbsp;안정성&amp;nbsp;중요함&amp;nbsp;&amp;rarr;&amp;nbsp;반복&amp;nbsp;DFS&amp;nbsp;추천&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시행착오 및 배운점&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#1 DFS에서 방문한 노드 개수를 셀 때&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 아래와 같은 구조를 많이 사용&lt;/p&gt;
&lt;pre id=&quot;code_1780928376620&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def dfs(v):
    visited[v] = True
    count = 1

    for i in graph[v]:
        if not visited[i]:
            count += dfs(i)

    return count
    

visited 리스트 정의
graph 정의
result = dfs(1)&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#2 리스트 정렬&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에 접근한 방식에서는 리스트 내 원소 정렬이 필요했었음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 오름차순 정렬&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780938917738&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sample = [3, 1, 4, 2, 5]
 
sample.sort() # 리스트를 오름차순으로 정렬
print(sample) # [1, 2, 3, 4, 5]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 내림차순 정렬&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780938964490&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sample = [3, 1, 4, 2, 5]
 
sample.sort(reverse=True) # 리스트를 내림차순으로 정렬
print(sample) # [5, 4, 3, 2, 1]&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#3 코테 문제에 있는 변수 범위는 어떻게 활용하는걸까?&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코테 문제에는 항상 제한사항을 줌&lt;/li&gt;
&lt;li&gt;이번 문제로 생각해보면, n과 results의 범위 같은 것들&lt;/li&gt;
&lt;li&gt;근데 실제로 구현한 코드를 보면 이 범위를 직접적으로 명시하진 않음. 괜찮은걸까?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;제한사항은 대체로 시간복잡도 판단용 &lt;span style=&quot;color: #9d9d9d;&quot;&gt;(문제를 보고 어떻게 생각할지는 구체적인건 다음에 더 알아보는걸류..)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;오늘 푼 문제 기준으로 시간복잡도 구해보면&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&lt;b&gt;1. DFS가 한 번에 얼마나 보나?&lt;/b&gt;&amp;nbsp;생각하기&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;[&amp;nbsp; 조건 : 선수 수 n &amp;le; 100,&amp;nbsp; 경기 결과 &amp;le; 4500&amp;nbsp; ]&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DFS 최악의 경우 = 모든 선수 방문 + 모든 경기 결과 확인&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= 100명 + 4500 경기&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DFS 1번 &amp;asymp; 4600번&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. DFS를 몇번 돌리나?&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780938228380&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    for i in range(n) :
        # print(i,end='')
        # 정확한 순위 = i보다 강한 사람 수 + i보다 약한 사람 수 = n - 1
        visited = [False] * (n + 1)
        win = dfs(i+1,win_graph) -1

        visited = [False] * (n + 1)
        lose = dfs(i+1,lose_graph) -1

        if (win + lose) == n - 1 :
            answer += 1&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;range&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;): 로 DFS를 돌리고 있으니까 100번 반복.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;그리고 win, lose로 한 사람당 2번씩 DFS를 돌림.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 앞에 구한걸 다 곱하면&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;100명 x DFS 2번씩 x&amp;nbsp;4600 = 920,000&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;약 92만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 괜찮은건가?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코테에서는 보통 1초 &amp;asymp; 1억 번 연산 정도로 대략 계산.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;100만 &amp;rarr;&amp;nbsp;매우&amp;nbsp;여유&lt;/li&gt;
&lt;li&gt;1000만 &amp;rarr;&amp;nbsp;보통&amp;nbsp;가능&lt;/li&gt;
&lt;li&gt;1억 &amp;rarr;&amp;nbsp;경계&lt;/li&gt;
&lt;li&gt;10억 &amp;rarr;&amp;nbsp;위험&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 92만이면 여유여유&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;정리하면&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;DFS 1번 &lt;br /&gt;&amp;rarr; O(V+E)&lt;br /&gt;&lt;br /&gt;100명마다 DFS 2번 &lt;br /&gt;&amp;rarr; O(2N(V+E))&lt;br /&gt;&lt;br /&gt;상수 제거 &lt;br /&gt;&amp;rarr; O(N(V+E))&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;(V = Vertex = 정점(노드) 개수, E = Edge = 간선 개수)&lt;/span&gt;&lt;/blockquote&gt;</description>
      <category>Python/Coding-test</category>
      <category>BFS</category>
      <category>dfs</category>
      <category>graph</category>
      <category>python</category>
      <author>duiiminish</author>
      <guid isPermaLink="true">https://kongs-code.tistory.com/17</guid>
      <comments>https://kongs-code.tistory.com/17#entry17comment</comments>
      <pubDate>Tue, 9 Jun 2026 02:17:57 +0900</pubDate>
    </item>
    <item>
      <title>Queue &amp;amp; BFS</title>
      <link>https://kongs-code.tistory.com/16</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;그래프 탐색 대표 알고리즘 DFS / BFS&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;탐색(Search)란 많은 양의 데이터 중에서 원하는 데이터를 찾는 과정&lt;/li&gt;
&lt;li&gt;코테에서 매우 자주 등장하는 유형&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Queue&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입구와 출구가 모두 뚫려있는 터널과 같은 형태&lt;/li&gt;
&lt;li&gt;FIFO(First In First Out) 구조 : 먼저 들어온 데이터가 먼저 나가는 선입선출 형식의 자료구조&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-08 오전 5.39.36.png&quot; data-origin-width=&quot;1606&quot; data-origin-height=&quot;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O4nkJ/dJMcaijifGa/afKJLONDnmU9v7BPZVVCh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O4nkJ/dJMcaijifGa/afKJLONDnmU9v7BPZVVCh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O4nkJ/dJMcaijifGa/afKJLONDnmU9v7BPZVVCh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO4nkJ%2FdJMcaijifGa%2FafKJLONDnmU9v7BPZVVCh1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;542&quot; height=&quot;218&quot; data-filename=&quot;스크린샷 2026-06-08 오전 5.39.36.png&quot; data-origin-width=&quot;1606&quot; data-origin-height=&quot;646&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨베이어 벨트처럼 들어온대로 나가는 구조!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EX ) 삽입(5) - 삽입(2) - 삽입(3) - 삽입(7) - 삭제() - 삽입(1) - 삽입(4) - 삭제()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&amp;rArr;&lt;/span&gt;&amp;nbsp;&lt;span data-token-index=&quot;0&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;5 2&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;3&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;7&amp;nbsp;1&amp;nbsp;4&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;List 자료형을 이용해 기능적으로는 큐를 구현할 수 있음&lt;/li&gt;
&lt;li&gt;But, List는 시간 복잡도가 더 높아서 비효율적으로 동작할 수 있음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;만약 pop()으로 원소를 꺼내면 그 후에 나머지 원소들의 위치를 조정해줘야 하기 때문에 O(k)만큼의 시간복잡도가 요구됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;deque는 스택과 큐 라이브러리의 장점을 합쳐놓은 자료구조&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1780863723207&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from collections import deque
# collections 모듈에서 deque 함수만 쓰겠다.

# queue 구현을 위해 deque 라이브러리 활용
queue = deque()

# 삽입(5)-삽입(2)-삽입(3)-삽입(7)-삭제()-삽입(1)-삽입(4)-삭제()
queue.append(5)
queue.append(2)
queue.append(3)
queue.append(7)
queue.popleft()
queue.append(1)
queue.append(4)
queue.popleft()

# 넣은 순서대로 queue list 출력 = 출구에 가까운 순
print(queue)
# 데크 없이 리스트 형태만 출력하고 싶다면
print(list(queue))

# 나중에 들어온 원소부터 출력
queue.reverse()
print(queue)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1780863746337&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;deque([3, 7, 1, 4])
[3, 7, 1, 4]
deque([4, 1, 7, 3])&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;큐의 append()와 popleft()의 시간복잡도는 O(1). 상수시간&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;BFS(Breadth-First Search) : 깊이우선탐색&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BFS : 너비 우선 탐색이라고도 부르며, 그래프에서 가까운 노드부터 우선적으로 탐색하는 알고리즘&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-08 오전 4.37.46.png&quot; data-origin-width=&quot;1778&quot; data-origin-height=&quot;976&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d73TuK/dJMcaglswQ2/im7Vp2CUz9uNkVz4AhSmtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d73TuK/dJMcaglswQ2/im7Vp2CUz9uNkVz4AhSmtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d73TuK/dJMcaglswQ2/im7Vp2CUz9uNkVz4AhSmtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd73TuK%2FdJMcaglswQ2%2Fim7Vp2CUz9uNkVz4AhSmtk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;605&quot; height=&quot;332&quot; data-filename=&quot;스크린샷 2026-06-08 오전 4.37.46.png&quot; data-origin-width=&quot;1778&quot; data-origin-height=&quot;976&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;BFS 특징&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;큐 자료구조를 이용함&lt;/li&gt;
&lt;li&gt;&lt;span data-sfc-cp=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cb=&quot;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 500; margin: 0px; text-decoration: none; border-bottom: 0px rgb(0, 29, 53);&quot;&gt;루트 노드나 시작 정점에서 출발해 가장 가까운 인접 노드를 먼저 모두 방문한 뒤, 넓게 퍼져나가며 탐색하는 그래프/트리 탐색 알고리즘&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span data-sfc-cp=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cb=&quot;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;DFS와의 가장 큰 차이로, 여러 갈래 중 무한한 길이를 가지는 경로가 존재하고 탐색 목표가 다른 경로에 존재하는 경우 BFS는 모든 경로를 동시에 진행하기 때문에 탐색이 가능하다는 특징이 있음&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span data-sfc-cp=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cb=&quot;&quot; data-copy-service-computed-style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: 400; margin: 0px; text-decoration: none; border-bottom: 0px rgb(10, 10, 10);&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;한 갈림길에서 연결되는 모든 길을 한번씩 탐색하기 때문에 가중치가 없는 그래프에서는 시작점에서 끝점까지의 최단경로를 알아낼 수 있음&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-08 오전 4.43.35.png&quot; data-origin-width=&quot;1236&quot; data-origin-height=&quot;688&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/paLkc/dJMcaf7TVR4/HOdLvt4iu1cKmVgT3VxK80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/paLkc/dJMcaf7TVR4/HOdLvt4iu1cKmVgT3VxK80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/paLkc/dJMcaf7TVR4/HOdLvt4iu1cKmVgT3VxK80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpaLkc%2FdJMcaf7TVR4%2FHOdLvt4iu1cKmVgT3VxK80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;452&quot; height=&quot;252&quot; data-filename=&quot;스크린샷 2026-06-08 오전 4.43.35.png&quot; data-origin-width=&quot;1236&quot; data-origin-height=&quot;688&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1780864390079&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from collections import deque

def bfs(graph, start, visited) :
    queue = deque([start])
    visited[start] = True
    while queue :
        v = queue.popleft()
        print(v, end=' ')
        for i in graph[v] :
            if not visited[i] :
                # print(f&quot;\n방문하지 않은 {i} 추가&quot;)
                queue.append(i)
                visited[i] = True

graph=[
    [],
    [2,3,8],
    [1,7],
    [1,4,5],
    [3,5],
    [3,4],
    [7],
    [2,6,8],
    [1,7]
]

visited = [False]*9
# print(visited)

bfs(graph,1,visited)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1780864407230&quot; class=&quot;basic&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;1 2 3 8 7 4 5 6&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1780864429077&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;재귀 함수(Recursive Function)&quot; data-og-description=&quot;자기 자신을 다시 호출하는 함수를 의미DFS, BFS에서 많이 사용함무한히 재귀 함수를 반복하면 어느정도 출력하다 최대 재귀 깊이 초과 메시지 출력됨RecursionError: maximum recursion depth exceeded while call&quot; data-og-host=&quot;kongs-code.tistory.com&quot; data-og-source-url=&quot;https://kongs-code.tistory.com/14&quot; data-og-url=&quot;https://kongs-code.tistory.com/14&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/u8ntK/dJMb86O9ATW/6vKN1Q8xn44VoFPurpdRJk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/pwT7m/dJMb896bwXm/6cGSRvWkqsUqqE6b916sz0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://kongs-code.tistory.com/14&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://kongs-code.tistory.com/14&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/u8ntK/dJMb86O9ATW/6vKN1Q8xn44VoFPurpdRJk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/pwT7m/dJMb896bwXm/6cGSRvWkqsUqqE6b916sz0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;재귀 함수(Recursive Function)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;자기 자신을 다시 호출하는 함수를 의미DFS, BFS에서 많이 사용함무한히 재귀 함수를 반복하면 어느정도 출력하다 최대 재귀 깊이 초과 메시지 출력됨RecursionError: maximum recursion depth exceeded while call&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;kongs-code.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;참고 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://www.youtube.com/watch?v=7C9RgOcvkvo&quot;&gt;동빈나 DFS&amp;nbsp;&amp;amp;&amp;nbsp;BFS&lt;/a&gt;&lt;/p&gt;</description>
      <category>Python/Algorithm &amp;amp; Data Structure</category>
      <category>BFS</category>
      <category>python</category>
      <category>Queue</category>
      <author>duiiminish</author>
      <guid isPermaLink="true">https://kongs-code.tistory.com/16</guid>
      <comments>https://kongs-code.tistory.com/16#entry16comment</comments>
      <pubDate>Mon, 8 Jun 2026 05:35:48 +0900</pubDate>
    </item>
    <item>
      <title>Stack &amp;amp; DFS</title>
      <link>https://kongs-code.tistory.com/15</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;그래프 탐색 대표 알고리즘 DFS / BFS&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;탐색(Search)란 많은 양의 데이터 중에서 원하는 데이터를 찾는 과정&lt;/li&gt;
&lt;li&gt;코테에서 매우 자주 등장하는 유형&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Stack&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리스트의 한쪽 끝에서 수행되는 선형 리스트의 한가지 형태&lt;/li&gt;
&lt;li&gt;&lt;b&gt;입구와 출구가 동일한 형태&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;LIFO(Last In First Out) 구조 : 선입후출 형태로 스택에 마지막으로 입력된 자료가 제일 먼저 삭제되는 구조&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-08 오전 3.57.56.png&quot; data-origin-width=&quot;1564&quot; data-origin-height=&quot;866&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwPZhx/dJMcaiKjwQN/5l3MdqeywT2l1BHJZQgkwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwPZhx/dJMcaiKjwQN/5l3MdqeywT2l1BHJZQgkwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwPZhx/dJMcaiKjwQN/5l3MdqeywT2l1BHJZQgkwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwPZhx%2FdJMcaiKjwQN%2F5l3MdqeywT2l1BHJZQgkwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;510&quot; height=&quot;282&quot; data-filename=&quot;스크린샷 2026-06-08 오전 3.57.56.png&quot; data-origin-width=&quot;1564&quot; data-origin-height=&quot;866&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깊은 상자라고 생각했을 때 차곡차곡 넣는데, 마지막에 넣은걸 먼저 꺼낼 수 있는 구조!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EX ) 삽입(5) - 삽입(2) - 삽입(3) - 삽입(7) - 삭제() - 삽입(1) - 삽입(4) - 삭제()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;&amp;rArr;&lt;/span&gt;&amp;nbsp;&lt;span data-token-index=&quot;0&quot;&gt;5 2 3 &lt;/span&gt;&lt;span style=&quot;color: #dddddd;&quot; data-token-index=&quot;1&quot;&gt;7&lt;/span&gt;&lt;span data-token-index=&quot;2&quot;&gt; 1 &lt;/span&gt;&lt;span style=&quot;color: #dddddd;&quot; data-token-index=&quot;3&quot;&gt;4&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1780858857844&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;stack = []

# 삽입(5)-삽입(2)-삽입(3)-삽입(7)-삭제()-삽입(1)-삽입(4)-삭제()
stack.append(5)
stack.append(2)
stack.append(3)
stack.append(7)
stack.pop()
stack.append(1)
stack.append(4)
stack.pop()

# 넣은 순서대로 stack list 출력
print(stack)
# 출구에 가까운 순으로 stack list 출력
print(stack[::-1])&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1780858959864&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[5, 2, 3, 1]
[1, 3, 2, 5]&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스택의 append()와 pop()의 시간복잡도는 O(1). 상수시간&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;DFS(Depth-First Search) : 깊이우선탐색&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래프 탐색 : 하나의 정점에서 시작해서 차례대로 모든 정점들을 한번씩 방문하는 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DFS : 루트 노드 또는 다른 임의의 노드에서 시작해서 다음 분기(branch)로 넘어가기 전에 해당 분기를 모두 탐색하는 방법. &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 즉, 넓게(wide) 탐색하기 전에 깊게(deep) 탐색하는 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 노드를 방문하고자 하는 경우 이 알고리즘을 선택하며, BFS(너비우선탐색)보다 좀 더 간단하지만 검색 속도는 더 느리다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-08 오전 4.37.46.png&quot; data-origin-width=&quot;1778&quot; data-origin-height=&quot;976&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d73TuK/dJMcaglswQ2/im7Vp2CUz9uNkVz4AhSmtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d73TuK/dJMcaglswQ2/im7Vp2CUz9uNkVz4AhSmtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d73TuK/dJMcaglswQ2/im7Vp2CUz9uNkVz4AhSmtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd73TuK%2FdJMcaglswQ2%2Fim7Vp2CUz9uNkVz4AhSmtk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;605&quot; height=&quot;332&quot; data-filename=&quot;스크린샷 2026-06-08 오전 4.37.46.png&quot; data-origin-width=&quot;1778&quot; data-origin-height=&quot;976&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DFS 특징&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자기 자신을 호출하는 순환 알고리즘의 형태를 가지고 있음&lt;/li&gt;
&lt;li&gt;전위 순회(Pre-Order Traversals)를 포함한 다른 형태의 트리 순회는 모두 DFS의 한 종류.&lt;/li&gt;
&lt;li&gt;중요한 특징은 그래프 탐색의 경우 무한 루프에 빠질 수 있기 때문에 어떤 노드를 방문했었는지 여부를 반드시 검사해야 함. &lt;br /&gt;또 데이터를 찾을 때는 항상 앞으로 방문할 노드와 이미 방문한 노드를 기준으로 데이터를 탐색해야함.&lt;/li&gt;
&lt;li&gt;DFS는 스택/큐를 활용할 수도 있고, 재귀함수를 통해 구현할 수도 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-08 오전 4.43.35.png&quot; data-origin-width=&quot;1236&quot; data-origin-height=&quot;688&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/paLkc/dJMcaf7TVR4/HOdLvt4iu1cKmVgT3VxK80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/paLkc/dJMcaf7TVR4/HOdLvt4iu1cKmVgT3VxK80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/paLkc/dJMcaf7TVR4/HOdLvt4iu1cKmVgT3VxK80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpaLkc%2FdJMcaf7TVR4%2FHOdLvt4iu1cKmVgT3VxK80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;452&quot; height=&quot;252&quot; data-filename=&quot;스크린샷 2026-06-08 오전 4.43.35.png&quot; data-origin-width=&quot;1236&quot; data-origin-height=&quot;688&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1780861451758&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def dfs(graph, v, visited) :
    visited[v] = True
    print(v, end=' ')
    for i in graph[v] :
        if not visited[i] :
            dfs(graph, i, visited)

# 스택 호출 인덱스를 고려해서 0번째는 빈 리스트로 두기
# 호출 인덱스 번호와 연결된 노드들로 구성된 리스트 만들기
graph=[
    [],
    [2,3,8],
    [1,7],
    [1,4,5],
    [3,5],
    [3,4],
    [7],
    [2,6,8],
    [1,7]
]

visited = [False]*9
# print(visited)

dfs(graph,1,visited)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1780861492931&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1 2 7 6 8 3 4 5&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1780863346003&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;재귀 함수(Recursive Function)&quot; data-og-description=&quot;자기 자신을 다시 호출하는 함수를 의미DFS, BFS에서 많이 사용함무한히 재귀 함수를 반복하면 어느정도 출력하다 최대 재귀 깊이 초과 메시지 출력됨RecursionError: maximum recursion depth exceeded while call&quot; data-og-host=&quot;kongs-code.tistory.com&quot; data-og-source-url=&quot;https://kongs-code.tistory.com/14&quot; data-og-url=&quot;https://kongs-code.tistory.com/14&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/u8ntK/dJMb86O9ATW/6vKN1Q8xn44VoFPurpdRJk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/pwT7m/dJMb896bwXm/6cGSRvWkqsUqqE6b916sz0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://kongs-code.tistory.com/14&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://kongs-code.tistory.com/14&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/u8ntK/dJMb86O9ATW/6vKN1Q8xn44VoFPurpdRJk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/pwT7m/dJMb896bwXm/6cGSRvWkqsUqqE6b916sz0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;재귀 함수(Recursive Function)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;자기 자신을 다시 호출하는 함수를 의미DFS, BFS에서 많이 사용함무한히 재귀 함수를 반복하면 어느정도 출력하다 최대 재귀 깊이 초과 메시지 출력됨RecursionError: maximum recursion depth exceeded while call&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;kongs-code.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://www.youtube.com/watch?v=7C9RgOcvkvo&quot;&gt;동빈나 DFS&amp;nbsp;&amp;amp;&amp;nbsp;BFS&lt;/a&gt;&lt;/p&gt;</description>
      <category>Python/Algorithm &amp;amp; Data Structure</category>
      <category>dfs</category>
      <category>python</category>
      <category>stack</category>
      <author>duiiminish</author>
      <guid isPermaLink="true">https://kongs-code.tistory.com/15</guid>
      <comments>https://kongs-code.tistory.com/15#entry15comment</comments>
      <pubDate>Mon, 8 Jun 2026 05:17:13 +0900</pubDate>
    </item>
    <item>
      <title>재귀 함수(Recursive Function)</title>
      <link>https://kongs-code.tistory.com/14</link>
      <description>&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자기 자신을 다시 호출하는 함수를 의미&lt;/li&gt;
&lt;li&gt;DFS, BFS에서 많이 사용함&lt;/li&gt;
&lt;li&gt;무한히 재귀 함수를 반복하면 어느정도 출력하다 최대 재귀 깊이 초과 메시지 출력됨
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RecursionError: maximum recursion depth exceeded while calling a Python object&lt;/li&gt;
&lt;li&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;추가 설명&lt;br /&gt;실제로 컴퓨터 시스템 상에서 함수가 재귀적으로 호출되면 컴퓨터 시스템의 스택 프레임에 함수가 반복적으로 쌓여서 &lt;br /&gt;가장 마지막에 호출된 함수가 처리가 된 이후에 그 함수를 불렀던 함수까지 처리되는 방식임 &lt;br /&gt;실제로는 스택과 같은 형태로 동작한다고 이해할 수 있음&lt;br /&gt;즉, 일종의 스택 자료 구조 안에 함수에 대한 정보가 차례대로 담겨서 컴퓨터 메모리에 올라가게 된다고 이해할 수 있음&lt;br /&gt;당연히 컴퓨터의 메모리는 한정된 크기만큼의 자원을 가지고 있기 때문에 그냥 무작정 함수가 종료되지 않고 계속해서 쌓아 올려서 재귀적으로 호출만 하게 되면 빠르게 메모리가 가득 차서 문제가 발생할 수 있어 이와 같은 재귀 깊이 제한을 걸어 둘 수가 있는 것&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;만약 제한 없이 재귀 함수를 호출하고자 한다면 재귀 제한을 느슨하게 하거나 스택 객체를 따로 만들어서 이용하기도 함.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;의도적으로 무한루프를 이용하는게 아니라면 재귀 함수 문제풀이에서는 반드시 &lt;b&gt;종료&lt;/b&gt; &lt;b&gt;조건을&lt;/b&gt; 명시해야함&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1780861990876&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def wait_100(i) :
    if i == 100 :
        return
    print(f&quot;{i}번째 재귀 함수에서 {i+1}번째 재귀 함수를 호출합니다.&quot;)
    wait_100(i+1)
    
    # i가 100이 되면 함수들이 차례대로 return되어 나옴 like 스택
    print(f&quot;{i}번째 재귀 함수 종료&quot;)

wait_100(1)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;재귀 함수 사용시 유의사항
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;재귀 함수를 잘 활용하면 수학적 점화식이나 복잡한 알고리즘을 간단하게 작성할 수 있음&lt;/li&gt;
&lt;li&gt;근데 다른 사람에게 오히려 어려워 보일 수 있음&lt;/li&gt;
&lt;li&gt;모든 재귀 함수는 반복문으로 동일하게 구현 가능하고, 그 반대도 성립함&lt;/li&gt;
&lt;li&gt;근데 재귀 함수가 반복문 보다 유리한 경우도 있고 불리한 경우도 있으니 주의&lt;/li&gt;
&lt;li&gt;재귀 함수 연속 호출 시 컴퓨터 메모리 내부 스택 프레임에 쌓임. &lt;br /&gt;그래서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;스택을 사용해야 할 때&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;구현상 스택 라이브러리 대신&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;재귀 함수를 이용하는 경우가 많음&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;[팩토리얼 구현 예제]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$n!&amp;nbsp;=&amp;nbsp;1&amp;nbsp;\times&amp;nbsp;2&amp;nbsp;\times&amp;nbsp;3&amp;nbsp;\times&amp;nbsp;...&amp;nbsp;&amp;nbsp;\times&amp;nbsp;(n-1)&amp;nbsp;&amp;nbsp;\times&amp;nbsp;n$&lt;/p&gt;
&lt;pre id=&quot;code_1780862512244&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 반복문으로 구현한 팩토리얼
def factorial_iterative(n) :
    result = 1
    for i in range(n) :
        result *= (i+1)
    return result

# 재귀함수로 구현한 팩토리얼
def factorial_recursive(n) :
    if n &amp;lt;= 1 :
        return 1
    # n! = n * (n-1)!를 구현
    return n * factorial_recursive(n-1)

print(factorial_iterative(5))
print(factorial_recursive(5))&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1780862537570&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;120

120&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;재귀 함수를 이용한 계산 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5 x func(4)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; = 4 x func(3)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;= 3 x func(2)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &lt;/span&gt;= 2 x func(1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;=1&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;[유클리드 호제법]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;재귀 함수를 효과적으로 사용할 수 있는 또 다른 예시&lt;/li&gt;
&lt;li&gt;최대 공약수를 구하고자 할 때 사용할 수 있는 방법
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최대 공약수(Greatest&amp;nbsp;Common&amp;nbsp;Divisor) = 두 자연수가 있을 때 공통된 약수 중 가장 큰 것&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;유클리드 호제법&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 두 자연수 A, B에 대하여 (A &amp;gt; B) A를 B로 나눈 나머지를 R이라고 합시다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 이때 A와 B의 최대공약수는 B와 R의 최대공약수와 같다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ex) GCD(192, 162)&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 38.7215%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.1836%; text-align: center;&quot;&gt;&lt;b&gt;단계&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 38.0976%; text-align: center;&quot;&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41.6632%; text-align: center;&quot;&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.1836%; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 38.0976%; text-align: center;&quot;&gt;192&lt;/td&gt;
&lt;td style=&quot;width: 41.6632%; text-align: center;&quot;&gt;162&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.1836%; text-align: center;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 38.0976%; text-align: center;&quot;&gt;162&lt;/td&gt;
&lt;td style=&quot;width: 41.6632%; text-align: center;&quot;&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.1836%; text-align: center;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 38.0976%; text-align: center;&quot;&gt;30&lt;/td&gt;
&lt;td style=&quot;width: 41.6632%; text-align: center;&quot;&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.1836%; text-align: center;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 38.0976%; text-align: center;&quot;&gt;12&lt;/td&gt;
&lt;td style=&quot;width: 41.6632%; text-align: center;&quot;&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre id=&quot;code_1780862991864&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def GCD (a, b) :
    if (a % b) == 0 :
        print(f&quot;최대공약수는 {b}!&quot;)
        return b
    return GCD(b,a%b)

x, y = map(int,input(&quot;두 수를 입력하시오 : &quot;).split(' '))

if x &amp;gt; y :
    print(f&quot;A는 {x} B는 {y}&quot;)
    GCD(x, y)
else :
    print(f&quot;A는 {y} B는 {x}&quot;)
    GCD(y, x)​&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1780863007793&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;두 수를 입력하시오 : 162 192
A는 192 B는 162
최대공약수는 6!&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Python/Algorithm &amp;amp; Data Structure</category>
      <category>python</category>
      <category>재귀함수</category>
      <author>duiiminish</author>
      <guid isPermaLink="true">https://kongs-code.tistory.com/14</guid>
      <comments>https://kongs-code.tistory.com/14#entry14comment</comments>
      <pubDate>Mon, 8 Jun 2026 05:14:28 +0900</pubDate>
    </item>
    <item>
      <title>[그래프] 깊이/너비 우선 탐색(DFS/BFS)문제 4</title>
      <link>https://kongs-code.tistory.com/13</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 설명&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;173&quot; data-origin-height=&quot;185&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UKOuT/dJMcagyZHhJ/kgUoPoSXtj6088YF7yhF0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UKOuT/dJMcagyZHhJ/kgUoPoSXtj6088YF7yhF0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UKOuT/dJMcagyZHhJ/kgUoPoSXtj6088YF7yhF0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUKOuT%2FdJMcagyZHhJ%2FkgUoPoSXtj6088YF7yhF0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;173&quot; height=&quot;185&quot; data-origin-width=&quot;173&quot; data-origin-height=&quot;185&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ROR 게임은 두 팀으로 나누어서 진행하며, 상대 팀 진영을 먼저 파괴하면 이기는 게임입니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;따라서, 각 팀은 상대 팀 진영에 최대한 빨리 도착하는 것이 유리합니다.&lt;br /&gt;지금부터&amp;nbsp;당신은&amp;nbsp;한&amp;nbsp;팀의&amp;nbsp;팀원이&amp;nbsp;되어&amp;nbsp;게임을&amp;nbsp;진행하려고&amp;nbsp;합니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다음은&amp;nbsp;5&amp;nbsp;x&amp;nbsp;5&amp;nbsp;크기의&amp;nbsp;맵에,&amp;nbsp;당신의&amp;nbsp;캐릭터가&amp;nbsp;(행:&amp;nbsp;1,&amp;nbsp;열:&amp;nbsp;1)&amp;nbsp;위치에&amp;nbsp;있고,&amp;nbsp;상대&amp;nbsp;팀&amp;nbsp;진영은&amp;nbsp;(행:&amp;nbsp;5,&amp;nbsp;열:&amp;nbsp;5)&amp;nbsp;위치에&amp;nbsp;있는&amp;nbsp;경우의&amp;nbsp;예시입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 그림에서 검은색 부분은 벽으로 막혀있어 갈 수 없는 길이며, 흰색 부분은 갈 수 있는 길입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캐릭터가 움직일 때는 동, 서, 남, 북 방향으로 한 칸씩 이동하며, 게임 맵을 벗어난 길은 갈 수 없습니다.&lt;br /&gt;아래&amp;nbsp;예시는&amp;nbsp;캐릭터가&amp;nbsp;상대&amp;nbsp;팀&amp;nbsp;진영으로&amp;nbsp;가는&amp;nbsp;두&amp;nbsp;가지&amp;nbsp;방법을&amp;nbsp;나타내고&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫&amp;nbsp;번째&amp;nbsp;방법은&amp;nbsp;11개의&amp;nbsp;칸을&amp;nbsp;지나서&amp;nbsp;상대&amp;nbsp;팀&amp;nbsp;진영에&amp;nbsp;도착했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;173&quot; data-origin-height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qQBok/dJMcadIXNqo/mFaKR1qkuO6AHfc642vKE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qQBok/dJMcadIXNqo/mFaKR1qkuO6AHfc642vKE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qQBok/dJMcadIXNqo/mFaKR1qkuO6AHfc642vKE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqQBok%2FdJMcadIXNqo%2FmFaKR1qkuO6AHfc642vKE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;173&quot; height=&quot;186&quot; data-origin-width=&quot;173&quot; data-origin-height=&quot;186&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;두&amp;nbsp;번째&amp;nbsp;방법은&amp;nbsp;15개의&amp;nbsp;칸을&amp;nbsp;지나서&amp;nbsp;상대팀&amp;nbsp;진영에&amp;nbsp;도착했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;173&quot; data-origin-height=&quot;184&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oj3Oc/dJMcagseUbC/lp2BQ68reyLCzsdkiNKoqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oj3Oc/dJMcagseUbC/lp2BQ68reyLCzsdkiNKoqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oj3Oc/dJMcagseUbC/lp2BQ68reyLCzsdkiNKoqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Foj3Oc%2FdJMcagseUbC%2Flp2BQ68reyLCzsdkiNKoqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;173&quot; height=&quot;184&quot; data-origin-width=&quot;173&quot; data-origin-height=&quot;184&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;위 예시에서는 첫 번째 방법보다 더 빠르게 상대팀 진영에 도착하는 방법은 없으므로, 이 방법이 상대 팀 진영으로 가는 가장 빠른 방법입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;171&quot; data-origin-height=&quot;185&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lHM0x/dJMcaaMjP5S/nCF6ry3UseEKU6l78D7UBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lHM0x/dJMcaaMjP5S/nCF6ry3UseEKU6l78D7UBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lHM0x/dJMcaaMjP5S/nCF6ry3UseEKU6l78D7UBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlHM0x%2FdJMcaaMjP5S%2FnCF6ry3UseEKU6l78D7UBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;171&quot; height=&quot;185&quot; data-origin-width=&quot;171&quot; data-origin-height=&quot;185&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약, 상대 팀이 자신의 팀 진영 주위에 벽을 세워두었다면 상대 팀 진영에 도착하지 못할 수도 있습니다. 예를 들어, 다음과 같은 경우에 당신의 캐릭터는 상대 팀 진영에 도착할 수 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게임 맵의 상태 maps가 매개변수로 주어질 때, 캐릭터가 상대 팀 진영에 도착하기 위해서 지나가야 하는 칸의 개수의 최솟값을 return 하도록 solution 함수를 완성해주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, 상대 팀 진영에 도착할 수 없을 때는 -1을 return 해주세요.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;제한사항&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;maps는 n x m 크기의 게임 맵의 상태가 들어있는 2차원 배열로, n과 m은 각각 1 이상 100 이하의 자연수입니다.&lt;/li&gt;
&lt;li&gt;n과&amp;nbsp;m은&amp;nbsp;서로&amp;nbsp;같을&amp;nbsp;수도,&amp;nbsp;다를&amp;nbsp;수도&amp;nbsp;있지만,&amp;nbsp;n과&amp;nbsp;m이&amp;nbsp;모두&amp;nbsp;1인&amp;nbsp;경우는&amp;nbsp;입력으로&amp;nbsp;주어지지&amp;nbsp;않습니다.&lt;/li&gt;
&lt;li&gt;maps는&amp;nbsp;0과&amp;nbsp;1로만&amp;nbsp;이루어져&amp;nbsp;있으며,&amp;nbsp;0은&amp;nbsp;벽이&amp;nbsp;있는&amp;nbsp;자리,&amp;nbsp;1은&amp;nbsp;벽이&amp;nbsp;없는&amp;nbsp;자리를&amp;nbsp;나타냅니다.&lt;/li&gt;
&lt;li&gt;처음에&amp;nbsp;캐릭터는&amp;nbsp;게임&amp;nbsp;맵의&amp;nbsp;좌측&amp;nbsp;상단인&amp;nbsp;(1,&amp;nbsp;1)&amp;nbsp;위치에&amp;nbsp;있으며,&amp;nbsp;상대방&amp;nbsp;진영은&amp;nbsp;게임&amp;nbsp;맵의&amp;nbsp;우측&amp;nbsp;하단인&amp;nbsp;(n,&amp;nbsp;m)&amp;nbsp;위치에&amp;nbsp;있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;입출력&amp;nbsp;예&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 60.2326%; height: 104px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 82.3625%; text-align: center;&quot;&gt;maps&lt;/td&gt;
&lt;td style=&quot;width: 17.6375%; text-align: center;&quot;&gt;answer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 82.3625%; text-align: center;&quot;&gt;[[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,1],[0,0,0,0,1]]&lt;/td&gt;
&lt;td style=&quot;width: 17.6375%; text-align: center;&quot;&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 82.3625%; text-align: center;&quot;&gt;[[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,0],[0,0,0,0,1]]&lt;/td&gt;
&lt;td style=&quot;width: 17.6375%; text-align: center;&quot;&gt;-1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;입출력&amp;nbsp;예&amp;nbsp;설명&lt;/b&gt;&lt;br /&gt;#1&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;173&quot; data-origin-height=&quot;184&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nt8Jn/dJMcaiKjtbT/QQInyHusmj0icyMS5OtKA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nt8Jn/dJMcaiKjtbT/QQInyHusmj0icyMS5OtKA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nt8Jn/dJMcaiKjtbT/QQInyHusmj0icyMS5OtKA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnt8Jn%2FdJMcaiKjtbT%2FQQInyHusmj0icyMS5OtKA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;173&quot; height=&quot;184&quot; data-origin-width=&quot;173&quot; data-origin-height=&quot;184&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;캐릭터가 적 팀의 진영까지 이동하는 가장 빠른 길은 다음 그림과 같습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;오답노트&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780844223946&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from collections import deque

def solution(maps):
    answer = 0
    # n by m 일 때를 고려
    n = len(maps) - 1
    m = len(maps[0]) - 1

    def bfs(x,y) :
        # map 밖으로 벗어나거나 벽이면 return
        if x &amp;lt; 0 or y &amp;lt; 0 or x &amp;gt; 4 or y &amp;gt; 4 or maps[x][y] == 0:
            print(&quot;범위 밖&quot;)
            return

        queue = deque([(x, y)])
        # print(&quot;큐 생성&quot;)
        while queue :
            a,b = queue.popleft()
            print(a,b)

            # n by m 일 때를 고려
            if a == n and b == m :
                print(&quot;목적지 도착&quot;)
                break
            else :
                if (a+1) &amp;lt;= n and maps[a+1][b] == 1 :
                    maps[a+1][b] = maps[a][b] + 1
                    queue.append((a + 1,b))
                if (a-1) &amp;gt;= 0 and maps[a-1][b] == 1 :
                    maps[a - 1][b] = maps[a][b] + 1
                    queue.append((a - 1, b))
                if (b+1) &amp;lt;= m and maps[a][b+1] == 1 :
                    maps[a][b + 1] = maps[a][b] + 1
                    queue.append((a, b+1))
                if (b-1) &amp;gt;= 0 and maps[a][b-1] == 1 :
                    maps[a][b - 1] = maps[a][b] + 1
                    queue.append((a, b-1))
        if maps[len(maps)-1][len(maps[0])-1] == 1 :
            return -1
        else :
            return maps[len(maps)-1][len(maps[0])-1]

    answer = bfs(0,0)
    print(&quot;bfs 후 :&quot;,maps)

    return answer

maps = [[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,1],[0,0,0,0,1]]
# maps = [[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,0],[0,0,0,0,1]]
print(&quot;정답 : &quot;,solution(maps))&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가중치 없는 최단거리 -&amp;gt; BFS 접근&lt;/li&gt;
&lt;li&gt;맵 바깥 좌표로 나가면 X, 다음 스텝 좌표가 벽이면 X&lt;/li&gt;
&lt;li&gt;초반에 문제에서 (1,1) 출발이라고 했는데 실제 코드에서는 (0,0)이라 약간 헤맴&lt;/li&gt;
&lt;li&gt;answer 개수 = 큐 Pop한 개수 처리해버리면서 BFS 쓰겠다 해놓고 다 둘러봄 ㅠ&amp;nbsp; -&amp;gt; 방문 노드 값 +1로 수정&lt;/li&gt;
&lt;li&gt;결론 : 풀긴 풀었는데 코드가 지저분함&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;GPT 추천 답안&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780846225028&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from collections import deque

def solution(maps):
    answer = 0
    n = len(maps) # 행
    m = len(maps[0]) # 열

    dx = [1, -1, 0, 0]
    dy = [0, 0, 1, -1]

    queue = deque([(0, 0)])

    while queue:
        x, y = queue.popleft()

        if x == n - 1 and y == m - 1:
            return maps[x][y]

        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]

            if 0 &amp;lt;= nx &amp;lt; n and 0 &amp;lt;= ny &amp;lt; m and maps[nx][ny] == 1:
                maps[nx][ny] = maps[x][y] + 1
                queue.append((nx, ny))

    return -1

maps = [[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,1],[0,0,0,0,1]]
# maps = [[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,0],[0,0,0,0,1]]
print(&quot;정답 : &quot;,solution(maps))&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시행착오 및 배운점&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;# 1 동서남북 1칸씩 이동할 때 쓰면 좋을 루틴코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780849270143&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    dx = [1,-1,0,0]
    dy = [0,0,1,-1]
    
    for i in range (4) :
    nx = x + dx[i]
    ny = y + dy[i]&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Python/Coding-test</category>
      <category>BFS</category>
      <category>dfs</category>
      <category>python</category>
      <category>그래프</category>
      <author>duiiminish</author>
      <guid isPermaLink="true">https://kongs-code.tistory.com/13</guid>
      <comments>https://kongs-code.tistory.com/13#entry13comment</comments>
      <pubDate>Mon, 8 Jun 2026 00:33:48 +0900</pubDate>
    </item>
    <item>
      <title>[그래프] 깊이/너비 우선 탐색(DFS/BFS)문제 3</title>
      <link>https://kongs-code.tistory.com/12</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제&amp;nbsp;설명&lt;/b&gt;&lt;br /&gt;n개의 노드가 있는 그래프가 있습니다. 각 노드는 1부터 n까지 번호가 적혀있습니다. 1번 노드에서 가장 멀리 떨어진 노드의 갯수를 구하려고 합니다. 가장 멀리 떨어진 노드란 최단경로로 이동했을 때 간선의 개수가 가장 많은 노드들을 의미합니다.&lt;br /&gt;노드의&amp;nbsp;개수&amp;nbsp;n,&amp;nbsp;간선에&amp;nbsp;대한&amp;nbsp;정보가&amp;nbsp;담긴&amp;nbsp;2차원&amp;nbsp;배열&amp;nbsp;vertex가&amp;nbsp;매개변수로&amp;nbsp;주어질&amp;nbsp;때,&amp;nbsp;1번&amp;nbsp;노드로부터&amp;nbsp;가장&amp;nbsp;멀리&amp;nbsp;떨어진&amp;nbsp;노드가&amp;nbsp;몇&amp;nbsp;개인지를&amp;nbsp;return&amp;nbsp;하도록&amp;nbsp;solution&amp;nbsp;함수를&amp;nbsp;작성해주세요.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;제한사항&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;노드의&amp;nbsp;개수&amp;nbsp;n은&amp;nbsp;2&amp;nbsp;이상&amp;nbsp;20,000&amp;nbsp;이하입니다.&lt;/li&gt;
&lt;li&gt;간선은&amp;nbsp;양방향이며&amp;nbsp;총&amp;nbsp;1개&amp;nbsp;이상&amp;nbsp;50,000개&amp;nbsp;이하의&amp;nbsp;간선이&amp;nbsp;있습니다.&lt;/li&gt;
&lt;li&gt;vertex&amp;nbsp;배열&amp;nbsp;각&amp;nbsp;행&amp;nbsp;[a,&amp;nbsp;b]는&amp;nbsp;a번&amp;nbsp;노드와&amp;nbsp;b번&amp;nbsp;노드&amp;nbsp;사이에&amp;nbsp;간선이&amp;nbsp;있다는&amp;nbsp;의미입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-06-07 오전 4.20.55.png&quot; data-origin-width=&quot;1036&quot; data-origin-height=&quot;232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxEp3B/dJMcaci1FVO/sxj32acyToOMxO8s2PgEQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxEp3B/dJMcaci1FVO/sxj32acyToOMxO8s2PgEQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxEp3B/dJMcaci1FVO/sxj32acyToOMxO8s2PgEQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxEp3B%2FdJMcaci1FVO%2Fsxj32acyToOMxO8s2PgEQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;486&quot; height=&quot;109&quot; data-filename=&quot;스크린샷 2026-06-07 오전 4.20.55.png&quot; data-origin-width=&quot;1036&quot; data-origin-height=&quot;232&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가중치 없는 edge의 최단거리 -&amp;gt; BFS 접근&lt;/li&gt;
&lt;li&gt;vertex 배열로 그래프 먼저 만들자&lt;/li&gt;
&lt;li&gt;그 거리값을 가진 노드 개수 세기???
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&amp;lt;GPT hint&amp;gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;거리 배열을 하나 만들어봐. -&amp;gt; distance = [-1] * (n + 1)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;시작 노드는 distance[1] = 0&lt;/li&gt;
&lt;li&gt;BFS를 실행하며 아직 방문하지 않은 노드라면 -&amp;gt; distance[next] = distance[current] + 1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1780773922084&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from collections import deque

def solution(n, edge):
    answer = 0
    far_edge = 0
    def bfs(start) :
        queue = deque([start])
        distance[start] = 0

        while queue :
            v = queue.popleft()
            for i in graph[v] :
                if distance[i] == -1 :
                    distance[i] = distance[v] + 1
                    queue.append(i)

    # graph = [[]]*(n+1) # 이렇게 하면 모든 칸이 같은 리스트 공유
    graph = [[] for _ in range(n + 1)]
    for a, b in edge:
        graph[a].append(b)
        graph[b].append(a)

    distance = [-1]*(n+1)
    bfs(1)
    # print(graph)
    # print(distance)
    # print(max(distance))
    for i in distance :
        if i == max(distance) :
            answer += 1
    # print(answer)

    return answer

# n = 6
# vertex = [[3, 6], [4, 3], [3, 2], [1, 3], [1, 2], [2, 4], [5, 2]]
# solution(n,vertex)&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시행착오&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#1 2차원 배열 빈 리스트 만들기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780774106210&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;graph = [[]]*(n+1) # 이렇게 하면 모든 칸이 같은 리스트 공유&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;처음에 빈 리스트 배열 이렇게 만들었더니 append 하면 모든 리스트에 동일한 값이 할당됨&lt;/li&gt;
&lt;li&gt;위와 같이 빈 리스트를 만들면 print 했을 때는 문제 없어 보이지만, 메모리 상에서는 동일한 1개의 빈 리스트 객체를 가리키는 꼴이 되어버림&lt;/li&gt;
&lt;li&gt;따라서 서로 다른 객체의 빈 리스트 원소를 여러개 생성할 때는 아래와 같이 for문을 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1780774313669&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;graph = [[] for _ in range(n + 1)]&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;#2 distance 리스트를 왜 bfs의 매개변수로 넣어주지 않아도 bfs 함수 내에서 에러가 안생기는지?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Python의 &lt;/span&gt;&lt;b&gt;&lt;span&gt;클로저(Closure)&lt;/span&gt;&lt;/b&gt;&lt;span&gt; 와 &lt;/span&gt;&lt;b&gt;&lt;span&gt;LEGB 규칙&lt;/span&gt;&lt;/b&gt;&lt;span&gt; 때문.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Python은 변수를 찾을 때 아래 순서로 탐색함.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;현재 함수(Local) &amp;rarr; 바깥 함수(Enclosing) &amp;rarr; 전역(Global) &amp;rarr; 내장(Built-in)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;따라서 &lt;/span&gt;&lt;span&gt;bfs()&lt;/span&gt;&lt;span&gt; 내부에 &lt;/span&gt;&lt;span&gt;distance&lt;/span&gt;&lt;span&gt;가 없더라도, 바깥 함수인 &lt;/span&gt;&lt;span&gt;solution()&lt;/span&gt;&lt;span&gt;의 &lt;/span&gt;&lt;span&gt;distance&lt;/span&gt;&lt;span&gt;를 찾아 사용할 수 있음.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;또한 BFS 내부에서 수행하는&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;glsl&quot;&gt;&lt;code&gt;distance[i] = distance[v] + 1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;은 &lt;/span&gt;&lt;span&gt;distance&lt;/span&gt;&lt;span&gt; 변수를 새로 만드는 것이 아니라 &lt;/span&gt;&lt;b&gt;&lt;span&gt;리스트 객체 내부의 값만 수정하는 것&lt;/span&gt;&lt;/b&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그래서 &lt;/span&gt;&lt;span&gt;nonlocal&lt;/span&gt;&lt;span&gt; 선언도 필요하지 않음.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;반면,&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;distance = [0, -1, -1]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이와 같이&amp;nbsp;&lt;/span&gt;&lt;span&gt;distance&lt;/span&gt;&lt;span&gt; 자체를 새로 할당/정의하면 Python은 이를 &lt;/span&gt;&lt;span&gt;bfs()&lt;/span&gt;&lt;span&gt;의 지역 변수로 판단함. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 경우 바깥 함수의 &lt;/span&gt;&lt;span&gt;distance&lt;/span&gt;&lt;span&gt;와는 다른 변수가 되며, 상황에 따라 &lt;/span&gt;&lt;span&gt;UnboundLocalError&lt;/span&gt;&lt;span&gt;가 발생할 수 있음.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Python/Coding-test</category>
      <category>BFS</category>
      <category>python</category>
      <category>그래프</category>
      <author>duiiminish</author>
      <guid isPermaLink="true">https://kongs-code.tistory.com/12</guid>
      <comments>https://kongs-code.tistory.com/12#entry12comment</comments>
      <pubDate>Sun, 7 Jun 2026 04:46:13 +0900</pubDate>
    </item>
  </channel>
</rss>