<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Dev.Meoru</title>
    <link>https://meoru-tech.tistory.com/</link>
    <description>개발 관련 정보를 나누는 블로그입니다.</description>
    <language>ko</language>
    <pubDate>Fri, 14 Aug 2026 20:31:16 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Meoru_</managingEditor>
    <image>
      <title>Dev.Meoru</title>
      <url>https://tistory1.daumcdn.net/tistory/4640663/attach/2b9ee3acc448456bab6288d155fa550f</url>
      <link>https://meoru-tech.tistory.com</link>
    </image>
    <item>
      <title>✨ [비전공자의 SW개발자 성장기록] 이직 이야기 (삼성전자DX)</title>
      <link>https://meoru-tech.tistory.com/97</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오랜만에 이 시리즈를 쓴다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1128&quot; data-origin-height=&quot;382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IPuN7/btsIR1hf0Hz/30DjUbMjiItSm4cvM3kfPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IPuN7/btsIR1hf0Hz/30DjUbMjiItSm4cvM3kfPk/img.png&quot; data-alt=&quot;샘숭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IPuN7/btsIR1hf0Hz/30DjUbMjiItSm4cvM3kfPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIPuN7%2FbtsIR1hf0Hz%2F30DjUbMjiItSm4cvM3kfPk%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;1128&quot; height=&quot;382&quot; data-origin-width=&quot;1128&quot; data-origin-height=&quot;382&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;샘숭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2022년 7월에 전 회사 IT개발자 신입공채에 합격하고, 만 2년만에 삼성전자DX 디바이스플랫폼센터(DPC)로 이직했다.&lt;br&gt;이직을 결심한건 입사 후 1년이 지날 때 쯤이었다.&lt;br&gt;이유는 다양했다.&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;- 근무지 : 결혼을 준비중이다. 예비 아내는 서울에서 일하고, 나는 이천이다. 물론 전 회사의 셔틀 운행이 아주 잘 되어있는 편이지만... 출퇴근시간이 편도 1.5~2시간이었다.(신혼집 기준)&lt;br&gt;&amp;nbsp;&lt;br&gt;- 커리어 : IT개발자로 입사했고, JD에는 분명 Docker, Redis, Spring, Cloud, ... 등등이 있었다.&lt;br&gt;하지만 회사의 필요에 의해, 나는 수십명의 IT개발직무 입사 동기들과 동떨어져 혼자 생뚱맞은 팀에 배정되었고, JD에 적힌 수많은 수행 업무 중에서 내가 할 수 있는 건 없었다. 뿐만 아니라 내게 점점 더 회로설계 지식을 요구했다.&lt;br&gt;여기에 더 오래 있다가는, 개발자로서 커리어는 끝이라는 확신이 들었다.&lt;br&gt;&amp;nbsp;&lt;br&gt;- 재미 : 나는 어떤 분야가 됐건, SW개발이 정말 재밌다.&amp;nbsp;&amp;nbsp;원하는 데이터 쪼가리가 원활히 통신되기 위해 어떤 edge case를 고려할지 등을 고민하는게 즐겁다.&lt;br&gt;다만, 그 업무에 SW가 아닌 다른 도메인이 섞여들어가면 차게 식는 기분이 들었다. 그런 맥락에서, 회사 업무가 너무 재미가 없었다.&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;처음에는 내 직무를 바꿔버린 회사에 원망을 많이 했다.&lt;br&gt;이런 일을 할 줄 알았으면, 최종합한 다른 좋은 회사도 몇군데 있었는데 거기로 갔지.&lt;br&gt;하지만 돌아보면, 산업을 잘못 고른 내 잘못, 강하게 주장하지 못한 내 잘못, 일에서 재미를 추구하는 내 잘못도 있겠다.&lt;br&gt;&amp;nbsp;&lt;br&gt;11월부터 본격적으로 이직 준비를 시작했다.&lt;br&gt;매일 퇴근 후, 포트폴리오를 위한 프로젝트를 기획/개발하고, 개발 공부, 알고리즘 문제풀이, 기업 서칭/분석을 했다.&lt;br&gt;자연스럽게 하루 24시간이 모자랐다. 그렇다고 일을 등한시하지는 않았다고 자부한다.&lt;br&gt;물론 회사 말마따나 VWBE SUPEX하게 열심히 한건 아니지만, 10이 주어지면 10정도는 했다고 생각한다.&lt;br&gt;&lt;br&gt;대신 잠을 줄였다. 한 5개월정도는 하루 평균 4시간, 채용 전형으로 바쁠땐 3시간씩 잤다. 출퇴근길에는 전자책을 읽고, 자장가로 면접 유튜브를 들으면서 잠들었다.&lt;br&gt;내가 피곤해하는걸 예비 아내가 잘 이해해주고, 격려해줘서 너무 감사할 따름이다. 다 아내 덕이다.&lt;br&gt;&amp;nbsp;&lt;br&gt;1월부터 40군데가 넘는 회사에 지원했다. 평균연봉 3000의 스타트업부터 대기업까지 등등 다양하게 .. 경력이 아닌 신입으로 지원한곳도 많았다.&lt;br&gt;연봉이 수천 깎여도 상관없다 여겼다. 그만큼 개발이 하고 싶고, 개발자로 성장하고 싶었다. 이런 점까지도 아내는 응원해줬다.&lt;br&gt;&amp;nbsp;&lt;br&gt;이미 물경력이 된 2년 탓일까, 그냥 내가 부족한 탓일까, 서류가 붙은 곳은 5군데도 채 되지 않았다.&lt;br&gt;개발자 채용 한파의 영향도 있겠다. 아니면 내 경력을 보고 '연봉을 높게 부르겠지'라고 생각해서 거절한 곳도 많았을 거라고 생각한다.&lt;br&gt;&amp;nbsp;&lt;br&gt;결과적으로 삼성전자DX와 다른 한 곳에 최종 합격했다. 둘 모두 내 마음에 쏙 드는 직무이다.&lt;br&gt;경력 채용이라 그런지, JD에 팀과 파트, 직무(Backend Engineer)까지 명확하게 제시되어 있었다.&lt;br&gt;또 비개발 팀과 직무에 팔려가진 않겠지.&lt;br&gt;&amp;nbsp;&lt;br&gt;다른 한 곳이 페이나 개발업무의 양, 워라밸은 더 좋았지만, 복지나 커리어 성장 측면에서 삼성을 선택하게 되었다.&lt;br&gt;비록 또다시 제조업이지만.. 명색이 개발부문이니까 믿어본다. 그래도 최소한 탈반(반도체 탈출)했으니까 괜찮겠지.&lt;br&gt;나랑 오래 가자 DX.&lt;br&gt;&amp;nbsp;&lt;br&gt;올해 전 회사 PS가 참 많이 나올 것 같은데 그 점은 아쉽긴 하다.&lt;br&gt;그럼에도 불구하고 하고 싶은 직무를 할 수 있게 되어 기쁘다. 돈이야 뭐.. 벌면 되는거고.&lt;br&gt;일이 맞을지는 가 봐야 알겠지만 일단 지금은 행복하다.&lt;br&gt;출근은 내일부터다.&lt;br&gt;&amp;nbsp;&lt;br&gt;다음 성장기록은 어떤 내용이 될까. DX에서의 일상일까, 개인 개발 활동일까, 또 다른 이직일까.&lt;br&gt;셋 다 좋겠지. 뭐가 됐든 좀 더 성장한 내가 되면 좋겠다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;588&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnNVlM/btsIQZRY7jg/C63RoLkh59JSZ0g02ihcjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnNVlM/btsIQZRY7jg/C63RoLkh59JSZ0g02ihcjK/img.png&quot; data-alt=&quot;행복하면 됐지~ 오렌지주스 한잔해~&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnNVlM/btsIQZRY7jg/C63RoLkh59JSZ0g02ihcjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnNVlM%2FbtsIQZRY7jg%2FC63RoLkh59JSZ0g02ihcjK%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;399&quot; height=&quot;333&quot; data-origin-width=&quot;588&quot; data-origin-height=&quot;490&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;행복하면 됐지~ 오렌지주스 한잔해~&lt;/figcaption&gt;
&lt;/figure&gt;</description>
      <category>|  성장 기록</category>
      <category>DPC</category>
      <category>DX</category>
      <category>개발자</category>
      <category>디바이스플랫폼센터</category>
      <category>삼성전자</category>
      <category>이직</category>
      <author>Meoru_</author>
      <guid isPermaLink="true">https://meoru-tech.tistory.com/97</guid>
      <comments>https://meoru-tech.tistory.com/97#entry97comment</comments>
      <pubDate>Wed, 31 Jul 2024 14:44:19 +0900</pubDate>
    </item>
    <item>
      <title>Spring Boot(Kotlin) - Github Copilot 사용 후기 (Feat. Django에서는?)</title>
      <link>https://meoru-tech.tistory.com/95</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이전에 Flutter with Dart에서는 Github Copilot의 퍼포먼스가 굉장히 기대 이하였습니다.&lt;/p&gt;
&lt;figure id=&quot;og_1709495359575&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;Flutter(Dart) - Github Copilot 사용 후기&quot; data-og-description=&quot;Github Copilot 1개월 Free Tier를 통해 Flutter 앱개발에 활용해보았습니다. 거두절미하고 평점을 매기자면... 2.8/5.0 정도입니다. 아쉬운 점 : 코드 스니펫 제안 Widget 프로퍼티 값 제안은 상황에 맞게 그&quot; data-og-host=&quot;meoru-tech.tistory.com&quot; data-og-source-url=&quot;https://meoru-tech.tistory.com/92&quot; data-og-url=&quot;https://meoru-tech.tistory.com/92&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/GLdIs/hyVugTkF7M/rGY6hXKtoixQ8GwC8RckOK/img.png?width=162&amp;amp;height=152&amp;amp;face=0_0_162_152,https://scrap.kakaocdn.net/dn/ccP5g0/hyVupJuKP8/BPfm4S45cBnN4rkirQ4st1/img.png?width=162&amp;amp;height=152&amp;amp;face=0_0_162_152&quot;&gt;&lt;a href=&quot;https://meoru-tech.tistory.com/92&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://meoru-tech.tistory.com/92&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/GLdIs/hyVugTkF7M/rGY6hXKtoixQ8GwC8RckOK/img.png?width=162&amp;amp;height=152&amp;amp;face=0_0_162_152,https://scrap.kakaocdn.net/dn/ccP5g0/hyVupJuKP8/BPfm4S45cBnN4rkirQ4st1/img.png?width=162&amp;amp;height=152&amp;amp;face=0_0_162_152');&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;Flutter(Dart) - Github Copilot 사용 후기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Github Copilot 1개월 Free Tier를 통해 Flutter 앱개발에 활용해보았습니다. 거두절미하고 평점을 매기자면... 2.8/5.0 정도입니다. 아쉬운 점 : 코드 스니펫 제안 Widget 프로퍼티 값 제안은 상황에 맞게 그&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;meoru-tech.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;p data-ke-size=&quot;size16&quot;&gt;그런데 1인 프로젝트를 개발하다 보니 할 일이 너무 많았고, 생산성의 향상이 절실해졌습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Copilot 체험판 무료 기간은 이미 지났지만.. 지푸라기라도 잡는 심정으로 구독 신청해서 Spring Boot 애플리케이션에 적용해보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에도 거두절미하고 제 점수는....!! &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;4.9/5.0&lt;/span&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;다음은 Copilot이 적용된 일부 코드입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;738&quot; data-origin-height=&quot;710&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCvAOu/btsFuNsu1LT/SrKfC7XzWr8cA28zgP4bXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCvAOu/btsFuNsu1LT/SrKfC7XzWr8cA28zgP4bXK/img.png&quot; data-alt=&quot;ct-auth 코드 일부&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCvAOu/btsFuNsu1LT/SrKfC7XzWr8cA28zgP4bXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCvAOu%2FbtsFuNsu1LT%2FSrKfC7XzWr8cA28zgP4bXK%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;626&quot; height=&quot;602&quot; data-origin-width=&quot;738&quot; data-origin-height=&quot;710&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ct-auth 코드 일부&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째 흰색 네모칸이 copilot이 자동으로 작성해준 예외처리 코드이고, 두번째 네모칸이 현재 제안된 코드 스니펫입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;로직 설계 계획이 모두 끝나고 작성하는 도중에서야 코드 추천이 생성되던&lt;/b&gt;(그마저도 엉뚱한 코드, 에러 코드를 자주 내뱉던) Flutter에서와는 달리, 적당한 위치에 커서만 위치해놓으면 Copilot이 알아서&lt;i&gt; '아, 여긴 request에 대한 예외 처리가 들어갈 자리구나. 이런 예외처리는 어때?'&lt;/i&gt; 라고 말하듯 거의 정확한 코드를 추천해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;즉, '로직 설계 - 코드 작성' 단계가 모두 skip됩니다.&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;심지어 내가 생각하지도 못한 적절한 예외케이스를 제안해주기도 합니다. 굉장히 높은 정확성을 보여줍니다. Kotlin에서도 이런데, 아마 레퍼런스가 많은 Java에서는 최소한 비슷하거나 더 좋은 퍼포먼스를 보여주지 않을까 싶습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로 Spring Boot 프로젝트에서는 Copilot을 놓지 못할 것 같습니다. 생산성 향상이 장난아니네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;다만, 다른 파일을 참조하여 코드를 제안하는 성능은 아직은 좀 아쉬움이 있습니다.&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 테스트 작성이나, repository에서 Entity를 참조하는 부분 등은 정확도가 떨어지거나 엉뚱한 코드를 뱉는 일이 꽤 있습니다.&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;여담으로, Django에서도 Github Copilot을 사용해봤지만 &lt;s&gt;한 파일 내에서도 Spring Boot에서만큼 놀라운 성능을 보여주지는 않고 있습니다. Flutter보다 조금 나은 수준이라고 체감됩니다. 점수를 매기자면 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;3.0/5.0&lt;/b&gt;&lt;/span&gt; 정도.. 있어서 나쁠건 없지만 생산성이 크게 올라가지는 않는 느낌입니다.&lt;/s&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;s&gt;프레임워크마다 성능에 편차가 꽤 있네요. 얼른 더 성능이 올라가서, 모델과 성능 최적화, 테스트 작성 및 기능 추가에 더 집중할 수 있으면 좋겠습니다.&lt;/s&gt;&lt;/p&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;style4&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(수정) 며칠 더 써보니, copilot이 project 코드를 학습할만한 소스가 어느정도 필요해야 성능이 나오는 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무에서 유를 창조하는 능력은 떨어지지만, 유에서 유를 창조하는, 즉 반복 업무를 줄여주는 능력이 뛰어나다고 느꼈습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 Django Project 내에 여러 App들이 있습니다. 한 App정도만 예외처리나 모델 작성 등에 좀 신경써서 직접 작성했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후, 다른 App들을 작성할 때 제가 미리 정의해둔 각 App의 url과, 처음에 작성한 App의 코드들을 학습해서 새로운 App에 잘 적용해주는 모습입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1716&quot; data-origin-height=&quot;772&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6BqIT/btsFEYNRleh/zyCvx9i9sBBom09bE4oXE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6BqIT/btsFEYNRleh/zyCvx9i9sBBom09bE4oXE1/img.png&quot; data-alt=&quot;Django Project Copilot&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6BqIT/btsFEYNRleh/zyCvx9i9sBBom09bE4oXE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6BqIT%2FbtsFEYNRleh%2FzyCvx9i9sBBom09bE4oXE1%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;909&quot; height=&quot;409&quot; data-origin-width=&quot;1716&quot; data-origin-height=&quot;772&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Django Project Copilot&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 스크린샷에서, 노란색 박스가 직접 작성한 코드, 흰색 박스가 제 기존 코드 스타일에 맞춰서 Copilot이 자동으로 작성해준 코드들입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 100% 완전하게 만들어주지는 않지만, 80%수준으로는 코드를 완성해주는 것 같습니다. 그정도만으로도 생산성이 두 배 이상 증가한다고 체감했습니다. 다시 점수를 매기자면 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;4.5/5.0&lt;/b&gt;&lt;/span&gt;정도로 줄 수 있겠네요 ㅎㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;결론&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무래도 Java나 Kotlin은 정적 타입 언어이고, Spring이 프레임워크로써 비교적 구조에 더 Strict한 느낌이 있다 보니, 동적 타입 언어이고 비교적 구조가 자유로운 Python &amp;amp; Django보다는 Copilot의 성능이 조금 더 잘 나올 수는 있는 것 같습니다. 하지만, 프로젝트 내에 학습 소스가 충분히 주어지면, 그걸 활용해서 다른 코드들을 작성할 때 반복 업무를 줄여주는 성능은 프레임워크에 따라 크게 다르지 않다고 느꼈습니다.&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;Flutter &amp;amp; Dart에 대한 사용기도 이후에 바뀔 지도 모르겠네요 ㅎㅎ 아직까지는 Flutter + Copilot은 크게 좋다고 느끼진 못하고 있습니다. 다만 Copilot이 거의 매일같이 업데이트가 발행되고 있다보니, 앞날을 기대해봐도 될 것 같습니다.&lt;/p&gt;</description>
      <category>|  이모저모</category>
      <category>Django</category>
      <category>Flutter</category>
      <category>Github copilot</category>
      <category>Kotlin</category>
      <category>Python</category>
      <category>Spring Boot</category>
      <category>스프링부트</category>
      <category>장고</category>
      <category>코파일럿</category>
      <category>플러터</category>
      <author>Meoru_</author>
      <guid isPermaLink="true">https://meoru-tech.tistory.com/95</guid>
      <comments>https://meoru-tech.tistory.com/95#entry95comment</comments>
      <pubDate>Mon, 4 Mar 2024 05:27:38 +0900</pubDate>
    </item>
    <item>
      <title> &amp;zwj; [Docker] 가장 쉬운 말로 풀어 쓴 백엔드 (도커 편)</title>
      <link>https://meoru-tech.tistory.com/94</link>
      <description>&lt;div class=&quot;txc-textbox&quot; style=&quot;background-color: #ffffff; border: #cbcbcb 1px dashed; padding: 10px;&quot;&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;프로그래밍을 처음 배울 때 소위 '개미털기'가 많이 되는 단계는 바로 C언어의 포인터입니다.&lt;br /&gt;마찬가지로, &lt;b&gt;백엔드 개발의 '개미털기 지점'&lt;/b&gt;은 도커, 쿠버네티스, 클라우드, 네트워크, AWS 등이 있습니다.&lt;br /&gt;이 중에서, 본 시리즈를 통해 &lt;b&gt;도커&lt;/b&gt;와&lt;b&gt; 쿠버네티스&lt;/b&gt;의 등장 배경과 이론, 실습을 다뤄보려고 합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1b711d;&quot;&gt;&lt;b&gt;어려운 용어는 최대한 줄이고, 누구나 이해할 수 있도록 쉬운 말로 풀어쓰려 노력했습니다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 컨테이너 등장 배경&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커를 얘기하기 전에, 먼저 컨테이너(Container)에 대해 설명이 필요합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;504&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KuBD8/btsEnQ5wKM6/6RXXJipdyFdALa1XPuK0oK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KuBD8/btsEnQ5wKM6/6RXXJipdyFdALa1XPuK0oK/img.png&quot; data-alt=&quot;컨테이너 등장 이전 선박 화물 운송 형태&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KuBD8/btsEnQ5wKM6/6RXXJipdyFdALa1XPuK0oK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKuBD8%2FbtsEnQ5wKM6%2F6RXXJipdyFdALa1XPuK0oK%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;622&quot; height=&quot;335&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;504&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;컨테이너 등장 이전 선박 화물 운송 형태&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너 등장 이전, 선박을 통해 화물을 운송하는 모습입니다. &lt;span style=&quot;color: #781b33;&quot;&gt;화물의 크기와 형태가 모두 다르기 때문에 사람이 직접 배에 실어야 했고, 비용과 시간이 많이 들었습니다. 배에 화물을 얼마나 실을 수 있을지도 가늠하기 어려웠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;355&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F1ssq/btsEm7Ndz7A/Jk0NEe12bvKJ9lNWj132ek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F1ssq/btsEm7Ndz7A/Jk0NEe12bvKJ9lNWj132ek/img.png&quot; data-alt=&quot;컨테이너(Container)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F1ssq/btsEm7Ndz7A/Jk0NEe12bvKJ9lNWj132ek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF1ssq%2FbtsEm7Ndz7A%2FJk0NEe12bvKJ9lNWj132ek%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;628&quot; height=&quot;355&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;355&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;컨테이너(Container)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너가 등장한 이후, 선박으로 화물을 운송하는 모습입니다. &lt;span style=&quot;color: #006dd7;&quot;&gt;컨테이너는 규격화된 크기와 형태를 가지고 있기 때문에, 기구(크레인)를 통해 화물을 선적할 수 있게 되었습니다. 비용과 시간이 절약되고, 최대 적재량을 정의할 수 있게 되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1574&quot; data-origin-height=&quot;464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TtasO/btsEqYuXTqW/oBB8omzKWKkLYmDK1wIXU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TtasO/btsEqYuXTqW/oBB8omzKWKkLYmDK1wIXU1/img.png&quot; data-alt=&quot;서버 구성 추상화의 역사&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TtasO/btsEqYuXTqW/oBB8omzKWKkLYmDK1wIXU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTtasO%2FbtsEqYuXTqW%2FoBB8omzKWKkLYmDK1wIXU1%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;1574&quot; height=&quot;464&quot; data-origin-width=&quot;1574&quot; data-origin-height=&quot;464&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;서버 구성 추상화의 역사&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어에서 컨테이너도 같은 역할을 합니다. 컨테이너 개념은 2000년대 초반에 등장하였습니다. &lt;span style=&quot;color: #781b33;&quot;&gt;그 이전에는, 특정 환경에서 동작하는 애플리케이션을 가동시키기 위해 가상머신(VM: Virtual Machine)을 빌드해야 했습니다. 이 때, 각 VM마다 운영체제(OS: Operating System; Windows, Linux)를 설치해줘야 했고, 이 용량이 약 수십GB로 아주 무거웠습니다. 또, 시스템 설정, 라이브러리 버전도 매번 달라지고 자동화가 어려웠기 때문에 인력이 많이 요구되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;컨테이너는 규격화된 크기와 형태(&lt;b&gt;이미지&lt;/b&gt;)를 가지고 있기 때문에, 기구(&lt;b&gt;컨테이너화 플랫폼; 도커&lt;/b&gt;)를 통해 애플리케이션을 가동할 수 있는 환경(&lt;b&gt;컨테이너&lt;/b&gt;)을 구축할 수 있게 되었습니다. 비용과 시간이 절약되고, 메모리 및 디스크 용량을 더 효율적으로 활용할 수 있게 되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;컨테이너마다 OS를 설치할 필요가 없도록 &lt;b&gt;컨테이너화 플랫폼(;도커)&lt;/b&gt;이 지원해주었고, 해당 OS에 필요한 최소한의 필수 종속성 파일들만 설치하면 되었습니다. 이 파일들은 &lt;b&gt;이미지&lt;/b&gt;에 미리 정의되어 있으며, 크기가 약 수KB ~ 1GB로 OS에 비해 아주 가벼웠습니다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;background-color: #eeeeee; border: #eeeeee 1px solid; padding: 10px;&quot;&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #781b33;&quot;&gt;&lt;b&gt;[면접 질문] VM이 필요했던 이유?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 호환성&lt;/b&gt;: 프로그램이 개발된 환경과 실행 환경이 다를 경우,프로그램이 동작하지 않거나 의도되지 않은 동작을 할 가능성이 큽니다. 가령 C언어만 해도, &lt;span style=&quot;background-color: #eeeeee; color: #333333; text-align: center;&quot;&gt;Windows와 Linux에서 &lt;/span&gt;기본 탑재된 standard library의 종류가 서로 다릅니다.&lt;br /&gt;이와 같이, OS 종속성이 있는 애플리케이션을 실행하기 위해 해당 OS로 VM을 빌드해서 사용했습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 격리&lt;/b&gt;: VM은 VM이 실행되는 컴퓨터 내의 애플리케이션, 그리고 다른 VM상의 애플리케이션들과 강하게 격리됩니다. 이는 종속성 충돌을 방지하고 보안 수준을 높여줍니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 비용&lt;/b&gt;: VM이 생기기 이전에는 종속성 관리를 위해 사무실 내에 윈도우 컴퓨터, 리눅스 컴퓨터가 따로 여러 대씩 구비되어 있어야 했습니다. VM을 통해 하드웨어 구매 비용을 크게 절약할 수 있었습니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 도커 등장 배경&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&quot;오케이, VM이 필요했던 이유도 알겠고, VM이 너무 무겁고 라이브러리 관리가 어려워서 컨테이너로 대체된건 알겠어. 그래서 Docker가 뭔데?&quot;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;먼저 백문이 불여일견,&lt;/b&gt;&lt;/span&gt; &lt;a title=&quot;Docker 발표 영상&quot; href=&quot;https://youtu.be/wW9CAH9nSLs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;도커의 창립자인 Solomon Hykes의 PYCON 2013 도커 발표 영상&lt;/a&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;을 보고 오기를 추천합니다.&lt;/b&gt;&lt;/span&gt; 영어로 된 영상이긴 하지만, 유튜브 자동 한글 자막으로 봤을 때 이해에 어려움은 없었습니다. (오역이 조금 있는데, Lily는 Linux, Doklet은 Docker...정도로 이해하시면 됩니다.) 설명도 너무 깔끔하고, 시연 영상도 있고, PT는 이렇게 하는거구나 싶은 영상입니다. &lt;i&gt;&lt;s&gt;솔로몬 왈, 오픈소스니까 구체적인 설명은 니가 알아서 뜯어봐라 ㅋㅋㅋ&lt;/s&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mFG2B/btsEqugkDL4/EKU7IkeaPKhdPPeQhnBvw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mFG2B/btsEqugkDL4/EKU7IkeaPKhdPPeQhnBvw0/img.png&quot; data-alt=&quot;Docker 시연 영상&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mFG2B/btsEqugkDL4/EKU7IkeaPKhdPPeQhnBvw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmFG2B%2FbtsEqugkDL4%2FEKU7IkeaPKhdPPeQhnBvw0%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;620&quot; height=&quot;431&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;664&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Docker 시연 영상&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커는 위에서 얘기했듯, &lt;b&gt;컨테이너화 플랫폼&lt;/b&gt; 중 하나입니다. 컨테이너 개념은 2000년대 초반부터 있었고, 그 뒤로 다양한 컨테이너화 플랫폼이 발표되었지만 업계 표준으로 사용될만큼 사용성과 안정성이 확보된 플랫폼이 없었습니다. 그러던 중 2013년 PYCON에서 Docker 오픈소스가 발표되었고, 이후 Docker는 점차 업계 표준으로 자리잡게 됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 도커의 기능 및 원리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 Solomon이 말했듯, Docker에는 로드밸런싱이나 scale-out 지원, process 관리 등 다양한 기능이 있지만, 가장 핵심이 되는 기능은 다음과 같습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;도커는 Pre-packaged된 도커 이미지(1 or more)로 컨테이너를 만들고, 그 위에서 애플리케이션을 실행시킵니다. 또한 컨테이너와 Host OS 커널이 통신할 수 있도록 네트워크 인터페이스를 구성하여 IP를 전달해줍니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;갑자기 말이 어려워졌네요. 아주 간단한 실습을 통해 그림과 함께 알아봅시다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 아주 간단한 도커 실습(환경 설정)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;Docker는 기본적으로 Linux System 위에서 동작합니다. 따라서 MacOS, Ubuntu, CentOS 등 Linux/Unix 계열 OS를 사용하시는 분들은 각자 패키지 매니저를 통해 docker를 설치하시면 바로 사용하실 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Windows를 사용하시는 분들은 별도의 작업이 필요합니다.&lt;br /&gt;각 step을 스크린샷으로 보여드리고 싶은데, 이미 wsl2나 docker desktop이 설치되어있어서.. 지웠다가 다시 깔수도 없고.. ㅎㅎ&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1182&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkLMYq/btsElJGmYa4/PsdXO7rSaho40n57pBpX5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkLMYq/btsElJGmYa4/PsdXO7rSaho40n57pBpX5k/img.png&quot; data-alt=&quot;powershell 관리자로 실행&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkLMYq/btsElJGmYa4/PsdXO7rSaho40n57pBpX5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkLMYq%2FbtsElJGmYa4%2FPsdXO7rSaho40n57pBpX5k%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;555&quot; height=&quot;330&quot; data-origin-width=&quot;1182&quot; data-origin-height=&quot;703&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;powershell 관리자로 실행&lt;/figcaption&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;&amp;nbsp;시작 - powershell - 관리자로 실행&lt;/li&gt;
&lt;li&gt;wsl --install&lt;/li&gt;
&lt;li&gt;wsl --set-default-version 2&lt;/li&gt;
&lt;li&gt;Docker Desktop 공식 홈페이지에서 Download for Windows&lt;/li&gt;
&lt;li&gt;Docker Desktop 설치 - 설치 도중 Configuration WSL2 설정 필요&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;blob&quot; data-origin-width=&quot;279&quot; data-origin-height=&quot;87&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwpSAp/btsEwKC8i7Q/YbwMTivJyYKKk1nvfjjNuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwpSAp/btsEwKC8i7Q/YbwMTivJyYKKk1nvfjjNuK/img.png&quot; data-alt=&quot;configure WSL2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwpSAp/btsEwKC8i7Q/YbwMTivJyYKKk1nvfjjNuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwpSAp%2FbtsEwKC8i7Q%2FYbwMTivJyYKKk1nvfjjNuK%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;407&quot; height=&quot;127&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;279&quot; data-origin-height=&quot;87&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;configure WSL2&lt;/figcaption&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;Docker Desktop 1회 실행 후 Get Started 클릭&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 Windows에서 docker를 사용할 준비가 완료됐습니다. powershell이나 wsl2에서 docker를 실행해보세요.&lt;br /&gt;&lt;b&gt;※ cmd와 powershell은 다릅니다. 본 예제에서는 powershell을 사용하니 주의해주세요.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;692&quot; data-origin-height=&quot;574&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4aDLl/btsEmPMBg2V/GiFHxdLZkPksNB0zPILS9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4aDLl/btsEmPMBg2V/GiFHxdLZkPksNB0zPILS9K/img.png&quot; data-alt=&quot;docker 실행!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4aDLl/btsEmPMBg2V/GiFHxdLZkPksNB0zPILS9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4aDLl%2FbtsEmPMBg2V%2FGiFHxdLZkPksNB0zPILS9K%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;508&quot; height=&quot;421&quot; data-origin-width=&quot;692&quot; data-origin-height=&quot;574&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;docker 실행!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;5. 아주 간단한 도커 실습(서버 구동)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 docker를 통해 간단한 리눅스 계열 OS에서 파이썬 서버를 구동시켜 보겠습니다.&lt;br /&gt;실습을 통해 우리는 다음 같은 Workflow를 경험해볼 수 있습니다.&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;1412&quot; data-origin-height=&quot;495&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEDP3L/btsEvvTLjZO/jxuRppQeikvzUKnXArT0ek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEDP3L/btsEvvTLjZO/jxuRppQeikvzUKnXArT0ek/img.png&quot; data-alt=&quot;실습 Process&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEDP3L/btsEvvTLjZO/jxuRppQeikvzUKnXArT0ek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEDP3L%2FbtsEvvTLjZO%2FjxuRppQeikvzUKnXArT0ek%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;1412&quot; height=&quot;495&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1412&quot; data-origin-height=&quot;495&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실습 Process&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;powershell에서 다음 명령어를 순서대로 입력합니다.&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;/ul&gt;
&lt;pre id=&quot;code_1707139114236&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mkdir ~/Desktop/docker-fastapi-test&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;Dockerfile&quot; 이라고 저장합니다. &lt;b&gt;파일 이름은 따옴표로 감싸고, 파일 형식은 &quot;모든 파일&quot;로 지정합니다.&amp;nbsp;&lt;/b&gt;(.txt파일로 저장되는 것을 막아줍니다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1707139338511&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FROM python:3.9-slim
WORKDIR /app
COPY . /app
RUN pip install --no-cache-dir -r requirements.txt
EXPOSE 80
CMD [&quot;uvicorn&quot;, &quot;main:app&quot;, &quot;--host&quot;, &quot;0.0.0.0&quot;, &quot;--port&quot;, &quot;80&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;991&quot; data-origin-height=&quot;443&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Nv8SJ/btsEti1SUJ3/CUVrFAWdtk24ZBbvhfZAu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Nv8SJ/btsEti1SUJ3/CUVrFAWdtk24ZBbvhfZAu0/img.png&quot; data-alt=&quot;Dockerfile&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Nv8SJ/btsEti1SUJ3/CUVrFAWdtk24ZBbvhfZAu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNv8SJ%2FbtsEti1SUJ3%2FCUVrFAWdtk24ZBbvhfZAu0%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;694&quot; height=&quot;310&quot; data-origin-width=&quot;991&quot; data-origin-height=&quot;443&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Dockerfile&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dockerfile은 Docker 이미지를 생성하기 위한 설정 파일입니다. 각 line은 다음과 같은 의미를 가집니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1597&quot; data-origin-height=&quot;554&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmrZnZ/btsEmpVHlDd/vqHASUlv6OCsBeNJhvWXe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmrZnZ/btsEmpVHlDd/vqHASUlv6OCsBeNJhvWXe1/img.png&quot; data-alt=&quot;Dockerfile 설명&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmrZnZ/btsEmpVHlDd/vqHASUlv6OCsBeNJhvWXe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmrZnZ%2FbtsEmpVHlDd%2FvqHASUlv6OCsBeNJhvWXe1%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;1597&quot; height=&quot;554&quot; data-origin-width=&quot;1597&quot; data-origin-height=&quot;554&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Dockerfile 설명&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때, 위에서 말한 Linux OS는 어디에 있냐? 라고 하시면, python:3.9-slim 내부에 있습니다.&lt;br /&gt;python:3.9-slim은 Docker Hub라는, Dockerfile들을 모아놓은 저장소에 정의되어 있습니다.&lt;br /&gt;즉, python:3.9-slim 또한 별개의 Dockerfile이며, Dockerfile에서 다른 Dockerfile을 불러와서 사용할 수도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a title=&quot;python 3.9 slim dockerfile&quot; href=&quot;https://github.com/docker-library/python/blob/643270748f00109a784e21dad4433258c4143f18/3.9/slim-bookworm/Dockerfile&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;python:3.9-slim dockerfile 링크&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 링크에서 보면, OS는 내부적으로 debian:bookworm-slim 을 사용하고 있습니다. debian은 Linux OS(정확히는 Unix OS)의 한 종류인데, slim이라는 건 최소 기능만 남겨놓은 경량화 모델이라고 보시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;uvicorn은 파이썬 서버를 구동하기 위한 애플리케이션으로, 자세한 설명은 생략합니다.&lt;/span&gt;&lt;b&gt;&lt;br /&gt;※ requirements.txt 및 main:app은 아래에서 작성합니다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;마찬가지로 새 메모장에서 다음 코드를 복붙합니다. 같은 경로에 main.py 라는 이름으로 저장합니다. &lt;b&gt;이 때는 파일 이름을 따옴표로 감쌀 필요는 없고, 파일 형식은 &quot;모든 파일&quot;로 선택합니다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1707139697841&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from fastapi import FastAPI

app = FastAPI()

@app.get(&quot;/&quot;)
def read_root():
    return {&quot;message&quot;: &quot;Hello, welcome to the root path!&quot;}

@app.get(&quot;/home&quot;)
def read_home():
    return {&quot;message&quot;: &quot;Hello, welcome to the home path!&quot;}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Tp8rF/btsEmLYzGTi/KGVc5jSu0YjqsLFnKP2EWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Tp8rF/btsEmLYzGTi/KGVc5jSu0YjqsLFnKP2EWk/img.png&quot; data-alt=&quot;main.py&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Tp8rF/btsEmLYzGTi/KGVc5jSu0YjqsLFnKP2EWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTp8rF%2FbtsEmLYzGTi%2FKGVc5jSu0YjqsLFnKP2EWk%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;687&quot; height=&quot;313&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;446&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;main.py&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드는 파이썬의 서버 프레임워크 중 하나인 FastAPI로 작성한 Sample Code로, 자세한 설명은 생략합니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;마지막으로, 같은 경로에 다음과 같이 requirements.txt 를 작성해줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1707139771453&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fastapi==0.68.0
uvicorn==0.15.0&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;이제 드디어 Docker Image를 만들 수 있습니다.&lt;br /&gt;powershell에서 아까 만든 폴더로 이동 후, -t(--tag) 옵션으로 &quot;fastapi-test&quot;라는 이름의 이미지를 생성합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1707140881787&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd ~/Desktop/docker-fastapi-test
docker build -t fastapi-test .&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1452&quot; data-origin-height=&quot;664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F0vAD/btsEnQk3Es8/5g2mXF66bQKQ2nr1Dim01K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F0vAD/btsEnQk3Es8/5g2mXF66bQKQ2nr1Dim01K/img.png&quot; data-alt=&quot;docker image 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F0vAD/btsEnQk3Es8/5g2mXF66bQKQ2nr1Dim01K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF0vAD%2FbtsEnQk3Es8%2F5g2mXF66bQKQ2nr1Dim01K%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;783&quot; height=&quot;358&quot; data-origin-width=&quot;1452&quot; data-origin-height=&quot;664&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;docker image 생성&lt;/figcaption&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;위와 같이 출력되면 정상적으로 이미지가 생성된 것입니다. docker images 를 통해 생성된 이미지를 확인할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;80&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/niorT/btsEnhpc2Fn/fJdjMw1818oscOaQJhTyB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/niorT/btsEnhpc2Fn/fJdjMw1818oscOaQJhTyB1/img.png&quot; data-alt=&quot;docker images&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/niorT/btsEnhpc2Fn/fJdjMw1818oscOaQJhTyB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FniorT%2FbtsEnhpc2Fn%2FfJdjMw1818oscOaQJhTyB1%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;721&quot; height=&quot;80&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;80&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;docker images&lt;/figcaption&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;생성한 이미지를 컨테이너로 생성하고 실행시킵니다. -p 옵션을 통해 8080:80 과 같이 포트를 매핑합니다. (hostPort : containerPort)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1707141149495&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run -p 8080:80 fastapi-test&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6G5BH/btsEtlxAqTv/ZU1bVsiVkK3E4iC1ZTOhaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6G5BH/btsEtlxAqTv/ZU1bVsiVkK3E4iC1ZTOhaK/img.png&quot; data-alt=&quot;docker run&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6G5BH/btsEtlxAqTv/ZU1bVsiVkK3E4iC1ZTOhaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6G5BH%2FbtsEtlxAqTv%2FZU1bVsiVkK3E4iC1ZTOhaK%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;748&quot; height=&quot;96&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;96&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;docker run&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;드디어 서버가 구동되었습니다. 이제 웹 브라우저를 켜고, 새 탭에서 127.0.0.1:8080에 접속해봅니다. 127.0.0.1:8080/home 에도 접속해봅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/me75F/btsEvfKeoJL/mLUNriJoK4kfIusZUMzzd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/me75F/btsEvfKeoJL/mLUNriJoK4kfIusZUMzzd1/img.png&quot; data-alt=&quot;127.0.0.1:8080/home&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/me75F/btsEvfKeoJL/mLUNriJoK4kfIusZUMzzd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fme75F%2FbtsEvfKeoJL%2FmLUNriJoK4kfIusZUMzzd1%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;502&quot; height=&quot;168&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;168&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;127.0.0.1:8080/home&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ip주소에서 0.0.0.0과 127.0.0.1은 특별한 의미를 가지고 있습니다.&lt;br /&gt;0.0.0.0은 &quot;모든 ip주소&quot;를 의미하고, 127.0.0.1은 &quot;내 PC&quot;를 의미합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 컨테이너 내부 main.py에서 설정했던 0.0.0.0:80 은 &quot;모든 ip의 80번 포트에 대해&quot; 응답을 대기한다는 뜻이고, Host PC의 127.0.0.1:8080 은 &quot;내 컴퓨터의 8080번 포트에 대해&quot; 요청을 보낸다는 뜻입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;438&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m6OZU/btsEmO8Jvki/KrkkUCgSAr6tSdhsBMKR30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m6OZU/btsEmO8Jvki/KrkkUCgSAr6tSdhsBMKR30/img.png&quot; data-alt=&quot;통신 프로세스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m6OZU/btsEmO8Jvki/KrkkUCgSAr6tSdhsBMKR30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm6OZU%2FbtsEmO8Jvki%2FKrkkUCgSAr6tSdhsBMKR30%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;519&quot; height=&quot;438&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;438&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;통신 프로세스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 웹에서 &quot;내 컴퓨터의 8080 포트로 요청을 보내줘&quot;라고 했을 때의 통신 프로세스입니다. 1~6번 과정을 거쳐, 우리는 웹에서 welcome 메세지를 볼 수 있게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용이 끝난 컨테이너와 이미지는 지워줍시다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Ctrl - C : uvicorn 서버 종료&lt;/li&gt;
&lt;li&gt;docker ps -a : exit된 컨테이너의 ID code 확인&lt;/li&gt;
&lt;li&gt;docker rm (id code) : 컨테이너 완전 삭제. id code 앞의 몇글자만 적어도 됨.&lt;/li&gt;
&lt;li&gt;docker image rm fastapi-test : 이미지 삭제&lt;/li&gt;
&lt;li&gt;docker images : 이미지 삭제된 것 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;548&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxvcEb/btsEmtjuNjW/TAdZPWMYM6hUQkJKHptZl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxvcEb/btsEmtjuNjW/TAdZPWMYM6hUQkJKHptZl1/img.png&quot; data-alt=&quot;이미지 삭제&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxvcEb/btsEmtjuNjW/TAdZPWMYM6hUQkJKHptZl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxvcEb%2FbtsEmtjuNjW%2FTAdZPWMYM6hUQkJKHptZl1%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;1448&quot; height=&quot;548&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;548&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이미지 삭제&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이번 포스팅을 통해 컨테이너와 도커의 탄생 배경, 개념, 원리, 실습을 진행했습니다.&lt;br /&gt;최대한 쉬운 말로 풀어쓰려 열심히 노력했는데, 내용 전달이 잘 되었길 바랍니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다음 포스팅을 통해 쿠버네티스, k8s에 대해 알아보도록 하겠습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;지적이나 질문은 항상 감사합니다.&lt;/p&gt;</description>
      <category>|  프로그래밍 분야/SRE</category>
      <category>Container</category>
      <category>docker</category>
      <category>sre</category>
      <category>도커</category>
      <category>백엔드</category>
      <category>서버개발</category>
      <category>컨테이너</category>
      <author>Meoru_</author>
      <guid isPermaLink="true">https://meoru-tech.tistory.com/94</guid>
      <comments>https://meoru-tech.tistory.com/94#entry94comment</comments>
      <pubDate>Tue, 6 Feb 2024 00:56:21 +0900</pubDate>
    </item>
    <item>
      <title> 파이썬 Disjoint-Set(Union-Find) 이론 및 예제</title>
      <link>https://meoru-tech.tistory.com/93</link>
      <description>&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;알고리즘 코딩 테스트를 준비하다 보면 다양한 자료구조와 알고리즘을 만나게 됩니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그 중에서도&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Disjoint-Set(서로소 집합)을 활용한 Union-Find는 중상난이도 문제에서 자주 출제되는 유형&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;중 하나입니다.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;이번 글에서는 Disjoint-Set, Union-Find의 개념과 파이썬으로 구현하는 방법에 대해 알아보겠습니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h2 style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;Disjoint-Set(Union-Find)이란?&lt;/span&gt;&lt;/b&gt;&lt;/h2&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;258&quot; data-origin-height=&quot;218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAScac/btsA8OCnpVS/qKUCUlUFauaOKHUCDVHCk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAScac/btsA8OCnpVS/qKUCUlUFauaOKHUCDVHCk0/img.png&quot; data-alt=&quot;서로소 집합&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAScac/btsA8OCnpVS/qKUCUlUFauaOKHUCDVHCk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAScac%2FbtsA8OCnpVS%2FqKUCUlUFauaOKHUCDVHCk0%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;258&quot; height=&quot;218&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;258&quot; data-origin-height=&quot;218&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;서로소 집합&lt;/figcaption&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;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;단순히 disjoint-set은&lt;/span&gt; 서로 다른 두 집합(서로소 집합)&lt;span style=&quot;color: #000000;&quot;&gt;을 뜻함&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;서로 다른 집합을 모아 하나의 집합으로 만드는&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;Union-find 알고리즘&lt;/span&gt;에 사용됨&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;사용되는 case&lt;/b&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;span style=&quot;color: #ee2323;&quot;&gt;그래프에서 서로 다른 정점을 연결&lt;/span&gt;하는 최소 신장 트리를 구하는 문제&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;서로 다른 집합을 합치는 문제&lt;/span&gt; 등&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&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;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Union&lt;/span&gt;: 두 개의 집합을 하나로 합치는 연산&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Find&lt;/span&gt;: 주어진 원소가 속하는 집합의 루트 노드를 찾는 연산&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;트리(Tree) 자료구조&lt;/span&gt;를 이용하여 구현됨&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;파이썬으로 Union-Find 구현하기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단순히 말 그대로의 disjoint-set은 파이썬의 set 자료구조를 사용하면 다음과 같이 사용할 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701188472121&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a_set = {1,2,3}
b_set = {4,5}
a_set.isdisjoint(b_set) # True
a_set | b_set # {1,2,3,4,5}&lt;/code&gt;&lt;/pre&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;또한 서로소 집합 갯수가 많아질수록 각 집합의 disjoint 여부를 체크하다보면 시간복잡도도 크게 증가합니다.&lt;/b&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;&lt;b&gt;따라서 다음과 같이 하나의 집합으로, &lt;span style=&quot;color: #ee2323;&quot;&gt;트리(Tree)구조&lt;/span&gt;를 활용하여 구현합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;여기서 &lt;span style=&quot;color: #ee2323;&quot;&gt;집합의 각 인덱스는 해당 원소의 노드 번호&lt;/span&gt;,&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;집합의 각 원소의 값은 부모 노드의 인덱스&lt;/span&gt;를 뜻합니다. (-1일 경우 자기 자신이 부모 노드. 즉, 트리의 root)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701189203625&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class DisjointSet:
    def __init__(self, size):
        self.data = [-1] * size # 초깃값 -1

    def find(self, x):
		# recursion으로도 구현해 되나, 가능하면 반복문으로 구현 (recursion limit error때문)
        while True:
            parent = self.data[x]
            if parent &amp;lt; 0:
                return x
            x = parent

    def union(self, x, y):
        root_x, root_y = self.find(x), self.find(y)
        if root_x != root_y:
            self.data[root_y] = root_x&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;웬만한 문제는 위와 같이 구현하면 다 풀리지만, 위와 같이 구현했음에도 time limit exceed되는 경우가 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;158&quot; data-origin-height=&quot;182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJLBxe/btsA21iWfRG/ZgiBV0iJ0L4vOwMHISoWGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJLBxe/btsA21iWfRG/ZgiBV0iJ0L4vOwMHISoWGK/img.png&quot; data-alt=&quot;편향 Tree&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJLBxe/btsA21iWfRG/ZgiBV0iJ0L4vOwMHISoWGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJLBxe%2FbtsA21iWfRG%2FZgiBV0iJ0L4vOwMHISoWGK%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;158&quot; height=&quot;182&quot; data-origin-width=&quot;158&quot; data-origin-height=&quot;182&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;편향 Tree&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;위와 같이, 데이터가 편향된 Tree들이 주어졌을 경우, 위 구현에서 find의 시간복잡도는 O(N)이 되기 때문입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그런 경우 각 노드의 tree에서의 rank 개념을 도입하여, 다음과 같이 최적화해주면 됩니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701189302057&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class DisjointSet:
    def __init__(self, size):
        self.data = [-1] * size
        self.rank = [0]

    def find(self, x):
        while True:
            parent = self.data[x]
            if parent &amp;lt; 0:
                return x
            x = parent

    def union(self, x, y):
        root_x = self.find(x)
        root_y = self.find(y)

        if root_x == root_y:
            return

        if self.rank[root_x] &amp;gt; self.rank[root_y]:
            self.data[root_y] = root_x
        elif self.rank[root_x] &amp;lt; self.rank[root_y]:
            self.data[root_x] = root_y
        else:
            self.data[root_y] = root_x
            self.rank[root_x] += 1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a title=&quot;친구 네트워크&quot; href=&quot;https://www.acmicpc.net/problem/4195&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;boj의 친구 네트워크&lt;/a&gt;가 Union-Find를 활용한 유명한 문제 중 하나입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;풀이 방법은 다양하겠지만, 큐 활용을 잘 생각해보면 간단히 풀 수 있는(40줄 이내) 문제이니 풀어보시고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;u&gt;다른 사람들의 풀이도 꼭 참고해보시길 바랍니다.&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>|  자료구조 &amp;amp; 알고리즘/알고리즘</category>
      <category>disjoint-set</category>
      <category>Python</category>
      <category>Union-Find</category>
      <category>서로소 집합</category>
      <category>알고리즘</category>
      <category>유니온 파인드</category>
      <category>자료구조</category>
      <category>파이썬</category>
      <author>Meoru_</author>
      <guid isPermaLink="true">https://meoru-tech.tistory.com/93</guid>
      <comments>https://meoru-tech.tistory.com/93#entry93comment</comments>
      <pubDate>Wed, 29 Nov 2023 01:49:38 +0900</pubDate>
    </item>
    <item>
      <title>Flutter(Dart) - Github Copilot 사용 후기</title>
      <link>https://meoru-tech.tistory.com/92</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Github Copilot 1개월 Free Tier를 통해 Flutter 앱개발&lt;/span&gt;에 활용해보았습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;거두절미하고 평점을 매기자면...&lt;span style=&quot;color: #ee2323;&quot;&gt; 2.8/5.0 &lt;/span&gt;정도입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;아쉬운 점 : 코드 스니펫 제안&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Widget 프로퍼티 값 제안&lt;/span&gt;은 상황에 맞게 그럴듯하게 잘 해줍니다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;443&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPgqov/btsAmGr6uCr/WuqSUtmk1w0i48QpURJH71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPgqov/btsAmGr6uCr/WuqSUtmk1w0i48QpURJH71/img.png&quot; data-alt=&quot;Italic체가 제안 부분&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPgqov/btsAmGr6uCr/WuqSUtmk1w0i48QpURJH71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPgqov%2FbtsAmGr6uCr%2FWuqSUtmk1w0i48QpURJH71%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;443&quot; height=&quot;139&quot; data-origin-width=&quot;443&quot; data-origin-height=&quot;139&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Italic체가 제안 부분&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;딱 expand constraints를 작성하려고 할 때 constraints: 까지만 입력하면 뒷부분은 잘 만들어주는 모습입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;하지만, 사용자가 constraints를 입력했다는건 애초에 expand constraints에 대해 생각하고 있었다는거죠.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;constraints에 대한 개념이 애초에 없었다면?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;477&quot; data-origin-height=&quot;114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2hm6S/btsAjfIRLtH/rqOdrWr8PtwopZEkUk8fxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2hm6S/btsAjfIRLtH/rqOdrWr8PtwopZEkUk8fxK/img.png&quot; data-alt=&quot;제안 X&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2hm6S/btsAjfIRLtH/rqOdrWr8PtwopZEkUk8fxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2hm6S%2FbtsAjfIRLtH%2FrqOdrWr8PtwopZEkUk8fxK%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;477&quot; height=&quot;114&quot; data-origin-width=&quot;477&quot; data-origin-height=&quot;114&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;제안 X&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;804&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rvaGP/btsAhewUw7z/Wn00b3WNPFYNPLssqLyWP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rvaGP/btsAhewUw7z/Wn00b3WNPFYNPLssqLyWP0/img.png&quot; data-alt=&quot;주석 지침 제시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rvaGP/btsAhewUw7z/Wn00b3WNPFYNPLssqLyWP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrvaGP%2FbtsAhewUw7z%2FWn00b3WNPFYNPLssqLyWP0%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;655&quot; height=&quot;370&quot; data-origin-width=&quot;804&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;주석 지침 제시&lt;/figcaption&gt;
&lt;/figure&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;&lt;b&gt;이 밖에도, 해당 위젯에 없는 프로퍼티를 생뚱맞게 제안해주거나, 제안된대로 작성하면 컴파일 에러가 발생하는 경우가 빈번했습니다. 따라서 코드 제안 성능은 아직 아쉽다고 할 수 있겠습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;뛰어난 점 : 주석&amp;amp;문서 제안&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;작성한 코드에 대한 주석 제안&lt;/span&gt; 능력은 아주 뛰어났습니다. 코드 유지 보수 측면에서, 나의, 내 팀의 코드를 분석해서 그 기능을 line by line으로 작성해주는건 아주 유용하게 활용할 수 있겠습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;104&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcRrXk/btsAmFGL0QC/oGO1ZGow0e97WO0x8yzOo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcRrXk/btsAmFGL0QC/oGO1ZGow0e97WO0x8yzOo0/img.png&quot; data-alt=&quot;주석 제안&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcRrXk/btsAmFGL0QC/oGO1ZGow0e97WO0x8yzOo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcRrXk%2FbtsAmFGL0QC%2FoGO1ZGow0e97WO0x8yzOo0%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;687&quot; height=&quot;104&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;104&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;주석 제안&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/duv9gP/btsAheRd80o/nK9vCNM9RZrqDkkob48i11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/duv9gP/btsAheRd80o/nK9vCNM9RZrqDkkob48i11/img.png&quot; data-alt=&quot;line by line 주석&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/duv9gP/btsAheRd80o/nK9vCNM9RZrqDkkob48i11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fduv9gP%2FbtsAheRd80o%2FnK9vCNM9RZrqDkkob48i11%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;868&quot; height=&quot;392&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;392&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;line by line 주석&lt;/figcaption&gt;
&lt;/figure&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;&lt;b&gt;회사에서 제가 관리하는 코드가 1만 줄이 넘어가는데, 제가 작성한 코드가 아니라서 분석이 어려운 경우도 있고, 제가 작성했더라도 시간이 꽤 지나서 이게 무슨 코드인가... 싶은 경우가 적잖이 있습니다.&lt;/b&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;&lt;b&gt;copilot으로 회사 코드에 line by line 주석을 순식간에 작성하면, 유지보수성이 굉장히 향상될 것입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;회사 보안망때문에 copliot을 못쓰는게 너무 아쉽네요....&lt;/b&gt;&lt;/p&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-origin-width=&quot;1007&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2Ceqn/btsAjVpOv6x/yA29YeulGX7HnATANs4Yg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2Ceqn/btsAjVpOv6x/yA29YeulGX7HnATANs4Yg1/img.png&quot; data-alt=&quot;문서 작성 제안&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2Ceqn/btsAjVpOv6x/yA29YeulGX7HnATANs4Yg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2Ceqn%2FbtsAjVpOv6x%2FyA29YeulGX7HnATANs4Yg1%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;1007&quot; height=&quot;208&quot; data-origin-width=&quot;1007&quot; data-origin-height=&quot;208&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;문서 작성 제안&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;README의 문서 작성 능력&lt;/span&gt;도 엄청납니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;위의 [STOP DEVELOPING] 문단은 copilot이 제안해준대로 작성됐습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;저는 [STOP 까지만 적었고, 뒤에는 탭이랑 엔터만 눌렀죠.&lt;/b&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;&lt;b&gt;제 프로젝트 코드들을 분석해서, 제가 왜 프로젝트 개발을 중단하는지 파악해서 자동으로 문서를 작성해줬습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;정리&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;다른 언어나 프레임워크에서는 어떨지 모르겠지만, &lt;span style=&quot;color: #ee2323;&quot;&gt;Flutter와는 fit이 그렇게 잘 맞는다고 느껴지지는 않았습니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;차라리 chatgpt3.5(무료버전)으로 코드 스니펫을 획득해서 가공해서 쓰는게 더 유용했습니다.&lt;/b&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;&lt;b&gt;각자의 용도에 맞게 활용하시면 될 것 같습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;저로서는 대안책인 chatgpt가 더 사용성이 나았고, 월 10달러라는 가격이 싼 것도 아니라서 구독을 취소했습니다.&lt;/b&gt;&lt;/p&gt;</description>
      <category>|  이모저모</category>
      <category>Ai</category>
      <category>Android Studio</category>
      <category>DART</category>
      <category>Flutter</category>
      <category>Github copilot</category>
      <author>Meoru_</author>
      <guid isPermaLink="true">https://meoru-tech.tistory.com/92</guid>
      <comments>https://meoru-tech.tistory.com/92#entry92comment</comments>
      <pubDate>Wed, 15 Nov 2023 02:24:15 +0900</pubDate>
    </item>
    <item>
      <title> 파이썬 큐(Queue) 이론 및 예제</title>
      <link>https://meoru-tech.tistory.com/91</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;알고리즘 코딩 테스트를 준비하다 보면 다양한 자료구조를 만나게 됩니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;그 중에서도 &lt;span style=&quot;color: #ee2323;&quot;&gt;큐(Queue)는 스택과 함께 가장 기본적인 자료구조&lt;/span&gt; 중 하나입니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;이번 글에서는 큐의 개념과 파이썬으로 구현하는 방법에 대해 알아보겠습니다.&lt;/span&gt; &lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;큐(Queue)란?&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;526&quot; data-origin-height=&quot;109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YVmPA/btsz5n1F8H6/jSnXCg9bEuWW8BMwDwlkAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YVmPA/btsz5n1F8H6/jSnXCg9bEuWW8BMwDwlkAK/img.png&quot; data-alt=&quot;Queue 단어 뜻&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YVmPA/btsz5n1F8H6/jSnXCg9bEuWW8BMwDwlkAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYVmPA%2Fbtsz5n1F8H6%2FjSnXCg9bEuWW8BMwDwlkAK%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;420&quot; height=&quot;87&quot; data-origin-width=&quot;526&quot; data-origin-height=&quot;109&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Queue 단어 뜻&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;queue.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Hy1ZS/btsz6d48CdO/LzV3Sm9ParbLWv3YZX0cx0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Hy1ZS/btsz6d48CdO/LzV3Sm9ParbLWv3YZX0cx0/img.jpg&quot; data-alt=&quot;줄서기 Queue&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Hy1ZS/btsz6d48CdO/LzV3Sm9ParbLWv3YZX0cx0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHy1ZS%2Fbtsz6d48CdO%2FLzV3Sm9ParbLWv3YZX0cx0%2Fimg.jpg&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;536&quot; height=&quot;402&quot; data-filename=&quot;queue.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;줄서기 Queue&lt;/figcaption&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;b&gt;알고리즘 코딩테스트에서 &lt;span style=&quot;color: #ee2323;&quot;&gt;가장 자주 활용되는, 데이터를 저장하는 자료구조&lt;/span&gt; 중 하나 &lt;u&gt;(BFS문제에서 자주 활용)&lt;/u&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;먼저 들어온 데이터가 먼저 나가는 &lt;span style=&quot;color: #ee2323;&quot;&gt;선입선출(FIFO, First In First Out) 방식&lt;/span&gt;&lt;/b&gt;&lt;/li&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;&lt;b&gt;큐의 크기가 제한되어 있음 - 데이터의 크기만큼 크기가 결정됨. &lt;/b&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;따라서 C에서는 enQueue, deQueue 할때마다 메모리 재할당(realloc)이 필요하지만 파이썬에서는 신경 안써도 됩니다. 파이썬 메모리 관리자가 알아서 해줍니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;복잡하면 위 이미지처럼, 먼저 들어온 차가 먼저 나가는 1차선 도로를 연상하면 됩니다. (줄서기)&lt;/b&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;&lt;b&gt;중간의 차를 빼오기 위해서는, 가장 앞의 차부터 순서대로 나가야 합니다. &lt;/b&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;s&gt;역주행하는거 아니면...&lt;/s&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;사용자는 가장 앞의 데이터(차량)만 볼 수 있고, 새로운 데이터는 가장 뒤에만 들어갈 수 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;b&gt;FIFO LILO&lt;/b&gt; 방식의 데이터 타입으로, 프로세스 메모리 구조의 &lt;b&gt;힙(heap) 메모리&lt;/b&gt;와 같은 방식입니다. 이에 대해 궁금하시다면 &lt;a title=&quot;[자료구조] 메모리 구조와 동적 할당 - 프로그래밍 언어별로 어떻게 다를까? - C/C++/Java/Python&quot; href=&quot;https://meoru-tech.tistory.com/25&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;저의 이전 포스팅&lt;/b&gt;&lt;/a&gt;을 참고해주세요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;파이썬으로 큐 구현하기&lt;/b&gt;&lt;/h2&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;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;덱(deque) import해서 사용(강추★)&lt;/span&gt; : 양방향 push, pop이 가능한 자료구조입니다. 이미 잘 구현되어 있으므로 잘 활용하시면 됩니다. O(1)으로 성능이 좋습니다. &lt;span style=&quot;color: #9d9d9d;&quot;&gt;list처럼 중간값을 빼올 수도 있긴 한데, 그 경우 list보다 성능이 떨어지므로 지양하셔야 합니다. (list처럼 index로 조회 가능. q[1], q[2], ...)&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;list 활용 : &lt;a title=&quot; 파이썬 스택(Stack) 이론 및 예제&quot; href=&quot;https://meoru-tech.tistory.com/90&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;이전에 포스팅한 Stack(스택)&lt;/a&gt;으로 많이 활용되나, append(x) - pop(0) or insert(0, x) - pop() 조합으로 양방향 처리를 구현할 수 있&lt;span style=&quot;color: #ee2323;&quot;&gt;기는 합니다. 다만 강력히 비추천하는 방법입니다.&lt;/span&gt; pop(0) 또는 insert(0, x)는 리스트의 왼쪽만 처리하므로 O(1)의 간단한 연산처럼 보일 수 있으나, 실제로는 우측의 모든 데이터를 당기고, 미는 O(n)의 연산이 필요하기 때문입니다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1699597036007&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

# deque 생성
q = deque()

# 방법 1
q.append('a')		# enQueue
q.popleft()			# deQueue

# 방법 2
q.appendleft('a')	# enQueue
q.pop()				# deQueue

q.empty()			# True&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;예제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a title=&quot;뱀&quot; href=&quot;https://www.acmicpc.net/problem/3190&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;boj의 뱀 문제&lt;/a&gt;가 큐를 활용한 유명한 문제 중 하나입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;풀이 방법은 다양하겠지만, 큐 활용을 잘 생각해보면 간단히 풀 수 있는(30줄 이내) 문제이니 풀어보시고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;u&gt;다른 사람들의 풀이도 꼭 참고해보시길 바랍니다.&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>|  자료구조 &amp;amp; 알고리즘/자료구조</category>
      <category>FIFO</category>
      <category>Lilo</category>
      <category>Python</category>
      <category>Queue</category>
      <category>자료구조</category>
      <category>큐</category>
      <category>큐 문제</category>
      <category>파이썬</category>
      <author>Meoru_</author>
      <guid isPermaLink="true">https://meoru-tech.tistory.com/91</guid>
      <comments>https://meoru-tech.tistory.com/91#entry91comment</comments>
      <pubDate>Fri, 10 Nov 2023 15:32:40 +0900</pubDate>
    </item>
    <item>
      <title> 파이썬 스택(Stack)  이론 및 예제</title>
      <link>https://meoru-tech.tistory.com/90</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;스택(Stack)이란?&lt;/b&gt;&lt;/h2&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;본 포스트에서는 &lt;span style=&quot;color: #1b711d;&quot;&gt;자료구조로써의 스택&lt;/span&gt;에 대한 내용을 다루고 있으니, 스택 메모리에 대해 궁금하신 분은 &lt;a title=&quot;[자료구조] 메모리 구조와 동적 할당 - 프로그래밍 언어별로 어떻게 다를까? - C/C++/Java/Python&quot; href=&quot;https://meoru-tech.tistory.com/25&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;저의 이전 포스팅&lt;/a&gt;을 참고해주세요. (무려 2년 3개월 전 포스팅... 시간 참 빨라요)&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;edited_stack.jpg&quot; data-origin-width=&quot;823&quot; data-origin-height=&quot;579&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dGSLMo/btsz11QzF9W/itZk4YTIPHgc769eeFWFHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dGSLMo/btsz11QzF9W/itZk4YTIPHgc769eeFWFHK/img.png&quot; data-alt=&quot;돌맹이 Stack&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dGSLMo/btsz11QzF9W/itZk4YTIPHgc769eeFWFHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdGSLMo%2Fbtsz11QzF9W%2FitZk4YTIPHgc769eeFWFHK%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;562&quot; height=&quot;254&quot; data-filename=&quot;edited_stack.jpg&quot; data-origin-width=&quot;823&quot; data-origin-height=&quot;579&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;돌맹이 Stack&lt;/figcaption&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;b&gt;알고리즘 코딩테스트에서 &lt;span style=&quot;color: #ee2323;&quot;&gt;가장 자주 활용되는 자료구조&lt;/span&gt; 중 하나 &lt;u&gt;(DFS문제에서 자주 활용)&lt;/u&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;가장 나중에 들어온 데이터를 가장 먼저 처리하는&lt;span style=&quot;color: #ee2323;&quot;&gt; 후입선출(LIFO, Last In First Out) 방식&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;입출력이 한쪽에서만 일어남&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;스택의 크기가 제한되어 있음 - 데이터의 크기만큼 크기가 결정됨.&amp;nbsp;&lt;/b&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;따라서 C에서는 push, pop 할때마다 메모리 재할당(realloc)이 필요하지만 파이썬에서는 신경 안써도 됩니다. 파이썬 메모리 관리자가 알아서 해줍니다.&lt;/span&gt;&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;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;중간의 돌맹이를 빼오기 위해서는, 가장 위의 돌부터 하나씩 빼야 합니다.&lt;/b&gt; &lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;s&gt;한꺼번에 집어서 다 빼도 되긴 하죠&lt;/s&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용자는 가장 위의 데이터(돌맹이)만 집을 수 있고, 새로운 데이터 또한 가장 위에만 쌓을 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;사실 이는 잘못된 비유입니다. 엄밀히 말하면 스택은 위에서 아래로 쌓는 것....(이또한 위의 스택 메모리 포스팅 참조)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;파이썬으로 스택 구현하기&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; 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;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;list 활용(강추★)&lt;/span&gt; : 별도의 import가 필요 없고, 가장 간단하고, &lt;u&gt;스택답게 잘 활용하면&lt;/u&gt; 아래 자료형과 성능 차이도 거의 없습니다. &lt;/b&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;그리고 가끔 야매로 중간값 활용할 수 있습니다.&lt;/span&gt;&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;deque 활용 : &lt;a title=&quot; 파이썬 큐(Queue) 이론 및 예제&quot; href=&quot;https://meoru-tech.tistory.com/91&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;다음에 포스팅할 Queue(큐)&lt;/a&gt;로 많이 활용되나, 양방향 처리를 지원하므로 Stack으로도 활용 가능&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;list로 스택을 구현하는 방법도 두 가지가 있습니다.&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;class로 구현해서 사용&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1699456915843&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Stack:
    def __init__(self):
        self.stack = []

    def push(self, data):
        self.stack.append(data)

    def pop(self):
        if len(self.stack) == 0:
            return None
        return self.stack.pop()

    def peek(self):
        if len(self.stack) == 0:
            return None
        return self.stack[-1]

    def is_empty(self):
        return len(self.stack) == 0&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;b&gt;그냥 사용&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1699457056660&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a = []			# a = Stack()
a.append('a')	# a.push('a')
a.pop()			# a.pop()
a[-1]			# a.peek()
len(a) == 0		# a.is_empty()&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;그냥 사용시, &lt;span style=&quot;color: #ee2323;&quot;&gt;빈 list를 pop하면 에러가 발생&lt;/span&gt;하기 때문에 pop할때마다 len(a) != 0 확인을 해주어야 합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIyaZK/btsz3Kt2smE/kkVMI0kLCOkVbzqhdLXHG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIyaZK/btsz3Kt2smE/kkVMI0kLCOkVbzqhdLXHG1/img.png&quot; data-alt=&quot;IndexError&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIyaZK/btsz3Kt2smE/kkVMI0kLCOkVbzqhdLXHG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIyaZK%2Fbtsz3Kt2smE%2FkkVMI0kLCOkVbzqhdLXHG1%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;712&quot; height=&quot;177&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;177&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;IndexError&lt;/figcaption&gt;
&lt;/figure&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a title=&quot;오큰수&quot; href=&quot;https://www.acmicpc.net/problem/17298&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;boj의 오큰수 문제&lt;/a&gt;가 스택을 활용한 유명한 문제 중 하나입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;풀이 방법은 다양하겠지만, 스택 활용을 잘 생각해보면 아주 간단히 풀 수 있는(15줄 이내) 문제이니 풀어보시고 &lt;u&gt;다른 사람들의 풀이도 꼭 참고해보시길 바랍니다.&lt;/u&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>|  자료구조 &amp;amp; 알고리즘/자료구조</category>
      <category>filo</category>
      <category>LIFO</category>
      <category>Python</category>
      <category>Stack</category>
      <category>스택</category>
      <category>스택 문제</category>
      <category>자료구조</category>
      <category>파이썬</category>
      <author>Meoru_</author>
      <guid isPermaLink="true">https://meoru-tech.tistory.com/90</guid>
      <comments>https://meoru-tech.tistory.com/90#entry90comment</comments>
      <pubDate>Thu, 9 Nov 2023 00:36:54 +0900</pubDate>
    </item>
    <item>
      <title> 파이썬 기본 입/출력</title>
      <link>https://meoru-tech.tistory.com/89</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;pre id=&quot;code_1697857873937&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 방법1
import sys
a = int(sys.stdin.readline()) # 한 개의 정수를 입력받을 때. 개행 같이 입력되나 int 형변환 시 처리되어 사라짐
a, b, c = map(int, sys.stdin.readline().split()) # 여러 개의 정수를 입력받을 때

# 방법2
a = int(input()) # 한 개의 정수를 입력받을 때 =&amp;gt; 느리므로 지양할 것. 마지막 개행은 안 받아짐.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;pre id=&quot;code_1697857907144&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 방법1
import sys
sys.stdout.write(&quot;asd\n&quot;) # 개행 직접 처리해주어야 함

# 방법2
print(&quot;asd&quot;) # 느려서 지양, 자동개행. 마지막 개행 안하려면 print(&quot;asd&quot;, end='')&lt;/code&gt;&lt;/pre&gt;</description>
      <category>|  자료구조 &amp;amp; 알고리즘/알고리즘</category>
      <category>input</category>
      <category>print</category>
      <category>Python</category>
      <category>stdin</category>
      <category>stdout</category>
      <category>기본 입출력</category>
      <category>파이썬</category>
      <author>Meoru_</author>
      <guid isPermaLink="true">https://meoru-tech.tistory.com/89</guid>
      <comments>https://meoru-tech.tistory.com/89#entry89comment</comments>
      <pubDate>Sat, 21 Oct 2023 12:16:26 +0900</pubDate>
    </item>
    <item>
      <title> 코딩테스트 준비를 위한 효과적인 알고리즘 공부 방법</title>
      <link>https://meoru-tech.tistory.com/88</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;704&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biDITa/btsyTFPfDhq/Xn9X4mJWWKb06Kk5t8t9U0/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biDITa/btsyTFPfDhq/Xn9X4mJWWKb06Kk5t8t9U0/img.webp&quot; data-alt=&quot;알고리즘 프로그래밍&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biDITa/btsyTFPfDhq/Xn9X4mJWWKb06Kk5t8t9U0/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiDITa%2FbtsyTFPfDhq%2FXn9X4mJWWKb06Kk5t8t9U0%2Fimg.webp&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;1280&quot; height=&quot;704&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;704&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;알고리즘 프로그래밍&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;코딩 테스트는 개발자 진로를 희망하는 학생, 취준생, 직장인들이 부딪히는 난관입니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;저 또한 비전공자로 취준을 시작해서, 수많은 코딩테스트를 치러 왔고, 마침내 최종합격하여 개발자로서 일하고 있습니다. 제 경험을 바탕으로 &quot;코딩테스트 준비를 위한 효과적인 알고리즘 공부 방법&quot;을 정리해볼까 합니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;언어 선택&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;프로그래밍 언어는 아주 다양합니다. &lt;span style=&quot;color: #ee2323;&quot;&gt;C, C++, Java, Python, JavaScript, Kotlin, Go, C#, Rust, Dart, Swift, Objective-C, 엄랭&lt;/span&gt;(ㅋㅋ), 등등...&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;코딩테스트를 학습하려면 먼저 어떤 언어로 코딩할건지 정해야겠죠.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; 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;span style=&quot;color: #000000;&quot;&gt;저는 취준할 때 조금 미련하게 했습니다. C, Python, Kotlin, Go, Java 다섯 가지 언어로 코딩테스트를 대비했습니다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그냥 빨리 푸는게 목적이면 Python, Runtime 제약이 중요할 것 같으면 C, 각 직무별로 내 노력을 보여주려면 그때그때 Kotlin, Go, Java를 맞춰서 써야지~ 하는 생각으로요.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;결론부터 말씀드리면 코딩테스트 언어는 하나, 정말 많아야 둘 정도로 대비하시면 충분합니다.&lt;/b&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;엄랭 이런건 안되고...&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;추천 1순위는 C++, Python&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;추천 2순위는 C, Java&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;나머지는 3순위입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt; C, C++, Java, Python은 코딩테스트 언어로서 범용성이 강하므로 추천드립니다.&lt;/b&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;요즘 대부분의 기업은 엄랭을 제외하고 상기한 모든 언어로 코딩테스트를 지원합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;대부분&quot;이라는 말인즉슨 지원하지 않는 기업도 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;대표적으로 삼성이 있죠.. 삼성은 C, C++, Java, Python으로만 코딩테스트 응시가 가능합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;코딩테스트 C++, Python을 지원하지 않는 개발회사는 본 적이 없습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실제로 C++, Python이 코딩테스트 응시자 수 1, 2위를 다투며, 그만큼 레퍼런스 코드도 많으니 참고하여 학습하시기 용이하다는 장점이 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt; 본인이 희망하는 직무가 C나 Java를 사용하고, C++이나 Python을 따로 학습할 여유가 없으시면 C나 Java로도 충분합니다. &lt;/b&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;다만, C는 위의 두 언어에 비해 기본 지원되는 라이브러리도 적고, 아무리 숙련되어도 요상한 컴파일 에러에 자주 부딪히게 됩니다. 코드 길이도 길어지게 됩니다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Java는 코드 길이가 너무 길어집니다. public static void main(string args[])............으음&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;else&lt;/b&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;만약 C, C++, Java, Python이 다 맘에 안들고, 나만의 독특한 면모를 보여주고 싶다. 꼭 가고싶은 기업과 특정 직무가 정해져 있고 그 직무에서는 이 언어를 쓰더라 하시면 그 언어로 하셔도 말리진 않겠습니다.. ㅎㅎ&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;아, &lt;span style=&quot;color: #ee2323;&quot;&gt;참고로 언어별로 기준 runtime이 달라서, 저처럼 런타임때문에 C, Python을 동시에 공부하는건 바보입니다.&lt;/span&gt; 다만 컴퓨터 구동원리에 대해 Deep Dive할 목적으로 C를 공부하시는건 추천합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;코딩테스트는 문제 해결력을 보기 위한 시험으로, 문제를 푸는게 1순위입니다.&lt;/b&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;&lt;b&gt;문제를 잘 풀기 위한 프로그래밍 언어로는 C++, Python을 추천드립니다. 개인적으로는 Python을 추천합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;C++은 &quot;왜 안 돼?&quot;가 많은 반면, Python은 &quot;왜 돼?&quot;가 많기 때문입니다.&lt;/b&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;&lt;b&gt;Learning Curve도 파이썬이 훨씬 학습이 용이하구요.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;알고리즘 학습&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;알고리즘을 공부하는 방법은 다양하며, 효과적인 학습을 위해 알고리즘 개념을 이해하고 예제를 풀어보는 것이 중요합니다. 이를 통해 실제 문제 해결 능력을 키우며, 문제 해결 과정에서 발생할 수 있는 오류와 어려움을 극복하는 방법을 배울 수 있습니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;알고리즘 도서&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;각자의 수준에 맞게 도서를 활용해 알고리즘 유형을 먼저 익히는 방법이 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;(추천 도서) Do it! 자료구조와 함께 배우는 알고리즘 입문&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;iframe src=&quot;https://coupa.ng/cenFC0&quot; width=&quot;120&quot; height=&quot;240&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot;&gt;&lt;/iframe&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;초보자용 입문서로 추천합니다. 이외에도 Doit! 시리즈는 정말 다양한 개발 분야에 대해 다루고 있는데요. 어떤 개발 분야든 Doit! 시리즈는 입문서로 추천드릴만 하다고 생각합니다.&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;(추천도서) 알고리즘 문제해결전략&lt;br /&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;iframe src=&quot;https://coupa.ng/cenGq0&quot; width=&quot;120&quot; height=&quot;240&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot;&gt;&lt;/iframe&gt;&lt;/b&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;&lt;b&gt;읽어봤는데 정말 좋은 책입니다. 수능 공부할때, 수학 문제 풀 때 보면 나는 공식대로 풀어서 한참 걸렸는데, 특이한 방식으로(본질에 접근해서) 암산으로 몇 초만에 문제 푸는 애들 있죠?&lt;/b&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;&lt;b&gt;다만 BFS, DFS, DP, 그래프 등 기본 개념은 다 안다는 전제 하에 설명하는 느낌입니다. 기본 개념에 대한 설명이 불친절해서, 초보자용으로는 비추천합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;온라인 강의&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;온라인 강의를 활용하여 학습할 수도 있습니다. 도서를 통해 구체적인 알고리즘 개념을 체계적으로 습득하고, 강의를 통해 전문가의 지도를 받아 실습 과정에서 생기는 질문과 의문을 해결할 수 있습니다. 요즘에는 다양한 온라인 학습 자료가 많이 제공되고 있으므로, 관심 있는 주제에 대해 검색해보세요. &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;실제로 풀어보기&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;실제 문제를 해결해보는 게 가장 중요합니다. 알고리즘 문제 풀이 사이트나 대회에 참여하여 다양한 문제를 풀면 실력을 향상시킬 수 있습니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;문제 풀이 사이트&lt;/b&gt;&lt;/blockquote&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;a href=&quot;https://www.acmicpc.net/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/&lt;/a&gt;) : 문제 수가 아주 많고, 국내에서 가장 유명한 알고리즘 문제 사이트입니다. solved.ac 연동을 통해 각 문제의 난이도 티어, 내 티어를 높여가는 재미가 있습니다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프로그래머스 (&lt;a href=&quot;https://programmers.co.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://programmers.co.kr/&lt;/a&gt;) : 실제 코딩테스트 환경을 경험해보기 좋습니다. 1년에 네댓번정도 취업연계 코딩테스트도 자체적으로 열리니, 프로그래머스에서 문제를 꾸준히 푼다면 그런 취업연계에서 포트폴리오로써 활용도 가능합니다. SQL 문제들도 있어서 은행권 대비하시는 분들의 북마크에는 필수로 들어가는 사이트입니다. 문제 수가 많지는 않고, 테스트 케이스가 엉망인 경우가 가끔 있다는 게 단점입니다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;알고스팟 (&lt;a href=&quot;https://algospot.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://algospot.com/&lt;/a&gt;) : 위에서 추천한 중급자용 도서인 알고리즘 문해전의 저자가 운영하는 알고리즘 문제 사이트입니다. 책처럼 문제들도 난이도가 꽤 있는 편입니다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이 밖에도 많은데, 개인적으로 백준 + 프로그래머스로 충분하다고 생각합니다. 코테가 쉬운 회사는 백준 실버 3~4 정도 레벨로, 코테가 어려운 회사는 백준 플레 4 ~ 실버 1 정도 레벨로 출제됩니다. 프로그래머스는 같은 티어 대비 백준보다 문제가 어려운 편입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;커뮤니티&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;어려운 부분이나 잘못된 접근 방식에 대해 다른 사람들과 토론하고 의견을 교환하는 것도 도움이 될 수 있습니다. OKKY 등의 온라인 커뮤니티나 스터디 그룹에 참여하여 다른 사람들과 함께 문제를 푸는 것도 좋은 방법입니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;알고리즘 유형&lt;/b&gt;&lt;/h3&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;b&gt;기본 입/출력&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;자료구조 (스택, 큐, 그래프, 트리 등)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DFS, BFS&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;다이나믹 프로그래밍&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;수학&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;정렬&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;탐색 (이진 탐색, 완전 탐색 등)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;그리디 알고리즘&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;분할 정복&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;구간합&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;최소 비용&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;문자열 처리&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비트마스킹&lt;/b&gt;&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;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;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;목표 설정&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; 알고리즘을 공부할 때 단기적인 목표와 장기적인 목표를 설정하는 것도 중요합니다. 단기적인 목표는 특정 알고리즘을 학습하고 예제를 풀어보는 것일 수 있으며, 장기적인 목표는 다양한 알고리즘을 종합적으로 이해하고 다양한 문제에 적용할 수 있는 능력을 키우는 것일 수 있습니다. 목표를 설정하고 학습 계획을 세우는 것은 학습 동기를 유지하고 체계적인 학습을 할 수 있도록 도와줍니다. &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; 마지막으로, 알고리즘을 공부하는 것은 단순히 단기적인 목표를 달성하는 것뿐만이 아닙니다. 알고리즘은 계속해서 발전하고 새로운 기법이 나오기 때문에, 최신 트렌드를 따라가고 새로운 알고리즘을 학습하는 것도 중요합니다. 지속적인 학습과 개발을 통해 알고리즘에 대한 이해와 실력을 향상시킬 수 있습니다. &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; 알고리즘을 공부하는 방법은 다양하며, 어떤 방법이 가장 효과적인지는 개인에 따라 다를 수 있습니다. 따라서 여러 가지 방법을 시도해보고 자신에게 가장 적합한 방법을 찾아서 공부해보세요. 학습에 있어 중요한 것은 꾸준한 노력과 열정입니다. 어려움을 겪더라도 포기하지 말고 계속 도전하는 마인드를 갖고 화이팅하세요!&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #e56a2c; text-align: left;&quot;&gt;상기 추천 도서 링크는 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #e56a2c;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;링크를 타고 들어가셔도 도서 가격은 동일하며, 정말 좋은 도서로만 추천하였습니다.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>|  자료구조 &amp;amp; 알고리즘/알고리즘</category>
      <category>개발자</category>
      <category>공부</category>
      <category>백준</category>
      <category>알고리즘</category>
      <category>이직</category>
      <category>취준</category>
      <category>코딩</category>
      <category>코딩테스트</category>
      <category>프로그래머스</category>
      <category>프로그래밍</category>
      <author>Meoru_</author>
      <guid isPermaLink="true">https://meoru-tech.tistory.com/88</guid>
      <comments>https://meoru-tech.tistory.com/88#entry88comment</comments>
      <pubDate>Sat, 21 Oct 2023 10:44:57 +0900</pubDate>
    </item>
    <item>
      <title>[ 문제 해결 방법] The CPU has been disabled by the guest operating system. Power off or reset the virtual machine.</title>
      <link>https://meoru-tech.tistory.com/87</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 상황&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VMware로 macOS13을 install하던 중 발생한 에러이다.&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;711&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bi7G4Z/btsxvFPxivL/vbtqsepVl73zfBM0cSoDu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bi7G4Z/btsxvFPxivL/vbtqsepVl73zfBM0cSoDu1/img.png&quot; data-alt=&quot;VMware 시작 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bi7G4Z/btsxvFPxivL/vbtqsepVl73zfBM0cSoDu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbi7G4Z%2FbtsxvFPxivL%2FvbtqsepVl73zfBM0cSoDu1%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;711&quot; height=&quot;488&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;488&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;VMware 시작 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;apple 로고가 잠시 나타나더니 다음 메세지가 출력되면서 더 이상 진행이 되지 않는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGL7Ye/btsxidHm5nD/ehhXOX04LloJsJIPoFrsZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGL7Ye/btsxidHm5nD/ehhXOX04LloJsJIPoFrsZK/img.png&quot; data-alt=&quot;에러메세지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGL7Ye/btsxidHm5nD/ehhXOX04LloJsJIPoFrsZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGL7Ye%2FbtsxidHm5nD%2FehhXOX04LloJsJIPoFrsZK%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;250&quot; height=&quot;130&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;130&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;에러메세지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;background-color: #000000; border: #000000 1px solid; padding: 10px;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; The&amp;nbsp;CPU&amp;nbsp;has&amp;nbsp;been&amp;nbsp;disabled&amp;nbsp;by&amp;nbsp;the&amp;nbsp;guest&amp;nbsp;operating&amp;nbsp;system.&amp;nbsp;Power&amp;nbsp;off&amp;nbsp;or&amp;nbsp;reset&amp;nbsp;the&amp;nbsp;virtual&amp;nbsp;machine. &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) VMware macOS를 setup한 폴더에 들어간다. default 값은 Documents - Virtual Machines - macOS 13&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;467&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PZtIB/btsxgVtyv2P/cfKEXSnldsJPOWEuYvOkX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PZtIB/btsxgVtyv2P/cfKEXSnldsJPOWEuYvOkX1/img.png&quot; data-alt=&quot;VMware setup 경로&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PZtIB/btsxgVtyv2P/cfKEXSnldsJPOWEuYvOkX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPZtIB%2FbtsxgVtyv2P%2FcfKEXSnldsJPOWEuYvOkX1%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;688&quot; height=&quot;467&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;467&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;VMware setup 경로&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 위 사진에서 보이는 아이콘의 파일을 메모장으로 연다. VMware 구버전의 경우 .vmx 확장자로 되어 있을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 마지막줄에 다음 텍스트를 추가한다.&lt;/p&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;background-color: #eeeeee; border: #c1c1c1 1px dashed; padding: 10px;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;smc.version&amp;nbsp;=&amp;nbsp;&quot;0&quot; &lt;br /&gt;cpuid.0.eax&amp;nbsp;=&amp;nbsp;&quot;0000:0000:0000:0000:0000:0000:0000:1011&quot; &lt;br /&gt;cpuid.0.ebx&amp;nbsp;=&amp;nbsp;&quot;0111:0101:0110:1110:0110:0101:0100:0111&quot; &lt;br /&gt;cpuid.0.ecx&amp;nbsp;=&amp;nbsp;&quot;0110:1100:0110:0101:0111:0100:0110:1110&quot; &lt;br /&gt;cpuid.0.edx&amp;nbsp;=&amp;nbsp;&quot;0100:1001:0110:0101:0110:1110:0110:1001&quot; &lt;br /&gt;cpuid.1.eax&amp;nbsp;=&amp;nbsp;&quot;0000:0000:0000:0001:0000:0110:0111:0001&quot; &lt;br /&gt;cpuid.1.ebx&amp;nbsp;=&amp;nbsp;&quot;0000:0010:0000:0001:0000:1000:0000:0000&quot; &lt;br /&gt;cpuid.1.ecx&amp;nbsp;=&amp;nbsp;&quot;1000:0010:1001:1000:0010:0010:0000:0011&quot; &lt;br /&gt;cpuid.1.edx&amp;nbsp;=&amp;nbsp;&quot;0000:0111:1000:1011:1111:1011:1111:1111&quot; &lt;br /&gt;smbios.reflectHost&amp;nbsp;=&amp;nbsp;&quot;TRUE&quot; &lt;br /&gt;hw.model&amp;nbsp;=&amp;nbsp;&quot;MacBookPro14,3&quot; &lt;br /&gt;board-id = &quot;Mac-551B86E5744E2388&quot;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;547&quot; data-origin-height=&quot;425&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmiBVg/btsxgXdHoIE/q1woevk1BDoZNoV2bxB7Xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmiBVg/btsxgXdHoIE/q1woevk1BDoZNoV2bxB7Xk/img.png&quot; data-alt=&quot;.vmx file&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmiBVg/btsxgXdHoIE/q1woevk1BDoZNoV2bxB7Xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmiBVg%2FbtsxgXdHoIE%2Fq1woevk1BDoZNoV2bxB7Xk%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;547&quot; height=&quot;425&quot; data-origin-width=&quot;547&quot; data-origin-height=&quot;425&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;.vmx file&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;block된 구간 이외의 부분은 개인마다 다를 수 있으니 무시하고, 파일 최하단에 붙여넣으면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장하고 종료 후 VMware를 재실행해보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;516&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boRPJT/btsxrYIZWfF/HLVmZGKAPMhSkTl6yJsDak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boRPJT/btsxrYIZWfF/HLVmZGKAPMhSkTl6yJsDak/img.png&quot; data-alt=&quot;해결&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boRPJT/btsxrYIZWfF/HLVmZGKAPMhSkTl6yJsDak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboRPJT%2FbtsxrYIZWfF%2FHLVmZGKAPMhSkTl6yJsDak%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;704&quot; height=&quot;516&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;516&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;해결&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;짠. 에러 메세지가 출력되지 않고, 정상적으로 Install되는 모습이다.&lt;/p&gt;</description>
      <category>|  프로그래밍 분야/기타</category>
      <category>disabled</category>
      <category>error</category>
      <category>MacOS</category>
      <category>vmware</category>
      <category>VMX</category>
      <author>Meoru_</author>
      <guid isPermaLink="true">https://meoru-tech.tistory.com/87</guid>
      <comments>https://meoru-tech.tistory.com/87#entry87comment</comments>
      <pubDate>Sat, 7 Oct 2023 02:24:14 +0900</pubDate>
    </item>
  </channel>
</rss>