<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>은공지능 공작소</title>
    <link>https://chan-lab.tistory.com/</link>
    <description>딥러닝에 관련된 시행착오, 사소하지만 중요한 것들, 가능한 모든 여정을 담았습니다.</description>
    <language>ko</language>
    <pubDate>Wed, 12 Aug 2026 14:57:21 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>pychan</managingEditor>
    <image>
      <title>은공지능 공작소</title>
      <url>https://tistory1.daumcdn.net/tistory/3107296/attach/a3e2ed14fb094a4b8fddc69110dfa11c</url>
      <link>https://chan-lab.tistory.com</link>
    </image>
    <item>
      <title>개인정보처리방침</title>
      <link>https://chan-lab.tistory.com/40</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; 찬랩 &amp;gt;('&lt;a href=&quot;https://chan-lab.tistory.com/'이하&quot;&gt;https://chan-lab.tistory.com/'이하&lt;/a&gt; 'Chan lab')은(는) 「개인정보 보호법」 제30조에 따라 정보주체의 개인정보를 보호하고 이와 관련한 고충을 신속하고 원활하게 처리할 수 있도록 하기 위하여 다음과 같이 개인정보 처리방침을 수립&amp;middot;공개합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;○ 이 개인정보처리방침은&lt;span&gt;&amp;nbsp;&lt;/span&gt;2023년&lt;span&gt;&amp;nbsp;&lt;/span&gt;2월&lt;span&gt;&amp;nbsp;&lt;/span&gt;22부터 적용됩니다.&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;제1조(개인정보의 처리 목적)&lt;br /&gt;&lt;br /&gt;&amp;lt; 찬랩 &amp;gt;('&lt;a href=&quot;https://chan-lab.tistory.com/'이하&quot;&gt;https://chan-lab.tistory.com/'이하&lt;/a&gt; 'Chan lab')은(는) 다음의 목적을 위하여 개인정보를 처리합니다. 처리하고 있는 개인정보는 다음의 목적 이외의 용도로는 이용되지 않으며 이용 목적이 변경되는 경우에는 「개인정보 보호법」 제18조에 따라 별도의 동의를 받는 등 필요한 조치를 이행할 예정입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;제2조(개인정보의 처리 및 보유 기간)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;①&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt; 찬랩 &amp;gt;은(는) 법령에 따른 개인정보 보유&amp;middot;이용기간 또는 정보주체로부터 개인정보를 수집 시에 동의받은 개인정보 보유&amp;middot;이용기간 내에서 개인정보를 처리&amp;middot;보유합니다.&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;1.&amp;lt;재화 또는 서비스 제공&amp;gt;&lt;/li&gt;
&lt;li&gt;&amp;lt;재화 또는 서비스 제공&amp;gt;와 관련한 개인정보는 수집.이용에 관한 동의일로부터&amp;lt;지체없이 파기&amp;gt;까지 위 이용목적을 위하여 보유.이용됩니다.&lt;/li&gt;
&lt;li&gt;보유근거 : -&lt;/li&gt;
&lt;li&gt;관련법령 : 1)신용정보의 수집/처리 및 이용 등에 관한 기록 : 3년&lt;br /&gt;2) 소비자의 불만 또는 분쟁처리에 관한 기록 : 3년&lt;br /&gt;3) 대금결제 및 재화 등의 공급에 관한 기록 : 5년&lt;br /&gt;4) 계약 또는 청약철회 등에 관한 기록 : 5년&lt;br /&gt;5) 표시/광고에 관한 기록 : 6개월&lt;/li&gt;
&lt;li&gt;예외사유 :&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;제3조(처리하는 개인정보의 항목)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;①&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt; 찬랩 &amp;gt;은(는) 다음의 개인정보 항목을 처리하고 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1&amp;lt; 재화 또는 서비스 제공 &amp;gt;&lt;/li&gt;
&lt;li&gt;필수항목 : 서비스 이용 기록, 접속 로그, 쿠키, 접속 IP 정보, 결제기록&lt;/li&gt;
&lt;li&gt;선택항목 :&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;제4조(개인정보의 파기절차 및 파기방법)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;① &amp;lt; 찬랩 &amp;gt; 은(는) 개인정보 보유기간의 경과, 처리목적 달성 등 개인정보가 불필요하게 되었을 때에는 지체없이 해당 개인정보를 파기합니다.&lt;br /&gt;&lt;br /&gt;② 정보주체로부터 동의받은 개인정보 보유기간이 경과하거나 처리목적이 달성되었음에도 불구하고 다른 법령에 따라 개인정보를 계속 보존하여야 하는 경우에는, 해당 개인정보를 별도의 데이터베이스(DB)로 옮기거나 보관장소를 달리하여 보존합니다.&lt;br /&gt;1. 법령 근거 :&lt;br /&gt;2. 보존하는 개인정보 항목 : 계좌정보, 거래날짜&lt;br /&gt;&lt;br /&gt;③ 개인정보 파기의 절차 및 방법은 다음과 같습니다.&lt;br /&gt;1. 파기절차&lt;br /&gt;&amp;lt; 찬랩 &amp;gt; 은(는) 파기 사유가 발생한 개인정보를 선정하고, &amp;lt; 찬랩 &amp;gt; 의 개인정보 보호책임자의 승인을 받아 개인정보를 파기합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 파기방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전자적 파일 형태의 정보는 기록을 재생할 수 없는 기술적 방법을 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;종이에 출력된 개인정보는 분쇄기로 분쇄하거나 소각을 통하여 파기합니다&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;제5조(정보주체와 법정대리인의 권리&amp;middot;의무 및 그 행사방법에 관한 사항)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;① 정보주체는 찬랩에 대해 언제든지 개인정보 열람&amp;middot;정정&amp;middot;삭제&amp;middot;처리정지 요구 등의 권리를 행사할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;② 제1항에 따른 권리 행사는찬랩에 대해 「개인정보 보호법」 시행령 제41조제1항에 따라 서면, 전자우편, 모사전송(FAX) 등을 통하여 하실 수 있으며 찬랩은(는) 이에 대해 지체 없이 조치하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;③ 제1항에 따른 권리 행사는 정보주체의 법정대리인이나 위임을 받은 자 등 대리인을 통하여 하실 수 있습니다.이 경우 &amp;ldquo;개인정보 처리 방법에 관한 고시(제2020-7호)&amp;rdquo; 별지 제11호 서식에 따른 위임장을 제출하셔야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;④ 개인정보 열람 및 처리정지 요구는 「개인정보 보호법」 제35조 제4항, 제37조 제2항에 의하여 정보주체의 권리가 제한 될 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⑤ 개인정보의 정정 및 삭제 요구는 다른 법령에서 그 개인정보가 수집 대상으로 명시되어 있는 경우에는 그 삭제를 요구할 수 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⑥ 찬랩은(는) 정보주체 권리에 따른 열람의 요구, 정정&amp;middot;삭제의 요구, 처리정지의 요구 시 열람 등 요구를 한 자가 본인이거나 정당한 대리인인지를 확인합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;제6조(개인정보의 안전성 확보조치에 관한 사항)&lt;br /&gt;&lt;br /&gt;&amp;lt; 찬랩 &amp;gt;은(는) 개인정보의 안전성 확보를 위해 다음과 같은 조치를 취하고 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 정기적인 자체 감사 실시&lt;br /&gt;개인정보 취급 관련 안정성 확보를 위해 정기적(분기 1회)으로 자체 감사를 실시하고 있습니다.&lt;br /&gt;&lt;br /&gt;2. 개인정보 취급 직원의 최소화 및 교육&lt;br /&gt;개인정보를 취급하는 직원을 지정하고 담당자에 한정시켜 최소화 하여 개인정보를 관리하는 대책을 시행하고 있습니다.&lt;br /&gt;&lt;br /&gt;3. 내부관리계획의 수립 및 시행&lt;br /&gt;개인정보의 안전한 처리를 위하여 내부관리계획을 수립하고 시행하고 있습니다.&lt;br /&gt;&lt;br /&gt;4. 해킹 등에 대비한 기술적 대책&lt;br /&gt;&amp;lt;찬랩&amp;gt;('Chan lab')은 해킹이나 컴퓨터 바이러스 등에 의한 개인정보 유출 및 훼손을 막기 위하여 보안프로그램을 설치하고 주기적인 갱신&amp;middot;점검을 하며 외부로부터 접근이 통제된 구역에 시스템을 설치하고 기술적/물리적으로 감시 및 차단하고 있습니다.&lt;br /&gt;&lt;br /&gt;5. 개인정보의 암호화&lt;br /&gt;이용자의 개인정보는 비밀번호는 암호화 되어 저장 및 관리되고 있어, 본인만이 알 수 있으며 중요한 데이터는 파일 및 전송 데이터를 암호화 하거나 파일 잠금 기능을 사용하는 등의 별도 보안기능을 사용하고 있습니다.&lt;br /&gt;&lt;br /&gt;6. 접속기록의 보관 및 위변조 방지&lt;br /&gt;개인정보처리시스템에 접속한 기록을 최소 1년 이상 보관, 관리하고 있으며,다만, 5만명 이상의 정보주체에 관하여 개인정보를 추가하거나, 고유식별정보 또는 민감정보를 처리하는 경우에는 2년이상 보관, 관리하고 있습니다.&lt;br /&gt;또한, 접속기록이 위변조 및 도난, 분실되지 않도록 보안기능을 사용하고 있습니다.&lt;br /&gt;&lt;br /&gt;7. 개인정보에 대한 접근 제한&lt;br /&gt;개인정보를 처리하는 데이터베이스시스템에 대한 접근권한의 부여,변경,말소를 통하여 개인정보에 대한 접근통제를 위하여 필요한 조치를 하고 있으며 침입차단시스템을 이용하여 외부로부터의 무단 접근을 통제하고 있습니다.&lt;br /&gt;&lt;br /&gt;8. 문서보안을 위한 잠금장치 사용&lt;br /&gt;개인정보가 포함된 서류, 보조저장매체 등을 잠금장치가 있는 안전한 장소에 보관하고 있습니다.&lt;br /&gt;&lt;br /&gt;9. 비인가자에 대한 출입 통제&lt;br /&gt;개인정보를 보관하고 있는 물리적 보관 장소를 별도로 두고 이에 대해 출입통제 절차를 수립, 운영하고 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;제7조(개인정보를 자동으로 수집하는 장치의 설치&amp;middot;운영 및 그 거부에 관한 사항)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;① 찬랩 은(는) 이용자에게 개별적인 맞춤서비스를 제공하기 위해 이용정보를 저장하고 수시로 불러오는 &amp;lsquo;쿠키(cookie)&amp;rsquo;를 사용합니다.&lt;br /&gt;② 쿠키는 웹사이트를 운영하는데 이용되는 서버(http)가 이용자의 컴퓨터 브라우저에게 보내는 소량의 정보이며 이용자들의 PC 컴퓨터내의 하드디스크에 저장되기도 합니다.&lt;br /&gt;가. 쿠키의 사용 목적 : 이용자가 방문한 각 서비스와 웹 사이트들에 대한 방문 및 이용형태, 인기 검색어, 보안접속 여부, 등을 파악하여 이용자에게 최적화된 정보 제공을 위해 사용됩니다.&lt;br /&gt;나. 쿠키의 설치&amp;bull;운영 및 거부 : 웹브라우저 상단의 도구&amp;gt;인터넷 옵션&amp;gt;개인정보 메뉴의 옵션 설정을 통해 쿠키 저장을 거부 할 수 있습니다.&lt;br /&gt;다. 쿠키 저장을 거부할 경우 맞춤형 서비스 이용에 어려움이 발생할 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;제8조(행태정보의 수집&amp;middot;이용&amp;middot;제공 및 거부 등에 관한 사항)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;행태정보의 수집&amp;middot;이용&amp;middot;제공 및 거부등에 관한 사항&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;개인정보처리자명&amp;gt;은(는) 온라인 맞춤형 광고 등을 위한 행태정보를 수집&amp;middot;이용&amp;middot;제공하지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;제9조(추가적인 이용&amp;middot;제공 판단기준)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt; 찬랩 &amp;gt; 은(는) ｢개인정보 보호법｣ 제15조제3항 및 제17조제4항에 따라 ｢개인정보 보호법 시행령｣ 제14조의2에 따른 사항을 고려하여 정보주체의 동의 없이 개인정보를 추가적으로 이용&amp;middot;제공할 수 있습니다.&lt;br /&gt;이에 따라 &amp;lt; 찬랩 &amp;gt; 가(이) 정보주체의 동의 없이 추가적인 이용&amp;middot;제공을 하기 위해서 다음과 같은 사항을 고려하였습니다.&lt;br /&gt;▶ 개인정보를 추가적으로 이용&amp;middot;제공하려는 목적이 당초 수집 목적과 관련성이 있는지 여부&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 개인정보를 수집한 정황 또는 처리 관행에 비추어 볼 때 추가적인 이용&amp;middot;제공에 대한 예측 가능성이 있는지 여부&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 개인정보의 추가적인 이용&amp;middot;제공이 정보주체의 이익을 부당하게 침해하는지 여부&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 가명처리 또는 암호화 등 안전성 확보에 필요한 조치를 하였는지 여부&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 추가적인 이용&amp;middot;제공 시 고려사항에 대한 판단기준은 사업자/단체 스스로 자율적으로 판단하여 작성&amp;middot;공개함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;제10조(가명정보를 처리하는 경우 가명정보 처리에 관한 사항)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt; 찬랩 &amp;gt; 은(는) 다음과 같은 목적으로 가명정보를 처리하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 가명정보의 처리 목적&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 직접작성 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 가명정보의 처리 및 보유기간&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 직접작성 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 가명정보의 제3자 제공에 관한 사항(해당되는 경우에만 작성)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 직접작성 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 가명정보 처리의 위탁에 관한 사항(해당되는 경우에만 작성)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 직접작성 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 가명처리하는 개인정보의 항목&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 직접작성 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 법 제28조의4(가명정보에 대한 안전조치 의무 등)에 따른 가명정보의 안전성 확보조치에 관한 사항&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 직접작성 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;제11조 (개인정보 보호책임자에 관한 사항)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;①&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;찬랩&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;은(는) 개인정보 처리에 관한 업무를 총괄해서 책임지고, 개인정보 처리와 관련한 정보주체의 불만처리 및 피해구제 등을 위하여 아래와 같이 개인정보 보호책임자를 지정하고 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;▶ 개인정보 보호책임자&lt;/li&gt;
&lt;li&gt;성명 :은해찬&lt;/li&gt;
&lt;li&gt;직책 :사원&lt;/li&gt;
&lt;li&gt;직급 :프로&lt;/li&gt;
&lt;li&gt;연락처 :01046142261, whitestar718@naver.com,&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 개인정보 보호 담당부서로 연결됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;▶ 개인정보 보호 담당부서&lt;/li&gt;
&lt;li&gt;부서명 :&lt;/li&gt;
&lt;li&gt;담당자 :&lt;/li&gt;
&lt;li&gt;연락처 :, ,&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;② 정보주체께서는 찬랩 의 서비스(또는 사업)을 이용하시면서 발생한 모든 개인정보 보호 관련 문의, 불만처리, 피해구제 등에 관한 사항을 개인정보 보호책임자 및 담당부서로 문의하실 수 있습니다. 찬랩 은(는) 정보주체의 문의에 대해 지체 없이 답변 및 처리해드릴 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;제12조(국내대리인의 지정)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;정보주체는 ｢개인정보 보호법｣ 제39조의11에 따라 지정된 &amp;lt; 찬랩 &amp;gt;의 국내대리인에게 개인정보 관련 고충처리 등의 업무를 위하여 연락을 취할 수 있습니다. &amp;lt; 찬랩 &amp;gt;은(는) 정보주체의 개인정보 관련 고충처리 등 개인정보 보호책임자의 업무 등을 신속하게 처리할 수 있도록 노력하겠습니다.&lt;br /&gt;&lt;br /&gt;▶ &amp;lt; 찬랩 &amp;gt; 은(는) ｢개인정보 보호법｣ 제39조의11에 따라 국내대리인을 지정하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 국내대리인의 성명 : [대리인 성명_직접입력] (법인의 경우 법인명, 대표자의 성명)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 국내대리인의 주소 : [대리인 주소_직접입력] (법인의 경우 영업소 소재지)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 국내대리인의 전화번호 : [대리인 전화번호_직접입력]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 국내대리인의 전자우편 주소 : [대리인 전자우편_직접입력]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;제13조(개인정보의 열람청구를 접수&amp;middot;처리하는 부서)&lt;br /&gt;정보주체는 ｢개인정보 보호법｣ 제35조에 따른 개인정보의 열람 청구를 아래의 부서에 할 수 있습니다.&lt;br /&gt;&amp;lt; 찬랩 &amp;gt;은(는) 정보주체의 개인정보 열람청구가 신속하게 처리되도록 노력하겠습니다.&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;▶ 개인정보 열람청구 접수&amp;middot;처리 부서&lt;/li&gt;
&lt;li&gt;부서명 :&lt;/li&gt;
&lt;li&gt;담당자 :&lt;/li&gt;
&lt;li&gt;연락처 : , ,&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;제14조(정보주체의 권익침해에 대한 구제방법)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;정보주체는 개인정보침해로 인한 구제를 받기 위하여 개인정보분쟁조정위원회, 한국인터넷진흥원 개인정보침해신고센터 등에 분쟁해결이나 상담 등을 신청할 수 있습니다. 이 밖에 기타 개인정보침해의 신고, 상담에 대하여는 아래의 기관에 문의하시기 바랍니다.&lt;br /&gt;&lt;br /&gt;1. 개인정보분쟁조정위원회 : (국번없이) 1833-6972 (www.kopico.go.kr)&lt;br /&gt;2. 개인정보침해신고센터 : (국번없이) 118 (privacy.kisa.or.kr)&lt;br /&gt;3. 대검찰청 : (국번없이) 1301 (www.spo.go.kr)&lt;br /&gt;4. 경찰청 : (국번없이) 182 (ecrm.cyber.go.kr)&lt;br /&gt;&lt;br /&gt;「개인정보보호법」제35조(개인정보의 열람), 제36조(개인정보의 정정&amp;middot;삭제), 제37조(개인정보의 처리정지 등)의 규정에 의한 요구에 대 하여 공공기관의 장이 행한 처분 또는 부작위로 인하여 권리 또는 이익의 침해를 받은 자는 행정심판법이 정하는 바에 따라 행정심판을 청구할 수 있습니다.&lt;br /&gt;&lt;br /&gt;※ 행정심판에 대해 자세한 사항은 중앙행정심판위원회(www.simpan.go.kr) 홈페이지를 참고하시기 바랍니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;제15조(영상정보처리기기 운영&amp;middot;관리에 관한 사항)&lt;br /&gt;①&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt; 찬랩 &amp;gt;은(는) 아래와 같이 영상정보처리기기를 설치&amp;middot;운영하고 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.영상정보처리기기 설치근거&amp;middot;목적 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;lt; 찬랩 &amp;gt;&lt;/span&gt;의&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2.설치 대수, 설치 위치, 촬영 범위 :&lt;/li&gt;
&lt;li&gt;설치대수 : 대&lt;/li&gt;
&lt;li&gt;설치위치 :&lt;/li&gt;
&lt;li&gt;촬영범위 :&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.관리책임자, 담당부서 및 영상정보에 대한 접근권한자 :&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;4.영상정보 촬영시간, 보관기간, 보관장소, 처리방법&lt;/li&gt;
&lt;li&gt;촬영시간 : 시간&lt;/li&gt;
&lt;li&gt;보관기간 : 촬영시부터&lt;/li&gt;
&lt;li&gt;보관장소 및 처리방법 :&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5.영상정보 확인 방법 및 장소 :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6.정보주체의 영상정보 열람 등 요구에 대한 조치 : 개인영상정보 열람.존재확인 청구서로 신청하여야 하며, 정보주체 자신이 촬영된 경우 또는 명백히 정보주체의 생명.신체.재산 이익을 위해 필요한 경우에 한해 열람을 허용함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7.영상정보 보호를 위한 기술적.관리적.물리적 조치 :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;제16조(개인정보 처리방침 변경)&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;① 이 개인정보처리방침은 2023년 2월 22부터 적용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;② 이전의 개인정보 처리방침은 아래에서 확인하실 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 해당 사항 없음 -&amp;nbsp;&lt;/p&gt;</description>
      <category>기타</category>
      <author>pychan</author>
      <guid isPermaLink="true">https://chan-lab.tistory.com/40</guid>
      <comments>https://chan-lab.tistory.com/40#entry40comment</comments>
      <pubDate>Wed, 22 Feb 2023 15:17:04 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] 로또의 최고 순위와 최저 순위 파이썬 알고리즘 문제풀이 #리스트의 count 함수 사용</title>
      <link>https://chan-lab.tistory.com/38</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;587&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8uowB/btrTGYgbV7k/GkKTrl0ayWds1bgffHmJ71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8uowB/btrTGYgbV7k/GkKTrl0ayWds1bgffHmJ71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8uowB/btrTGYgbV7k/GkKTrl0ayWds1bgffHmJ71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8uowB%2FbtrTGYgbV7k%2FGkKTrl0ayWds1bgffHmJ71%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;1196&quot; height=&quot;587&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;587&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;안녕하세요. &lt;br /&gt;오늘은 프로그래머스 lv1 문제 &lt;u&gt;&lt;b&gt;&quot;로또의 최고 순위와 최저 순위&quot;&lt;/b&gt;&lt;/u&gt; 문제 풀어보겠습니다.&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;해당 문제 바로가기 &amp;darr;&amp;darr;&amp;darr;&amp;darr; 하단 링크 클릭&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/77484&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/77484&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1671027496328&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/77484&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/C6e8u/hyQTAvIp9G/SrGUcNOcYfS9NuR6GTcpI1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bmZ1Bm/hyQTDMHeFY/yq3SvUH10wHK1Vp8K3NlY0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/77484&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/77484&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/C6e8u/hyQTAvIp9G/SrGUcNOcYfS9NuR6GTcpI1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bmZ1Bm/hyQTDMHeFY/yq3SvUH10wHK1Vp8K3NlY0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1. 리스트의 count 함수 사용하여 0의 개수 세기&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;pre id=&quot;code_1671024188882&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(lottos, win_nums):
    # lottos: [44, 1, 0, 0, 31, 25]
    # win_nums: [31, 10, 45, 1, 6, 19]
    
    zeros = lottos.count(0)               # 리스트에서 0의 개수 세기
    print(zeros)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1671024210325&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;2&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;[&lt;i&gt;&lt;u&gt;리스트형 자료&lt;/u&gt;&lt;/i&gt;].count(&lt;i&gt;&lt;u&gt;세고 싶은 대상&lt;/u&gt;&lt;/i&gt;)&lt;br /&gt;위와 같이 리스트에서 원하는 구성 요소들을 셀 수 있습니다.&lt;br /&gt;&lt;br /&gt;lottos 리스트에 0은 2개 있으므로, &lt;u&gt;&lt;b&gt;zeros는 2&lt;/b&gt;&lt;/u&gt;&lt;b&gt; &lt;/b&gt;입니다.&lt;br /&gt;이렇게 미리 0의 개수를 세어두면 문제를 간단히 풀 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;최고 점수&lt;/b&gt;는 0인 숫자들을 다 맞췄다고 생각하면 되고,&lt;br /&gt;&lt;b&gt;최저 점수&lt;/b&gt;는 0인 숫자들을 한 개도 못 맞췄다고 생각하면 되기 때문입니다.&lt;br /&gt;다음 단계로 넘어가겠습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2. 순위 값 딕셔너리로 미리 할당&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;pre id=&quot;code_1671026296461&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(lottos, win_nums):
    # lottos: [44, 1, 0, 0, 31, 25]
    # win_nums: [31, 10, 45, 1, 6, 19]

    zeros = lottos.count(0)               # 리스트에서 0의 개수 세기
    win = 0                               # win 변수 = 맞춘 개수 (0으로 초기화)
    scores = {0: 6, 1: 6, 2: 5, 3: 4,     # ★ 포인트1. 경우의 수가 7개 밖에 없으므로
              4: 3, 5: 2, 6: 1}           #           각각의 맞춘 개수에 순위 할당하기
                                          # ★ 포인트2. 0개 맞은 순위 = 1개 맞은 순위&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;순위 값들을 딕셔너리에 미리 할당해 두었습니다.&lt;br /&gt;원래 코딩 테스트에서 하드 코딩은 지양해야 하지만,&lt;br /&gt;지금은 워낙 경우의 수가 적으니까요.. (다 해도 7개 밖에 없습니다)&lt;br /&gt;&lt;br /&gt;또 한 가지 포인트는, 0개 맞은 순위와 1개 맞은 순위가 같다는 것 입니다. (둘 다 꼴찌)&lt;br /&gt;&lt;u&gt;&lt;b&gt;1개 맞아도 6등&lt;/b&gt;&lt;/u&gt;으로 처리해야 하고,&lt;br /&gt;&lt;u&gt;&lt;b&gt;다 빗나가도 6등&lt;/b&gt;&lt;/u&gt;으로 처리해줘야 테스트를 통과할 수 있습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;3. 맞은 번호의 개수 세기&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;pre id=&quot;code_1671026599049&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(lottos, win_nums):
    # lottos: [44, 1, 0, 0, 31, 25]
    # win_nums: [31, 10, 45, 1, 6, 19]

    zeros = lottos.count(0)               # 리스트에서 0의 개수 세기
    win = 0                               # win 변수 = 맞춘 개수 (0으로 초기화)
    scores = {0: 6, 1: 6, 2: 5, 3: 4,     # ★ 포인트1. 경우의 수가 7개 밖에 없으므로
              4: 3, 5: 2, 6: 1}           #           각각의 맞춘 개수에 순위 할당하기
                                          # ★ 포인트2. 0개 맞은 순위 = 1개 맞은 순위
    
    for l in lottos:                    
        if l in win_nums:
            win += 1
    print('win:', win)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1671026689508&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;win: 2&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이제 lottos 리스트를 하나씩 반복문으로 돌면서,&lt;br /&gt;맞았는지 카운트를 해줍니다.&lt;br /&gt;(&lt;u&gt;win이라는 변수에 저장&lt;/u&gt;)&lt;br /&gt;&lt;br /&gt;맞춘 번호는 &lt;b&gt;1, 31&lt;/b&gt; 입니다.&lt;br /&gt;그래서 win에는 &lt;b&gt;2&lt;/b&gt;가 할당되어 있습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;4. 최고 점수와 최저 점수 구하기&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;pre id=&quot;code_1671026989461&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(lottos, win_nums):
    # lottos: [44, 1, 0, 0, 31, 25]
    # win_nums: [31, 10, 45, 1, 6, 19]

    zeros = lottos.count(0)               # 리스트에서 0의 개수 세기
    win = 0                               # win 변수 = 맞춘 개수 (0으로 초기화)
    scores = {0: 6, 1: 6, 2: 5, 3: 4,     # ★ 포인트1. 경우의 수가 7개 밖에 없으므로
              4: 3, 5: 2, 6: 1}           #           각각의 맞춘 개수에 순위 할당하기
                                          # ★ 포인트2. 0개 맞은 순위 = 1개 맞은 순위
    
    for l in lottos:                    
        if l in win_nums:
            win += 1
    
    most = win + zeros                    # 맞춘 번호 + 0이 다 맞았다고 가정 -&amp;gt; 최고 순위
    least = win                           # 0이 다 틀렸다고 가정 -&amp;gt; 최저 순위
    print('most:', most)
    print('least:', least)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1671027008406&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;most: 4
least: 2&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이제 최고 점수와 최저 점수를 각각 구해봅니다.&lt;br /&gt;최고 점수는 0으로 센 것들이 다 맞았다고 가정하기 때문에, &lt;br /&gt;그냥 zeros를 더해주면 됩니다. (most)&lt;br /&gt;&lt;br /&gt;최저 점수는 0으로 된 것들이 다 틀렸다고 생각하면 됩니다.&lt;br /&gt;그래서 그대로 맞은 것들만 반환해 줍니다. (least)&lt;br /&gt;&lt;br /&gt;&lt;s&gt;(이제와서 생각해보니.. 변수 이름을 highest, lowest로 하는게&lt;/s&gt;&lt;br /&gt;&lt;s&gt;더 나았을 걸 그랬네요.. 이건 뭐 콩글리시도 아니고..)&lt;/s&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;5. 마무리&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;pre id=&quot;code_1671027212394&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(lottos, win_nums):
    # lottos: [44, 1, 0, 0, 31, 25]
    # win_nums: [31, 10, 45, 1, 6, 19]

    zeros = lottos.count(0)               # 리스트에서 0의 개수 세기
    win = 0                               # win 변수 = 맞춘 개수 (0으로 초기화)
    scores = {0: 6, 1: 6, 2: 5, 3: 4,     # ★ 포인트1. 경우의 수가 7개 밖에 없으므로
              4: 3, 5: 2, 6: 1}           #           각각의 맞춘 개수에 순위 할당하기
                                          # ★ 포인트2. 0개 맞은 순위 = 1개 맞은 순위
    
    for l in lottos:                    
        if l in win_nums:
            win += 1
    
    most = win + zeros                    # 맞춘 번호 + 0이 다 맞았다고 가정 -&amp;gt; 최고 순위
    least = win                           # 0이 다 틀렸다고 가정 -&amp;gt; 최저 순위
    return [scores[most], scores[least]]  # 딕셔너리를 이용하여 깔끔하게 리턴&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이제 아까 만들어둔 딕셔너리의 key로&lt;br /&gt;most와 least를 각각 넣어주면 코드가 완성 됩니다.&lt;br /&gt;오늘의 포인트를 2가지로 정리하겠습니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;※&lt;/b&gt;&lt;br /&gt;&lt;b&gt;1. count함수를 이용하여 list의 요소 세기&lt;/b&gt;&lt;br /&gt;&lt;b&gt;2. 딕셔너리를 이용하여 순위 계산 쉽게 하기&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;※&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;이상으로 마치겠습니다.&lt;/span&gt;&lt;/blockquote&gt;</description>
      <category>Python/알고리즘 문제풀이</category>
      <category>로또의 최고 순위 파이썬</category>
      <category>로또의 최고 순위와 최저 순위 파이썬</category>
      <category>프로그래머스 로또 은공지능</category>
      <category>프로그래머스 로또의 최고 순위와 최저 순위</category>
      <category>프로그래머스 파이썬 알고리즘 문제풀이</category>
      <author>pychan</author>
      <guid isPermaLink="true">https://chan-lab.tistory.com/38</guid>
      <comments>https://chan-lab.tistory.com/38#entry38comment</comments>
      <pubDate>Wed, 14 Dec 2022 23:19:51 +0900</pubDate>
    </item>
    <item>
      <title>[파이썬 알고리즘 꿀팁] 반복되는 문자열 처리법 #시간초과 에러 말끔히 해결! #join vs +=</title>
      <link>https://chan-lab.tistory.com/37</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1077&quot; data-origin-height=&quot;535&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvGGdn/btrTyCZ1EAp/E0CdwY1kPzWLfNo3ZzKph1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvGGdn/btrTyCZ1EAp/E0CdwY1kPzWLfNo3ZzKph1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvGGdn/btrTyCZ1EAp/E0CdwY1kPzWLfNo3ZzKph1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvGGdn%2FbtrTyCZ1EAp%2FE0CdwY1kPzWLfNo3ZzKph1%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;1077&quot; height=&quot;535&quot; data-origin-width=&quot;1077&quot; data-origin-height=&quot;535&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;&quot;&gt;오늘은 파이썬 알고리즘에 많이 사용되는&lt;br /&gt;문자열 다루는 &lt;u&gt;&lt;b&gt;꿀팁 테크닉&lt;/b&gt;&lt;/u&gt;을 알려드리려고 합니다.&lt;br /&gt;간단히 다음 장에서 &lt;b&gt;결론부터 말씀드리고&lt;/b&gt; 설명 드리겠습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1. 요약 정리&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;758&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAsgUS/btrTA5s8WKu/QxH12921JzKppRkpAJKwJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAsgUS/btrTA5s8WKu/QxH12921JzKppRkpAJKwJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAsgUS/btrTA5s8WKu/QxH12921JzKppRkpAJKwJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAsgUS%2FbtrTA5s8WKu%2FQxH12921JzKppRkpAJKwJk%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;2000&quot; height=&quot;758&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;758&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;&quot;&gt;결론은 그냥 문자열을 +하는 것보다&lt;u&gt;&lt;b&gt; join 함수를 쓰라는 것&lt;/b&gt;&lt;/u&gt;입니다.&lt;br /&gt;시간 절약을 &lt;u&gt;&lt;b&gt;4배 이상&lt;/b&gt;&lt;/u&gt; 할 수 있습니다.&lt;br /&gt;다만, 결론에서 말씀드렸다시피 &lt;b&gt;&quot;잘~&quot;&lt;/b&gt; 쓰시는게 중요합니다.&lt;br /&gt;다음 절에서 join 함수에 관해 설명 드리겠습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2. join 함수란?&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;pre id=&quot;code_1670941138725&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;data = ['a', 'b', 'c']
print(''.join(data))
print('/'.join(data))&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1670941172015&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output
------------------------------------------
abc
a/b/c&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;&quot;&gt;join 함수는 &lt;u&gt;&lt;b&gt;리스트를 합쳐 문자열로&lt;/b&gt;&lt;/u&gt; 만들어주는 함수입니다.&lt;br /&gt;그런데, join 함수는 &lt;u&gt;&lt;b&gt;구분자를 지정&lt;/b&gt;&lt;/u&gt;해 줄 수 있습니다.&lt;br /&gt;위의 예시를 살펴보겠습니다.&lt;br /&gt;&lt;br /&gt;''.join(data) -&amp;gt; data를 합치는데, 구분자를 &lt;b&gt;공백&lt;/b&gt;으로 하니 &lt;b&gt;'abc'&lt;/b&gt;가 나옵니다.&lt;br /&gt;'/'.join(data) -&amp;gt; data를 합치는데 구분자는 &lt;b&gt;슬래시(/)&lt;/b&gt;로 하니 &lt;b&gt;'a/b/c'&lt;/b&gt;가 나옵니다.&lt;br /&gt;&lt;br /&gt;보통 코딩테스트에서 join의 구분자는 공백과 함께 많이 쓰게 됩니다.&lt;br /&gt;(문제에 따라 다르겠지만요)&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;3. join 함수 잘 쓰는 법&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A4uPB/btrTzvMWi4R/UAFfiq3DpovtUtfgBLuke1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A4uPB/btrTzvMWi4R/UAFfiq3DpovtUtfgBLuke1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A4uPB/btrTzvMWi4R/UAFfiq3DpovtUtfgBLuke1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA4uPB%2FbtrTzvMWi4R%2FUAFfiq3DpovtUtfgBLuke1%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;2000&quot; height=&quot;1125&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1125&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;뜬금없이 퀴즈입니다.&lt;br /&gt;join을 잘 쓰려면 어떻게 써야 할까요?&lt;br /&gt;&lt;br /&gt;case1은 미리 리스트를 만들어 두고 나중에 join으로 한 번에 합치는 방식이고,&lt;br /&gt;case2는 그 때 그 때 s라는 문자열에 join을 시켜버리는 방식입니다.&lt;br /&gt;과연 정답은?&lt;/span&gt;&lt;/blockquote&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyinaR/btrTBJ4sYSp/zffCaoihbkB9vhMzTzyWnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyinaR/btrTBJ4sYSp/zffCaoihbkB9vhMzTzyWnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyinaR/btrTBJ4sYSp/zffCaoihbkB9vhMzTzyWnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyinaR%2FbtrTBJ4sYSp%2FzffCaoihbkB9vhMzTzyWnK%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;2000&quot; height=&quot;1125&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1125&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;리스트를 미리 만들어 둔 &lt;u&gt;&lt;b&gt;Case1의 승리&lt;/b&gt;&lt;/u&gt;입니다.&lt;br /&gt;둘 다 join 함수를 써서 시간 차이가 별로 나지 않긴 하네요 ^^&lt;br /&gt;하지만 +=로 재보았을 때는 125초가 나왔답니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;4. 왜 join이 +=보다 빠른가?&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://waymoot.org/home/python_string/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://waymoot.org/home/python_string/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1670943759712&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Efficient String Concatenation in Python&quot; data-og-description=&quot;&amp;nbsp; Efficient String Concatenation in Python An assessment of the performance of several methods Introduction Building long strings in the Python progamming language can sometimes result in very slow running code. In this article I investigate the computati&quot; data-og-host=&quot;waymoot.org&quot; data-og-source-url=&quot;https://waymoot.org/home/python_string/&quot; data-og-url=&quot;https://waymoot.org/home/python_string/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://waymoot.org/home/python_string/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://waymoot.org/home/python_string/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&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;Efficient String Concatenation in Python&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Efficient String Concatenation in Python An assessment of the performance of several methods Introduction Building long strings in the Python progamming language can sometimes result in very slow running code. In this article I investigate the computati&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;waymoot.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;왜 join이 +=보다 빠를까요?&lt;br /&gt;결론부터 말씀드리면, new representation이 매 번 생기지 않기 때문이라고 합니다.&lt;br /&gt;(representation: 객체를 print해보면 나오는 표현식의 일종)&lt;br /&gt;&lt;br /&gt;+= 연산은 매 번 &lt;u&gt;&lt;b&gt;new representation&lt;/b&gt;&lt;/u&gt;을 생성합니다.&lt;br /&gt;그리고 이것은 파이썬 알고리즘 문제풀이에서 &lt;br /&gt;많은 시간초과를 발생시키는 원인이기도 합니다.&lt;br /&gt;(궁금하신 분들을 위해 representation에 관한 reference를 남겨두겠습니다)&lt;br /&gt;&lt;br /&gt;이것이 join 연산이 +=에 비해 월등히 빠른 이유입니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고자료: &lt;a href=&quot;https://www.pythonmorsels.com/string-representations/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.pythonmorsels.com/string-representations/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1670944068691&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;String Representations for Classes&quot; data-og-description=&quot;All Python objects have two different string representations, although we almost always use just one of them. You can customize both of these string representation on your Python objects.&quot; data-og-host=&quot;www.pythonmorsels.com&quot; data-og-source-url=&quot;https://www.pythonmorsels.com/string-representations/&quot; data-og-url=&quot;https://www.pythonmorsels.com/string-representations/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cEQBpU/hyQRTQjn1K/O65ZxLF4FB6ff4FaJTFZp0/img.jpg?width=800&amp;amp;height=418&amp;amp;face=0_0_800_418,https://scrap.kakaocdn.net/dn/cM9UkK/hyQTIzC5ig/KHF4MmSKDzZsbVfczClt90/img.jpg?width=800&amp;amp;height=418&amp;amp;face=0_0_800_418&quot;&gt;&lt;a href=&quot;https://www.pythonmorsels.com/string-representations/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.pythonmorsels.com/string-representations/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cEQBpU/hyQRTQjn1K/O65ZxLF4FB6ff4FaJTFZp0/img.jpg?width=800&amp;amp;height=418&amp;amp;face=0_0_800_418,https://scrap.kakaocdn.net/dn/cM9UkK/hyQTIzC5ig/KHF4MmSKDzZsbVfczClt90/img.jpg?width=800&amp;amp;height=418&amp;amp;face=0_0_800_418');&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;String Representations for Classes&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;All Python objects have two different string representations, although we almost always use just one of them. You can customize both of these string representation on your Python objects.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.pythonmorsels.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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;5. 정리&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;반복적인 문자열을 처리할 때는&lt;/b&gt;&lt;br /&gt;&lt;b&gt;join함수를 이용하되,&lt;/b&gt;&lt;br /&gt;&lt;b&gt;미리 리스트를 만들어 두고 처리하자!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;이상으로 포스팅을 마치겠습니다.&lt;br /&gt;도움이 되셨다면 댓글과 하단의 하트 한 번씩 부탁드립니다.&lt;br /&gt;감사합니다.&lt;/blockquote&gt;</description>
      <category>Python/알고리즘 문제풀이</category>
      <category>join함수 vs +=</category>
      <category>python join vs +=</category>
      <category>python join함수</category>
      <category>파이썬 꿀팁</category>
      <category>파이썬 반복 문자열 처리</category>
      <category>프로그래머스 꿀팁</category>
      <author>pychan</author>
      <guid isPermaLink="true">https://chan-lab.tistory.com/37</guid>
      <comments>https://chan-lab.tistory.com/37#entry37comment</comments>
      <pubDate>Wed, 14 Dec 2022 00:11:42 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] 숫자 짝꿍 파이썬 알고리즘 문제풀이 # 반복문 기준 정하기 # sort 함수 안 쓰기</title>
      <link>https://chan-lab.tistory.com/36</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;587&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpebQx/btrTtB0vuZl/q8lFs1SLsTuukR6YCQ9Wkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpebQx/btrTtB0vuZl/q8lFs1SLsTuukR6YCQ9Wkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpebQx/btrTtB0vuZl/q8lFs1SLsTuukR6YCQ9Wkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpebQx%2FbtrTtB0vuZl%2Fq8lFs1SLsTuukR6YCQ9Wkk%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;1196&quot; height=&quot;587&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;587&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;안녕하세요. 은공지능 공작소의 파이찬입니다.&lt;br /&gt;오늘은 프로그래머스 Lv1. 숫자 짝꿍 문제 풀어보겠습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;해당 문제 바로 가기 &amp;darr;&amp;darr;&amp;darr; 하단 링크 클릭&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/131128&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/131128&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1670836127506&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/131128&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/g1ehR/hyQRSpfRBr/EPHIBnjlu4M9z9tKC8cUTk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bslVB1/hyQRPTABGR/KKseiMZwkK2r829ODFPKx0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/131128&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/131128&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/g1ehR/hyQRSpfRBr/EPHIBnjlu4M9z9tKC8cUTk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bslVB1/hyQRPTABGR/KKseiMZwkK2r829ODFPKx0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 정답 공개&lt;/b&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;pre id=&quot;code_1670836248330&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(X, Y):
    answer = ''

    for i in range(9,-1,-1) :
        answer += (str(i) * min(X.count(str(i)), Y.count(str(i))))

    if answer == '' :
        return '-1'
    elif len(answer) == answer.count('0'):
        return '0'
    else :
        return answer&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;프로그래머스에서 가장 채택을 많이 받은 정답입니다. (22.12.12 기준)&lt;br /&gt;제가 푼 풀이하고 원리는 비슷하지만 더 간결하고 좋은 정답 같습니다.&lt;br /&gt;특히 문자열 '000'을 걸러내는 테크닉이 인상 깊었습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1670836542320&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 1. 뭘 대상으로 반복문을 돌릴지... X? Y? no.. 0 ~ 9까지 10개만!
# 2. 정렬하지 않고도 자동으로 정렬이 되게 하는 법? (sort는 시간을 많이 잡아먹음..)

def solution(X, Y):
    answer = ''
    # ★ 포인트1. 반복되는 숫자를 저장하기 위한 dictionary (key: 0 ~ 9)
    numx = {str(n):0 for n in range(10)}
    numy = {str(n):0 for n in range(10)}
    
    # X 문자열 하나씩 돌면서 카운트
    for x in X:
        numx[x] += 1
    
    # Y 문자열 하나씩 돌면서 카운트
    for y in Y:
        numy[y] += 1
    
    # ★ 포인트2. 9부터 0까지 반복문 돌기. sort를 안 하기 위함.
    #           짝꿍을 큰 수부터 더해가면 자동으로 제일 큰 수가 됨.
    for k in range(9, -1, -1):
        k = str(k)
        iternum = min(numx[k], numy[k])
        
        # ★ 포인트3. &quot;000&quot; -&amp;gt; &quot;0&quot;으로 만들어주기 위한 조건문
        if answer == '' and k == '0' and iternum != 0:
            return &quot;0&quot;
        
        # 실패 코드 #############################
        # for _ in range(iternum):             #
        #     answer = ''.join([answer, k])    #
        ########################################
        # 성공 코드 ★★★★★
        # '9'*3 = '999'가 되는 원리를 이용
        answer = ''.join([answer, k*iternum])  
        ########################################
    
    if answer == '':
        return &quot;-1&quot;
    else:
        return answer&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;제가 푼 정답입니다.&lt;br /&gt;코드가 더 길어보이는 이유는 설명 주석을 다느라 그렇습니다. ^^&lt;br /&gt;아무래도 이해하시기는 더 편할지도 모릅니다.&lt;br /&gt;&lt;br /&gt;위에서 부터 차근차근 설명해보도록 하겠습니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 0 ~ 9 범위의 dictionary 만들기&lt;/b&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;pre id=&quot;code_1670837007593&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(X, Y):
    answer = ''
    # ★ 포인트1. 반복되는 숫자를 저장하기 위한 dictionary (key: 0 ~ 9)
    numx = {str(n):0 for n in range(10)}
    numy = {str(n):0 for n in range(10)}

    print('numx:', numx)
    print('numy:', numy)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1670837143008&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;numx: {'0': 0, '1': 0, '2': 0, '3': 0, '4': 0, '5': 0, '6': 0, '7': 0, '8': 0, '9': 0}
numy: {'0': 0, '1': 0, '2': 0, '3': 0, '4': 0, '5': 0, '6': 0, '7': 0, '8': 0, '9': 0}&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;딕셔너리를 출력해보면 위와 같이 나옵니다.&lt;br /&gt;0 부터 9까지의 &lt;u&gt;&lt;b&gt;숫자값을 str&lt;/b&gt;&lt;/u&gt;로 만든 뒤, 모두 &lt;u&gt;&lt;b&gt;0으로 초기화&lt;/b&gt;&lt;/u&gt; 했습니다.&lt;br /&gt;&lt;br /&gt;이러한 딕셔너리들을 만든 이유는,&lt;br /&gt;반복문을 돌릴 때, &lt;b&gt;X나 Y를 기준으로 돌리는 것이 아니라&lt;/b&gt;,&lt;br /&gt;&lt;u&gt;&lt;b&gt;숫자 0~9를 기준으로&lt;/b&gt;&lt;/u&gt; 돌리기 위해서 입니다.&lt;br /&gt;(X 기준으로 Y랑 겹치는 것을 다 일일이 카운트 하면... 시간 초과가 납니다!)&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1670838600436&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(X, Y): # X:&quot;12321&quot;, Y:&quot;42531&quot;
    answer = ''
    # ★ 포인트1. 반복되는 숫자를 저장하기 위한 dictionary (key: 0 ~ 9)
    numx = {str(n):0 for n in range(10)}
    numy = {str(n):0 for n in range(10)}

    # X 문자열 하나씩 돌면서 카운트
    for x in X:
        numx[x] += 1
    
    # Y 문자열 하나씩 돌면서 카운트
    for y in Y:
        numy[y] += 1

    print('numx:', numx)
    print('numy:', numy)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1670838618817&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;numx: {'0': 0, '1': 2, '2': 2, '3': 1, '4': 0, '5': 0, '6': 0, '7': 0, '8': 0, '9': 0}
numy: {'0': 0, '1': 1, '2': 1, '3': 1, '4': 1, '5': 1, '6': 0, '7': 0, '8': 0, '9': 0}&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이제 문자열들을 하나씩 돌려보면서&lt;br /&gt;각각의 dictionary key들의 value들을 하나씩 늘려 주었습니다. &lt;b&gt;(+1)&lt;/b&gt;&lt;br /&gt;각각의 dictionary들을 프린트 해보면 위와 같은 결과가 나옵니다.&lt;br /&gt;(참고로 X, Y는 4번 예시를 썼습니다.)&lt;br /&gt;&lt;br /&gt;이렇게 함으로써, 각각의 X, Y에 &lt;b&gt;0~9 숫자&lt;/b&gt;들이&lt;br /&gt;얼마나 들어있는지 &lt;u&gt;&lt;b&gt;한눈에 확인&lt;/b&gt;&lt;/u&gt;할 수 있습니다.&lt;/span&gt;&lt;/blockquote&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;3. sort 함수 안 쓰고, for문으로 자동 정렬하기&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;pre id=&quot;code_1670839077519&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(X, Y): # X:&quot;12321&quot;, Y:&quot;42531&quot;
    answer = ''
    # ★ 포인트1. 반복되는 숫자를 저장하기 위한 dictionary (key: 0 ~ 9)
    numx = {str(n):0 for n in range(10)}
    numy = {str(n):0 for n in range(10)}

    # X 문자열 하나씩 돌면서 카운트
    for x in X:
        numx[x] += 1
    
    # Y 문자열 하나씩 돌면서 카운트
    for y in Y:
        numy[y] += 1

    # ★ 포인트2. 9부터 0까지 반복문 돌기. sort를 안 하기 위함.
    #           짝꿍을 큰 수부터 더해가면 자동으로 제일 큰 수가 됨.
    for k in range(9, -1, -1):
        k = str(k)
        iternum = min(numx[k], numy[k])
        
        # ★ 포인트3. &quot;000&quot; -&amp;gt; &quot;0&quot;으로 만들어주기 위한 조건문
        if answer == '' and k == '0' and iternum != 0:
            return &quot;0&quot;

        print(k, ':', iternum)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1670839201290&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;9 : 0
8 : 0
7 : 0
6 : 0
5 : 0
4 : 0
3 : 1
2 : 1
1 : 1
0 : 0&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이제 만들어둔 딕셔너리를 가지고, 숫자 짝꿍들을 세어봅시다.&lt;br /&gt;숫자 짝꿍은 &lt;u&gt;&lt;b&gt;두 X, Y 에서 공통으로 나타나는 숫자&lt;/b&gt;&lt;/u&gt;들을 말합니다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;div&gt;iternum&amp;nbsp;=&amp;nbsp;min(numx[k],&amp;nbsp;numy[k])&lt;br /&gt;해당 코드는 두 딕셔너리 값 중 더 작은 수를 return합니다.&lt;br /&gt;예를 들어 X에서 &lt;b&gt;3이라는 숫자가 4번&lt;/b&gt;, Y에서 &lt;b&gt;3이라는 숫자가 6번&lt;/b&gt; 반복된다면?&lt;br /&gt;공통적으로 반복되는 것은&lt;b&gt; 숫자3 이 4번&lt;/b&gt;이라는 것입니다. (min 함수를 쓴 이유)&lt;br /&gt;&lt;br /&gt;이것을 iternum에 할당하고 그 숫자만큼 반복된 문자열을 더해주는데요,&lt;br /&gt;9부터 0까지 역순으로 내려가기 때문에, &lt;u&gt;&lt;b&gt;sort함수를 쓸 필요가 없습니다.&lt;br /&gt;&lt;/b&gt;&lt;/u&gt;(반복문이 끝나면 자동으로 가장 큰 수가 나오는 원리)&lt;/div&gt;
&lt;/blockquote&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;마지막으로, 저는 문자열 &quot;000&quot;을 걸러내는 조건문을 만들었는데요,&lt;br /&gt;음.. 이것보다는 모범답안의 정답이 좀 더 우아하군요..&lt;br /&gt;그것으로 대신하겠습니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif&amp;nbsp;len(answer)&amp;nbsp;==&amp;nbsp;answer.count('0'): &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;'0'&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;전체 문자열이 0으로 채워진 것을 카운트하고, 전체 문자열의 길이와&lt;br /&gt;비교하는 부분입니다. (제 코드보다 훨신 깔끔하네요 ^^;)&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;4. 반복되는 문자열 더해주기 (중요)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;pre id=&quot;code_1670839950020&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 1. 뭘 대상으로 반복문을 돌릴지... X? Y? no.. 0 ~ 9까지 10개만!
# 2. 정렬하지 않고도 자동으로 정렬이 되게 하는 법? (sort는 시간을 많이 잡아먹음..)

def solution(X, Y):
    answer = ''
    # ★ 포인트1. 반복되는 숫자를 저장하기 위한 dictionary (key: 0 ~ 9)
    numx = {str(n):0 for n in range(10)}
    numy = {str(n):0 for n in range(10)}
    
    # X 문자열 하나씩 돌면서 카운트
    for x in X:
        numx[x] += 1
    
    # Y 문자열 하나씩 돌면서 카운트
    for y in Y:
        numy[y] += 1
    
    # ★ 포인트2. 9부터 0까지 반복문 돌기. sort를 안 하기 위함.
    #           짝꿍을 큰 수부터 더해가면 자동으로 제일 큰 수가 됨.
    for k in range(9, -1, -1):
        k = str(k)
        iternum = min(numx[k], numy[k])
        
        # ★ 포인트3. &quot;000&quot; -&amp;gt; &quot;0&quot;으로 만들어주기 위한 조건문
        if answer == '' and k == '0' and iternum != 0:
            return &quot;0&quot;
        
        # 실패 코드 #############################
        # for _ in range(iternum):             #
        #     answer = ''.join([answer, k])    #
        ########################################
        # 성공 코드 ★★★★★
        # '9'*3 = '999'가 되는 원리를 이용
        answer = ''.join([answer, k*iternum])  
        ########################################
    
    if answer == '':
        return &quot;-1&quot;
    else:
        return answer&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이 부분은 특히 중요하기에 실패코드와 성공코드로&lt;br /&gt;주석을 현란하게 구분해 두었습니다!&lt;br /&gt;문자열을 더할 때, 반복문으로 하나씩 더해주는 것보다&lt;br /&gt;&lt;i&gt;&lt;b&gt;[문자열] * [숫자]&lt;/b&gt;&lt;/i&gt; 방식으로 더해주는 게 훨씬 시간 단축이 됩니다.&lt;br /&gt;&lt;br /&gt;계속 11 ~ 15번 예시에서 시간 초과가 떴는데,&lt;br /&gt;이 부분을 해결하니 &lt;u&gt;&lt;b&gt;더 이상 시간초과가 뜨지 않았습니다!&lt;br /&gt;&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;5. 마무리&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;오늘 짚어볼 포인트는 크게 3가지 입니다.&lt;br /&gt;&lt;br /&gt;1. 공통된 부분을 찾기 위한, for문의 기준 잡기&lt;br /&gt;=&amp;gt; &lt;u&gt;X, Y가 아닌 0~9의 10개 숫자로 기준 잡아서 돌리기&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;2. sort함수를 안 쓰고 시간 단축하는 원리 알기&lt;br /&gt;=&amp;gt; &lt;u&gt;for k in range(9, -1, -1)로 자동으로 큰 정답 구하기&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;3. 반복된 문자열을 효울적으로 더하는 방법&lt;br /&gt;=&amp;gt; &lt;u&gt;반복문 보다 [문자열] * [숫자] 테크닉 이용하기&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/u&gt;도움이 되셨다면 댓글과 하단의 하트 부탁드립니다.&lt;br /&gt;감사합니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/알고리즘 문제풀이</category>
      <category>숫자 짝꿍 문제풀이</category>
      <category>숫자 짝꿍 알고리즘 문제풀이</category>
      <category>숫자 짝꿍 은공지능</category>
      <category>숫자 짝꿍 파이썬</category>
      <category>숫자 짝꿍 프로그래머스</category>
      <category>프로그래머스 숫자 짝꿍</category>
      <author>pychan</author>
      <guid isPermaLink="true">https://chan-lab.tistory.com/36</guid>
      <comments>https://chan-lab.tistory.com/36#entry36comment</comments>
      <pubDate>Mon, 12 Dec 2022 19:38:57 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] 기사단원의 무기 파이썬 알고리즘 문제풀이 (약수의 개수 구하기)</title>
      <link>https://chan-lab.tistory.com/35</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;587&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/716BE/btrS9pNGnta/hSIoBeFsCMiXCZ7tSa0wvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/716BE/btrS9pNGnta/hSIoBeFsCMiXCZ7tSa0wvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/716BE/btrS9pNGnta/hSIoBeFsCMiXCZ7tSa0wvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F716BE%2FbtrS9pNGnta%2FhSIoBeFsCMiXCZ7tSa0wvK%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;1196&quot; height=&quot;587&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;587&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;안녕하세요. 은공지능 공작소의 파이찬입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;오늘은 level 1 &lt;i&gt;&lt;b&gt;&quot;기사단원의 무기&quot;&lt;/b&gt;&lt;/i&gt; 문제 풀어보겠습니다.&lt;br /&gt;효율적으로 약수의 개수를 구하는 방법이 중요한 문제입니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;해당 문제 바로가기 링크 &amp;darr;&amp;darr;&amp;darr;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/136798&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/136798&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1670504027022&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/136798&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/U77wW/hyQPgqPr7g/aOyNzdmoNORXEuwGiiLGu1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bG4Ebz/hyQQv7JFTh/FVGXLQJuKJ9xIqJyvzK6M1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/136798&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/136798&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/U77wW/hyQPgqPr7g/aOyNzdmoNORXEuwGiiLGu1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bG4Ebz/hyQQv7JFTh/FVGXLQJuKJ9xIqJyvzK6M1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 약수의 개수 구하는 함수 만들기&lt;/b&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;pre id=&quot;code_1670504326201&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def get_cds(n, limit , power):
    cnt = 0
    for i in range(1, int(n**(1/2))+1): # ★포인트1. 제곱근만큼만 반복
        if n%i == 0:
            if i == n//i: # 제곱근일 경우 -&amp;gt; 1개만 카운트하기
                cnt += 1
            else:
                cnt += 2 # 제곱근이 아닐 경우, 2개 카운트 (i, n//i)
        if cnt &amp;gt; limit:  # ★포인트2. 소수의 개수가 limit를 넘어가면
            return power #            강제로 power만큼을 return 
    return cnt&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;약수의 개수를 구하는 함수에서 중요한 포인트는 2가지 입니다.&lt;br /&gt;&lt;br /&gt;첫번째로, for문을 돌릴 때, &lt;u&gt;&lt;b&gt;int(제곱근)까지만 반복&lt;/b&gt;&lt;/u&gt;하는 것 입니다.&lt;br /&gt;예를 들어, 18의 제곱근은 4.xxx정도가 나옵니다.&lt;br /&gt;for문을 돌리면 1, 2, 3, 4가 각각 18의 약수인지를 볼 것입니다.&lt;br /&gt;[1, 2, 3]이 각각 카운트되고, 18을 각각의 약수들로 나눈 [18, 9, 6]도 카운트 됩니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;18의 제곱근 이상 반복하는 것은 의미가 없습니다.&lt;br /&gt;&lt;/b&gt;반복문이 돌아 6이 나온다고 해도, 이미 약수에 추가가 되어 있기 때문입니다.&lt;br /&gt;여기서 6을 추가하면, &lt;u&gt;중복카운트&lt;/u&gt; 이므로 정답이 아니게 됩니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;&quot;&gt;두 번째 포인트는, &lt;u&gt;&lt;b&gt;문제의 제한조건을 활용&lt;/b&gt;&lt;/u&gt;하는 것입니다.&lt;br /&gt;문제에서, 약수의 개수가 특정 숫자를 넘어가면,&lt;br /&gt;강제로 power만큼으로 고정하라는 조건이 나옵니다.&lt;br /&gt;&lt;br /&gt;※&lt;br /&gt;&lt;i&gt;제한수치보다&amp;nbsp;큰&amp;nbsp;공격력을&amp;nbsp;가진&amp;nbsp;무기를&amp;nbsp;구매해야&amp;nbsp;하는&amp;nbsp;기사는 &lt;/i&gt;&lt;br /&gt;&lt;i&gt;협약기관에서&amp;nbsp;정한&amp;nbsp;공격력을&amp;nbsp;가지는&amp;nbsp;무기를&amp;nbsp;구매해야&amp;nbsp;합니다.&lt;/i&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;※&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;그렇기에 cnt의 개수가 limit을 넘어가면&lt;br /&gt;for문이 더 돌 필요도 없이, &lt;u&gt;&lt;b&gt;강제로 power를 리턴&lt;/b&gt;&lt;/u&gt;하고 종료하는 것입니다.&lt;br /&gt;limit과 power는 get_cds의 파라미터로 받았습니다.&lt;/span&gt;&lt;/blockquote&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2.&amp;nbsp; 전체 정답 공개&lt;/b&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;pre id=&quot;code_1670505602659&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def get_cds(n, limit , power):
    cnt = 0
    for i in range(1, int(n**(1/2))+1): # ★포인트1. 제곱근만큼만 반복
        if n%i == 0:
            if i == n//i: # 제곱근일 경우 -&amp;gt; 1개만 카운트하기
                cnt += 1
            else:
                cnt += 2 # 제곱근이 아닐 경우, 2개 카운트 (i, n//i)
        if cnt &amp;gt; limit:  # ★포인트2. 소수의 개수가 limit를 넘어가면
            return power #            강제로 power만큼을 return 
    return cnt

    
def solution(number, limit, power):
    total = 1
    for i in range(2, number+1):
        len_cds = get_cds(i, limit, power)
        total += len_cds

    return total&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;solution 부분은 단순히 약수들의 개수를 합산해주는 부분이라,&lt;br /&gt;보고 이해하시기 어렵지 않으실 것 입니다.&lt;br /&gt;도움이 되셨다면 하단의 하트 부탁드립니다!&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;모두 코딩테스트를 통과하는 그날까지 화이팅!&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/알고리즘 문제풀이</category>
      <category>기사단원의 무기</category>
      <category>기사단원의 무기 은공지능</category>
      <category>약수 개수</category>
      <category>약수 개수 파이썬</category>
      <category>약수의 개수 구하기</category>
      <category>프로그래머스 기사단원</category>
      <category>프로그래머스 기사단원 무기 파이썬</category>
      <category>프로그래머스 기사단원의 무기</category>
      <author>pychan</author>
      <guid isPermaLink="true">https://chan-lab.tistory.com/35</guid>
      <comments>https://chan-lab.tistory.com/35#entry35comment</comments>
      <pubDate>Thu, 8 Dec 2022 22:24:18 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] 유한소수 판별하기 파이썬 문제 풀이 #유클리드 호제법 #소인수분해</title>
      <link>https://chan-lab.tistory.com/34</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;587&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b67jzw/btrSm0anDSI/CktdjyRKOhSt8mrmCkRKY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b67jzw/btrSm0anDSI/CktdjyRKOhSt8mrmCkRKY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b67jzw/btrSm0anDSI/CktdjyRKOhSt8mrmCkRKY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb67jzw%2FbtrSm0anDSI%2FCktdjyRKOhSt8mrmCkRKY1%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;1196&quot; height=&quot;587&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;587&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;안녕하세요. 은공지능 공작소의 파이찬입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;오늘은 프로그래머스 유한소수 판별하기 문제 풀어보겠습니다.&lt;br /&gt;&lt;br /&gt;문제를 풀기 위해 알아야 할 개념은 크게 2가지 입니다.&lt;br /&gt;&lt;b&gt;1. 유클리드 호제법 (최대공약수)&lt;/b&gt;&lt;br /&gt;&lt;b&gt;2. 소인수 분해&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;소인수 분해를 사용하지 않고 푸는 방법도 있는데,&lt;br /&gt;가장 깔끔한 풀이법이었습니다.&lt;br /&gt;해당 정답 공개 후, 문제 풀이 시작하겠습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;프로그래머스 문제 바로 가기 &amp;darr;&amp;darr;&amp;darr; 링크 클릭&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/120878&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/120878&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1669714506308&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/120878&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b1Blyy/hyQJCtOmwI/pT2qxTzyk7vk7IE2J6unt1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/sCkAw/hyQJH2XQbY/u0AQ4au9qxAWa6kbzmVMtk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/120878&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/120878&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b1Blyy/hyQJCtOmwI/pT2qxTzyk7vk7IE2J6unt1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/sCkAw/hyQJH2XQbY/u0AQ4au9qxAWa6kbzmVMtk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1. 정답 공개&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;pre id=&quot;code_1669714747794&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from math import gcd
def solution(a, b):
    b //= gcd(a,b)
    while b%2==0:
        b//=2
    while b%5==0:
        b//=5
    return 1 if b==1 else 2&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;gcd는 &lt;span style=&quot;background-color: #ffffff; color: #4d5156;&quot;&gt;&lt;b&gt;최대공약수&lt;/b&gt;(&lt;/span&gt;Greatest Common Divisor&lt;span style=&quot;background-color: #ffffff; color: #4d5156;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;GCD&lt;span style=&quot;background-color: #ffffff; color: #4d5156;&quot;&gt;)를 의미합니다.&lt;br /&gt;&lt;/span&gt;파이썬의 math 라이브러리에 내장되어 있는 기본 함수를 사용했습니다.&lt;br /&gt;(실제 코딩테스트에서 사용 가능 가능할지는 모르겠네요... 알아두면 개꿀이니 숙지는 해야겠습니다)&lt;br /&gt;&lt;br /&gt;이후 분모(b)를 최대공약수로 나누고&lt;br /&gt;각각 2와 5로 나누어 떨어진다면, while문에 진입합니다.&lt;br /&gt;최종적으로 &lt;u&gt;&lt;b&gt;b가 1인지 아닌지&lt;/b&gt;&lt;/u&gt;를 return합니다.&lt;br /&gt;&lt;br /&gt;소인수분해를 사용하지 않은 대신,&lt;br /&gt;while문을 각각 사용한 것이 인상적이었습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;235&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQdw6I/btrSronjSIN/PyIzqKE7T9zvUgGWcRPqM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQdw6I/btrSronjSIN/PyIzqKE7T9zvUgGWcRPqM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQdw6I/btrSronjSIN/PyIzqKE7T9zvUgGWcRPqM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQdw6I%2FbtrSronjSIN%2FPyIzqKE7T9zvUgGWcRPqM0%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;200&quot; height=&quot;157&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;235&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그러나 만약 math 함수를 쓰지 말라고 한다면?&lt;br /&gt;면접에서 최대공약수 구하는 과정을 설명해보라 한다면?&lt;br /&gt;왜 분모를 최대공약수로 나누는지 이유는?&lt;br /&gt;&lt;br /&gt;그렇기 때문에 최대공약수를 구하는 &lt;u&gt;&lt;b&gt;유클리도 호제법&lt;/b&gt;&lt;/u&gt;과&lt;br /&gt;&lt;u&gt;&lt;b&gt;소인수 분해&lt;/b&gt;&lt;/u&gt;에 대한 알고리즘을 꼭 아셔야 합니다!&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2. 유클리드 호제법 (최대공약수 구하기)&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qLTx7/btrSmZ3Hwa7/KeLXHMSYQWSjbhHK9BKbmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qLTx7/btrSmZ3Hwa7/KeLXHMSYQWSjbhHK9BKbmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qLTx7/btrSmZ3Hwa7/KeLXHMSYQWSjbhHK9BKbmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqLTx7%2FbtrSmZ3Hwa7%2FKeLXHMSYQWSjbhHK9BKbmK%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;2000&quot; height=&quot;1125&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1125&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;간단한 문제를 통해 유클리드 호제법이 무엇인지 살펴보았습니다.&lt;br /&gt;유클리드 호제법은 2가지만 기억하시면 됩니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;① 다음 단계에서 분모는 분자가 된다.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;② 다음 단계에서 나머지는 분모가 된다.&lt;br /&gt;&lt;/b&gt;이제 유클리드 호제법을 코드로 구현해 보겠습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1669717221658&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def gcd(a, b):
    if a % b == 0:
        return b
    else:
        return gcd(b, a%b)&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;재귀함수를 이용하여 유클리드 호제법을 구현하였습니다.&lt;br /&gt;&lt;br /&gt;① 다음 단계에서 &lt;b&gt;분모&lt;/b&gt;는 &lt;u&gt;분자&lt;/u&gt;가 된다. -&amp;gt; &lt;b&gt;b&lt;/b&gt;가 &lt;u&gt;a&lt;/u&gt;자리에 왔습니다.&lt;br /&gt;② 다음 단계에서 &lt;i&gt;나머지&lt;/i&gt;는 &lt;b&gt;분모&lt;/b&gt;가 된다. -&amp;gt; &lt;i&gt;a%b&lt;/i&gt;가 &lt;b&gt;b&lt;/b&gt;자리에 왔습니다.&lt;br /&gt;&lt;br /&gt;나머지가 0으로 나누어 떨어지면?&lt;br /&gt;그것이 바로 최대공약수입니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 소인수 분해&lt;/b&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbhYqj/btrSpmc8kKU/EYceHERVW6QPbkO5D5MjFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbhYqj/btrSpmc8kKU/EYceHERVW6QPbkO5D5MjFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbhYqj/btrSpmc8kKU/EYceHERVW6QPbkO5D5MjFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbhYqj%2FbtrSpmc8kKU%2FEYceHERVW6QPbkO5D5MjFk%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;2000&quot; height=&quot;1125&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1125&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1669725094062&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def factorization(x):
    d = 2
    output = []
    
    while d &amp;lt;= x:
        if x % d == 0:
            output.append(d)
            x /= d
        else:
            d += 1
            
    return output&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;위의 코드는 &lt;b&gt;소인수분해&lt;/b&gt;를 함수로 구현한 것입니다.&lt;br /&gt;변수 d는 2부터 시작하여, 원래 input으로 주어진 x까지 반복됩니다.&lt;br /&gt;&lt;br /&gt;그러나 x 또한 고정된 것이 아니라 변화합니다.&lt;br /&gt;d로 나누어 떨어지면, &lt;b&gt;나누어 떨어진 몫&lt;/b&gt;을 x로 대체합니다. (x /= d)&lt;br /&gt;&lt;br /&gt;마지막으로 반환되는 &lt;b&gt;output&lt;/b&gt;은 소인수분해에 사용된&lt;br /&gt;소수들을 담고 있습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;4. 유클리드 호제법 + 소인수분해를 이용한 풀이법&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;pre id=&quot;code_1669725913826&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def gcd(a, b):
    if a % b == 0:
        return b
    else:
        return gcd(b, a%b)

def factorization(x):
    d = 2
    output = []
    
    while d &amp;lt;= x:
        if x % d == 0:
            output.append(d)
            x /= d
        else:
            d += 1
            
    return output
    
def solution(a, b):
    divide_num = gcd(b, a)
    result = b // divide_num
    
    for num in factorization(result):
        if num not in [2, 5]:
            return 2
    return 1&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;마지막 solution 파트에 대해서만 설명드리겠습니다.&lt;br /&gt;최대 공약수를 구한 뒤, b를 최대공약수로 나누게 되면,&lt;br /&gt;&lt;u&gt;&lt;b&gt;기약분수가 적용된 분모&lt;/b&gt;&lt;/u&gt;의 형태를 띄게 됩니다. (result)&lt;br /&gt;&lt;br /&gt;그 이후는 문제에서 준 힌트와 동일합니다.&lt;br /&gt;분모를 소인수 분해한 뒤, 2 또는 5 이외의 소인수가 나오는지 체크하는 과정입니다.&lt;br /&gt;만약 하나라도 2 또는 5가 아니라면 &lt;u&gt;&lt;b&gt;무한 소수&lt;/b&gt;&lt;/u&gt;입니다.&lt;br /&gt;&lt;br /&gt;for문에서 return되지 않고 끝까지 간다면?&lt;br /&gt;유한소수이기 때문에 1을 return해주면 됩니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. 마무리&lt;/b&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;개인적인 생각이지만,&lt;br /&gt;이런 종류의 문제는 암기하고 많이 익숙해지는게 정답인 듯 합니다.&lt;br /&gt;유클리드 호제법과 소인수분해를 알아야 수월하게 풀 수 있습니다.&lt;br /&gt;&lt;br /&gt;어떻게 보면 마냥 모니터 앞에서 고민하는게 정답이 아닐 수도 있습니다.&lt;br /&gt;사전 지식이 잘 탑재되어 있으면 쉽게 해결될 문제가 많습니다.&lt;br /&gt;다만 차이가 있다면.. 힘들게 푼 문제가 기억에 오래 남는다 정도?&lt;br /&gt;(그냥 여러 번 풀고 익히는게 더 기억에 오래 남을수도 있습니다)&lt;br /&gt;&lt;br /&gt;그러니 알고리즘 문제를 풀다가 너무 답이 안나오면&lt;br /&gt;해답을 보는 것도 괜찮은 방법입니다 :)&lt;br /&gt;오늘은 이만 마치겠습니다. 수고하셨습니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/알고리즘 문제풀이</category>
      <category>소인수분해</category>
      <category>유클리드 호제법</category>
      <category>유한소수 판별하기</category>
      <category>프로그래머스 유한소수 은공지능</category>
      <category>프로그래머스 유한소수 판별하기</category>
      <author>pychan</author>
      <guid isPermaLink="true">https://chan-lab.tistory.com/34</guid>
      <comments>https://chan-lab.tistory.com/34#entry34comment</comments>
      <pubDate>Tue, 29 Nov 2022 21:57:16 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] 햄버거 만들기 파이썬 알고리즘 문제 풀이</title>
      <link>https://chan-lab.tistory.com/33</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;587&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dseagz/btrShB2JYwX/SKF3MQW5rLLMwyHmKBysyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dseagz/btrShB2JYwX/SKF3MQW5rLLMwyHmKBysyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dseagz/btrShB2JYwX/SKF3MQW5rLLMwyHmKBysyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdseagz%2FbtrShB2JYwX%2FSKF3MQW5rLLMwyHmKBysyK%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;1196&quot; height=&quot;587&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;587&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;안녕하세요. 은공지능 공작소의 파이찬입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;오늘 풀어볼 문제는&lt;b&gt; &lt;/b&gt;&lt;u&gt;&lt;b&gt;&quot;햄버거 만들기&quot;&lt;/b&gt;&lt;/u&gt; 라는 문제입니다.&lt;br /&gt;&lt;br /&gt;고민해 볼 포인트가 많은 문제인데요,&lt;br /&gt;&lt;u&gt;리스트의 일부를 효율적으로 제거&lt;/u&gt;하는 방법이 중요합니다.&lt;br /&gt;이에 대해서 중점적으로 설명드리겠습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;해당 문제 바로가기 &amp;darr;&amp;darr;&amp;darr; 아래 링크 클릭&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/133502&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/133502&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1669642319149&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/133502&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/uRmfM/hyQJJSPNR5/0VBZZf46IbjmlX8XpDE9J1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/vf0Ng/hyQJuuBXzx/PdTvqlvrZKm2ZUGtUBGEf0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/133502&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/133502&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/uRmfM/hyQJJSPNR5/0VBZZf46IbjmlX8XpDE9J1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/vf0Ng/hyQJuuBXzx/PdTvqlvrZKm2ZUGtUBGEf0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1. 정답 공개&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;바로 정답 공개하도록 하겠습니다.&lt;br /&gt;그 이후에 시간초과가 걸리는 코드와 정답으로 통과한 코드를 비교해 보겠습니다.&lt;br /&gt;먼저, 사람들이 가장 많이 채택한 정답입니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1669642688940&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(ingredient):
    s = []
    cnt = 0
    for i in ingredient:
        s.append(i)
        if s[-4:] == [1, 2, 3, 1]:
            cnt += 1
            for _ in range(4):
                s.pop()
    return cnt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;다음으로 &lt;b&gt;시간초과&lt;/b&gt;로 통과할 수 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;없는&lt;/span&gt;&lt;/b&gt; 코드를 보여드리겠습니다.&lt;br /&gt;위의 코드와 동일하나, 딱 &lt;u&gt;한 줄&lt;/u&gt;이 다릅니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1669642912142&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(ingredient):
    s = []
    cnt = 0
    for i in ingredient:
        s.append(i)
        if s[-4:] == [1, 2, 3, 1]:
            cnt += 1
            s = s[:-4] # 해당 부분으로 인해 시간 초과 발생
    return cnt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2. Pop() 함수에 대한 이해&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1669643449277&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;input_list = [1, 2, 3, 1]
input_list.pop()
print(input_list)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1669643472991&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output
------------------------------------
[1, 2, 3]&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;.pop() 함수를 통해 &lt;u&gt;&lt;b&gt;리스트의 일부 요소를 제거&lt;/b&gt;&lt;/u&gt;할 수 있습니다.&lt;br /&gt;[리스트 데이터]&lt;b&gt;.pop()&lt;/b&gt;을 사용하게 되면, 해당 리스트의 맨 마지막 요소가 제거됩니다.&lt;br /&gt;이 때, 별도 변수에 리스트를 다시 할당할 필요가 없습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1669643623362&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;input_list = [1, 2, 3, 1]
input_list.pop(0)
print(input_list)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1669643638830&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output
------------------------------------
[2, 3, 1]&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;pop() 함수 안에 파라미터를 지정할 수도 있습니다.&lt;br /&gt;pop 함수 안에 &lt;u&gt;&lt;b&gt;제거하고 싶은 리스트 요소의 인덱스 번호&lt;/b&gt;&lt;/u&gt;를 넣어주면,&lt;br /&gt;리스트의 해당 요소만 제거됩니다.&lt;br /&gt;&lt;br /&gt;위의 예시에서 pop안에 0이라고 했기 때문에,&lt;br /&gt;리스트의 0번 index인 1이 제거되었습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1669643855029&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;input_list = [1, 2, 3, 1]
a = input_list.pop(0)
print(input_list)
print('a:', a)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1669643910523&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output
---------------------------------------
[2, 3, 1]
a: 1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;리스트에서 튀어나온(pop) 녀석을 &lt;u&gt;&lt;b&gt;변수에 할당&lt;/b&gt;&lt;/u&gt;할 수도 있습니다.&lt;br /&gt;위의 코드에서 튀어나온 녀석을 a라는 변수에 할당했는데요,&lt;br /&gt;그래서 a의 값은 1이 됩니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1669645595061&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(ingredient):
    s = []
    cnt = 0
    for i in ingredient:
        s.append(i)
        if s[-4:] == [1, 2, 3, 1]:
            cnt += 1
            for _ in range(4):
                s.pop()
    return cnt&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;다시 정답 코드로 돌아가 봅시다.&lt;br /&gt;리스트의 마지막 4요소가 [1, 2, 3, 1] 이면, pop함수가 4번 실행되는 구조입니다.&lt;br /&gt;따로 pop 함수에 인덱스를 지정해주지 않았기 때문에,&lt;br /&gt;&lt;u&gt;&lt;b&gt;자동으로 마지막 요소가 4번 튀어나가&lt;/b&gt;&lt;/u&gt; 제거되는 원리입니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;3. 다른 풀이 (del 이용)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;del 함수를 이용하여 &lt;u&gt;&lt;b&gt;리스트의 일부를 강제로 지울 수도&lt;/b&gt;&lt;/u&gt; 있습니다.&lt;br /&gt;시간은 실행할 때마다 달라져서, 비교가 어렵네요...&lt;br /&gt;pop 보다 del을 이용하는게 더 코드가 짧습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1669645546831&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(ingredient):
    s = []
    cnt = 0
    for i in ingredient:
        s.append(i)
        if s[-4:] == [1, 2, 3, 1]:
            cnt += 1
            del s[-4:]
    return cnt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;4. 마무리&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;오늘 문제에서 가장 중요한 포인트는&lt;br /&gt;&lt;u&gt;리스트에서 특정 요소를 제거하는 방법&lt;/u&gt;입니다.&lt;br /&gt;&lt;br /&gt;리스트 슬라이싱을 사용하지 않고&lt;br /&gt;&lt;u&gt;&lt;b&gt;pop&lt;/b&gt;&lt;/u&gt;이나 &lt;u&gt;&lt;b&gt;del&lt;/b&gt;&lt;/u&gt;을 이용하여 제거하는 방법을 익혀두시길 바랍니다.&lt;br /&gt;&lt;br /&gt;도움이 되셨다면 하단의 하트 한 번씩 부탁드립니다!&lt;br /&gt;감사합니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/알고리즘 문제풀이</category>
      <category>은공지능 햄버거</category>
      <category>프로그래머스 알고리즘</category>
      <category>프로그래머스 햄버거 만들기</category>
      <category>햄버거 만들기</category>
      <category>햄버거 만들기 파이썬 문제풀이</category>
      <category>햄퍼거 만들기 파이썬</category>
      <author>pychan</author>
      <guid isPermaLink="true">https://chan-lab.tistory.com/33</guid>
      <comments>https://chan-lab.tistory.com/33#entry33comment</comments>
      <pubDate>Mon, 28 Nov 2022 23:27:15 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] 문자열을 정수로 바꾸기 Python 풀이법</title>
      <link>https://chan-lab.tistory.com/32</link>
      <description>
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1013&quot; data-origin-height=&quot;758&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yUUhp/btrRTs4pl3C/TjyoL0P4LPyziNvykcof5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yUUhp/btrRTs4pl3C/TjyoL0P4LPyziNvykcof5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yUUhp/btrRTs4pl3C/TjyoL0P4LPyziNvykcof5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyUUhp%2FbtrRTs4pl3C%2FTjyoL0P4LPyziNvykcof5k%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;1013&quot; height=&quot;758&quot; data-origin-width=&quot;1013&quot; data-origin-height=&quot;758&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;안녕하세요. 은공지능 공작소의 파이찬입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;&quot;&gt;오늘은 프로그래머스의 &quot;&lt;u&gt;문자열을 정수로 바꾸기&lt;/u&gt;&quot; 문제 풀어보도록 하겠습니다.&lt;br /&gt;문제가 중간에 바뀌었다고 하는데.. 정말 쉽게 해결이 가능합니다!&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;사이트 문제 바로 가기 &amp;darr;&amp;darr;&amp;darr;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12925&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/12925&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1669110500349&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12925&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/26rvx/hyQFfyhqI4/1EcGVwpc1YqV7zMo68IJck/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/vJuQZ/hyQE26Kfnl/orzU3TnjzNUvWK8wKJgRp1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12925&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12925&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/26rvx/hyQFfyhqI4/1EcGVwpc1YqV7zMo68IJck/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/vJuQZ/hyQE26Kfnl/orzU3TnjzNUvWK8wKJgRp1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;바로 해답 공개!&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1669110562502&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(s):
    return int(s)&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;int 함수를 이용하여 바로 해결하였습니다.&lt;br /&gt;&lt;u&gt;만약 숫자가 아닌 문자열&lt;/u&gt;도 함께 있었다면, 조금 까다로운 문제였을지도 모르겠습니다...&lt;br /&gt;&lt;br /&gt;(+)&lt;br /&gt;isdigit, isnumeric 함수는 음수(-)인 정수에 대하여 필터링이 안 됩니다.&lt;br /&gt;문자열 자료 중에서 음수인 정수를 필터링 할 때는 &lt;i&gt;&lt;b&gt;int 함수&lt;/b&gt;&lt;/i&gt;가 유용할 것입니다.&lt;br /&gt;&lt;br /&gt;오늘은 짧게 마치겠습니다.&lt;br /&gt;감사합니다.&lt;/span&gt;&lt;/blockquote&gt;</description>
      <category>Python/알고리즘 문제풀이</category>
      <category>문자열을 정수형으로</category>
      <category>문자열을 정수형으로 파이썬</category>
      <category>은공지능 공작소 프로그래머스</category>
      <category>은공지능공작소 문자열을 정수형으로</category>
      <category>프로그래머스</category>
      <category>프로그래머스 문자열을 정수형으로 파이썬</category>
      <category>프로그래머스 은공지능 문제풀이</category>
      <author>pychan</author>
      <guid isPermaLink="true">https://chan-lab.tistory.com/32</guid>
      <comments>https://chan-lab.tistory.com/32#entry32comment</comments>
      <pubDate>Tue, 22 Nov 2022 18:54:18 +0900</pubDate>
    </item>
    <item>
      <title>[딥러닝/용어] Downstream task 개념 정리</title>
      <link>https://chan-lab.tistory.com/31</link>
      <description>
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;crocodile-river-ge0de8f8a9_1280.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;853&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIhMCU/btrRzRSseZ8/A4ksC5NqUUa7gfjKq36fu1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIhMCU/btrRzRSseZ8/A4ksC5NqUUa7gfjKq36fu1/img.jpg&quot; data-alt=&quot;Image by Lynn Greyling (pixabay)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIhMCU/btrRzRSseZ8/A4ksC5NqUUa7gfjKq36fu1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIhMCU%2FbtrRzRSseZ8%2FA4ksC5NqUUa7gfjKq36fu1%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;1280&quot; height=&quot;853&quot; data-filename=&quot;crocodile-river-ge0de8f8a9_1280.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;853&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Image by Lynn Greyling (pixabay)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;&quot;&gt;&lt;b&gt;Downsteam task란?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;최종적으로 해결하고자 하는 작업&lt;/b&gt;&lt;/u&gt;을 의미합니다.&lt;br /&gt;Downstream이라는 말은 영어 그대로 직역 하면 '&lt;u&gt;&lt;b&gt;하류(下流)&lt;/b&gt;&lt;/u&gt;' 입니다.&lt;br /&gt;&lt;br /&gt;물은 위에서 흘러 아래로 흘러갑니다.&lt;br /&gt;즉, 상류(Upstream)에서 하류(downstream)로 흘러가는 순서가 존재합니다.&lt;br /&gt;&lt;br /&gt;우리가 하는 작업에도 순서가 있는데, 먼저 해결해야 할 작업을 &lt;u&gt;&lt;b&gt;Upsteam&amp;nbsp;task&lt;/b&gt;&lt;/u&gt;라&amp;nbsp;부르고 &lt;br /&gt;다음에 최종적으로 해결하고자 하는 작업을 &lt;u&gt;&lt;b&gt;Downstream task&lt;/b&gt;&lt;/u&gt;라고 합니다.&lt;br /&gt;그렇다면 딥러닝에서의 Downstream task은 무엇을 의미할까요?&lt;br /&gt;이는 &lt;u&gt;&lt;b&gt;전이학습 (Transfer Leanring)&lt;/b&gt;&lt;/u&gt;과 깊은 관련이 있습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;1690&quot; data-origin-height=&quot;1128&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/13lFr/btrRzknj184/5U7jOb6YGUqTw6N0Nm0hu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/13lFr/btrRzknj184/5U7jOb6YGUqTw6N0Nm0hu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/13lFr/btrRzknj184/5U7jOb6YGUqTw6N0Nm0hu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F13lFr%2FbtrRzknj184%2F5U7jOb6YGUqTw6N0Nm0hu1%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;1690&quot; height=&quot;1128&quot; data-origin-width=&quot;1690&quot; data-origin-height=&quot;1128&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;전이학습(Transfer learing)&lt;/b&gt;&lt;/u&gt; 이란,&lt;br /&gt;모델을 처음부터 끝까지 (from scratch) 새로 훈련하는 것이 아니라,&lt;br /&gt;미리 훈련된 (pre-trained) 모델로부터 학습을 시작하는 것을 의미합니다.&lt;br /&gt;&lt;br /&gt;이를 up/down stream의 개념에 비유해보면,&lt;br /&gt;&lt;b&gt;upstream&lt;/b&gt;은 미리 훈련된 &lt;b&gt;pre-trained model&lt;/b&gt;이 될 것이고,&lt;br /&gt;&lt;b&gt;downstream&lt;/b&gt;은 내가 최종적으로 만들고자 하는 모델이 될 것입니다.&lt;br /&gt;&lt;br /&gt;마치 직장에서 후배가 선배의 보고서를 참조하는 것과 유사한데요,&lt;br /&gt;선배가 보고서가 좋은 보고서라면 (good upstream),&lt;br /&gt;후배가 보고서를 쓰기 훨씬 수월할 것입니다. (good down stream)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1690&quot; data-origin-height=&quot;576&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBwcAu/btrRBa4LVts/I0BBVvk7KO1OtSY4L5uGBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBwcAu/btrRBa4LVts/I0BBVvk7KO1OtSY4L5uGBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBwcAu/btrRBa4LVts/I0BBVvk7KO1OtSY4L5uGBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBwcAu%2FbtrRBa4LVts%2FI0BBVvk7KO1OtSY4L5uGBk%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;1690&quot; height=&quot;576&quot; data-origin-width=&quot;1690&quot; data-origin-height=&quot;576&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;늑대와 호랑이를 분류하는 &lt;u&gt;&lt;b&gt;Downstream task&lt;/b&gt;&lt;/u&gt;를 생각해 볼까요?&lt;br /&gt;개와 고양이를 분류하는 모델이 이미 학습되었다면,&lt;br /&gt;이를 늑대와 호랑이를 분류하는 모델에 활용할 수 있을 것입니다.&lt;br /&gt;늑대와 개 / 호랑이와 고양이는 서로 비슷한 특징을 가지고 있기 때문입니다!&lt;br /&gt;&lt;br /&gt;딥러닝 분야에서 downstream이라는 말은 다양한 분야에서 쓰입니다.&lt;br /&gt;자연어처리(NLP), 이미지 분류(image classification)등&lt;br /&gt;많은 포스팅과 논문에서 Downstream이라는 단어가 등장합니다.&lt;br /&gt;&lt;br /&gt;하지만 분야에 상관없이 모두&lt;br /&gt;'내가 최종적으로 해결하고 싶은 문제', &lt;br /&gt;'upstream을 거쳐 단계적으로 해결하는 것이 보다 좋은 문제'라는 점에서는 일맥상통하는 것 같습니다.&lt;br /&gt;&lt;br /&gt;포스팅이 도움이 되셨다면, 하단의 하트와 댓글 하나씩 부탁드리겠습니다!&lt;br /&gt;감사합니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>딥러닝 공부/셀프 스터디</category>
      <category>Down stream task</category>
      <category>Downstream</category>
      <category>Downstream tasks</category>
      <category>pretrained-model</category>
      <category>Transfer Learning</category>
      <category>다운스트림 작업</category>
      <category>딥러닝 다운스트림</category>
      <category>딥러닝 다운스트림?</category>
      <author>pychan</author>
      <guid isPermaLink="true">https://chan-lab.tistory.com/31</guid>
      <comments>https://chan-lab.tistory.com/31#entry31comment</comments>
      <pubDate>Sat, 19 Nov 2022 18:48:28 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] 컨트롤제트 알고리즘 문제풀이</title>
      <link>https://chan-lab.tistory.com/30</link>
      <description>
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;673&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nwNps/btrRmT3TwjA/iYuCY8bF7AQuowGF8H9ArK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nwNps/btrRmT3TwjA/iYuCY8bF7AQuowGF8H9ArK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nwNps/btrRmT3TwjA/iYuCY8bF7AQuowGF8H9ArK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnwNps%2FbtrRmT3TwjA%2FiYuCY8bF7AQuowGF8H9ArK%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;1196&quot; height=&quot;673&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;673&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;안녕하세요. 은공지능 공작소의 파이찬입니다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;프로그래머스의 lv.0 컨트롤제트 문제 풀어보도록 하겠습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;문제 바로가기 &amp;darr;&amp;darr;&amp;darr; 하단 링크 클릭&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/120853&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/120853&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1668588212695&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/120853&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b0FhMh/hyQA18hegD/kLY3E9EebR8u1SI9ZCZ0c1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/chiSzV/hyQBgK8c7Q/rGjKF50vXwAHmQPMiCldB0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/120853&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/120853&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b0FhMh/hyQA18hegD/kLY3E9EebR8u1SI9ZCZ0c1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/chiSzV/hyQBgK8c7Q/rGjKF50vXwAHmQPMiCldB0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1. 스택 자료 구조 이해하기&lt;/span&gt;&lt;/b&gt;&lt;/h2&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;2000&quot; data-origin-height=&quot;1125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcpTbU/btrRmvozoh8/VHJYP5KSEcKm7ndWJCdni1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcpTbU/btrRmvozoh8/VHJYP5KSEcKm7ndWJCdni1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcpTbU/btrRmvozoh8/VHJYP5KSEcKm7ndWJCdni1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcpTbU%2FbtrRmvozoh8%2FVHJYP5KSEcKm7ndWJCdni1%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;2000&quot; height=&quot;1125&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1125&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;u&gt;&lt;b&gt;스택(stack)&lt;/b&gt;&lt;/u&gt; 이란, 나중에 들어간 것이 먼저 나오는 (LIFO) 자료구조를 말합니다.&lt;br /&gt;문제 풀이법은 다양하지만, 저는 &lt;b&gt;Stack&lt;/b&gt;을 이용하여 해당 문제를 풀었습니다.&lt;br /&gt;자료구조를 이해하는 것은 알고리즘 문제풀이에 많은 도움이 됩니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2. 입력값을 숫자와 문자로 구분하기&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1668592718047&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;input_data = &quot;1 2 Z 3&quot;
print('input:', input_data.split())
print()

for data in input_data.split():
    print(data)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1668592760323&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output
-------------------------------
input: ['1', '2', 'Z', '3']

1
2
Z
3&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;먼저 입력 데이터를 살펴봅시다.&lt;br /&gt;위와 같이 &lt;u&gt;&lt;b&gt;split()함수&lt;/b&gt;&lt;/u&gt;를 이용하면, 공백으로 구분된 문자열을 리스트에 이쁘게 담아줍니다.&lt;br /&gt;출력을 해보면 위와 같이 프린트가 됩니다.&lt;br /&gt;&lt;br /&gt;이제 값들을 숫자와 숫자가 아닌 것으로 구분해줘야 합니다.&lt;br /&gt;그 전에 &lt;u&gt;&lt;b&gt;data의 값이 음수가 올 수도 있다&lt;/b&gt;&lt;/u&gt;는 사실에 주목해야 합니다.&lt;br /&gt;보통 문자열 데이터에서 숫자를 구분하기 위해 isdigit(), isnumeric() 함수를 많이 사용하는데,&lt;br /&gt;&lt;b&gt;이 함수들은 음수값들을 필터링하지 못 합니다.&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;조건문에 문자열 'Z'만 따로 구분하는 방법도 있겠지만,&lt;br /&gt;저는 좀 더 pythonic한 방법을 사용해보려 합니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1668593385637&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;input_data = &quot;1 -2 Z 3&quot;

for data in input_data.split():
    try:
        num = int(data)
        print('num:', num)
    except:
        print('str:', data)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1668593412085&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output
--------------------------------
num: 1
num: -2
str: Z
num: 3&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;try ~ except 구문을 이용하였고, 음수에도 동작한다는 것을 보여드리기 위해&lt;br /&gt;두 번째 입력값을 2 -&amp;gt; -2로 바꾸었습니다.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;try ~ except&lt;/u&gt;는 파이썬에서 &lt;u&gt;&lt;b&gt;예외처리&lt;/b&gt;&lt;/u&gt;를 하기 위해 쓰이는 문법입니다.&lt;br /&gt;try 쪽을 먼저 시도해보고, 에러가 안 난다면 그대로 excpet를 건너뛰고 통과합니다.&lt;br /&gt;만약 try 쪽에서 에러가 난다면, except 쪽으로 빠지게 되는 구조입니다.&lt;br /&gt;&lt;br /&gt;위의 코드에서 문자열 'Z'에 int 함수를 씌우려 하니 에러가 발생합니다. &lt;br /&gt;(Exception: invalid literal for int() with base 10: 'Z')&lt;br /&gt;그래서 except 구문이 실행이 되는 원리 입니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. Stack 활용하여 자료 넣고 꺼내기&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1668594138927&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;input_data = &quot;1 -2 Z 3&quot;

stack = []
for data in input_data.split():
    try:
        num = int(data)
        stack.append(num)
    except:
        if stack:
            pop_data = stack.pop()
            
    print('stack:', stack)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1668594227373&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output
------------------------
stack: [1]
stack: [1, -2]
stack: [1]
stack: [1, 3]&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Python &lt;b&gt;List&lt;/b&gt; 자료구조를 &lt;b&gt;Stack&lt;/b&gt;처럼 활용하였습니다.&lt;br /&gt;데이터가 숫자라면 차례대로 stack에 &lt;u&gt;&lt;b&gt;append&lt;/b&gt;&lt;/u&gt; 함수를 이용하여 쌓아줍니다.&lt;br /&gt;데이터 'Z'가 들어오면 stack에서 &lt;u&gt;&lt;b&gt;pop&lt;/b&gt;&lt;/u&gt; 함수를 이용하여, 마지막 것 부터 꺼냅니다.&lt;br /&gt;(pop 함수는 리스트의 맨 뒤 요소를 뽑아내는 기능 수행)&lt;br /&gt;&lt;br /&gt;&lt;u&gt;(+) if stack 부분 설명:&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;stack에 데이터가 있으면 실행&lt;/b&gt;&lt;/u&gt;한다는 뜻 입니다.&lt;br /&gt;stack이 비어있으면 if문이 실행되지 않습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;2000&quot; data-origin-height=&quot;1125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vaC5A/btrRnJNkKdI/ORJduKu79lY4cQUmVkazk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vaC5A/btrRnJNkKdI/ORJduKu79lY4cQUmVkazk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vaC5A/btrRnJNkKdI/ORJduKu79lY4cQUmVkazk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvaC5A%2FbtrRnJNkKdI%2FORJduKu79lY4cQUmVkazk1%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;2000&quot; height=&quot;1125&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1125&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;코드가 실행되는 것을 슬라이드로 표현해 보았습니다.&lt;br /&gt;코드의 output을 이해하시는데 도움이 될 것입니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;4. 최종 결과 값 계산하기&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;result라는 변수를 하나 만들고&lt;br /&gt;결과들을 하나씩 더해주거나 빼주도록 하겠습니다.&lt;br /&gt;&lt;br /&gt;숫자가 나온다면? -&amp;gt; result에 차례로 더해주고 &lt;b&gt;stack에 쌓으면&lt;/b&gt; 됩니다.&lt;br /&gt;'Z'가 나온다면? -&amp;gt; &lt;b&gt;stack에서 하나를 pop&lt;/b&gt;한 후, result에서 빼주면 됩니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1668595614413&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;input_data = &quot;1 -2 Z 3&quot;

stack = []
result = 0
for data in input_data.split():
    try:
        num = int(data)
        result += num
        stack.append(num)
    except:
        if stack:
            pop_data = stack.pop()
            result -= pop_data

    print('result:', result)
    
print('--------------')
print('result2:', sum(stack))&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1668595645563&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output
---------------------------------------
result: 1
result: -1
result: 1
result: 4
--------------
result2: 4&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;result 결과값은 &lt;u&gt;&lt;b&gt;최종적으로 4&lt;/b&gt;&lt;/u&gt;가 됩니다.&lt;br /&gt;이는 stack에 남아있는 숫자들을 모두 더한 값과 동일합니다. (result2: 4)&lt;br /&gt;저도 나중에 알았네요 ㅋㅋ result 변수를 안 써도 될 듯 합니다.&lt;br /&gt;최종 풀이는 해당 방법으로 교체하고 result 변수 부분들을 삭제하도록 하겠습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;5. 프로그래머스 제출용 정답 및 핵심정리&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1668596030034&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(s):
    stack = []
    for num in s.split():
        try:
            stack.append(int(num))
        except:
            if stack:
                stack.pop()
    return sum(stack)&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;★핵심 정리&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;★&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1. Stack 자료구조 이해 (python list 이용)&lt;br /&gt;2. 음수값 처리 방법 -&amp;gt; python &lt;u&gt;&lt;b&gt;try ~ except 구문&lt;/b&gt;&lt;/u&gt; 이용&lt;br /&gt;3. append와 pop의 용법 이해하기&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDdDEd/btrRnpPjyQ8/yj6feiMEwsm0U3H0wVixM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDdDEd/btrRnpPjyQ8/yj6feiMEwsm0U3H0wVixM0/img.png&quot; data-alt=&quot;22.11.16 판교제2테크노밸리의 소나무가 참 멋있다!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDdDEd/btrRnpPjyQ8/yj6feiMEwsm0U3H0wVixM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDdDEd%2FbtrRnpPjyQ8%2Fyj6feiMEwsm0U3H0wVixM0%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;1440&quot; height=&quot;1080&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;22.11.16 판교제2테크노밸리의 소나무가 참 멋있다!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이상 포스팅을 마치겠습니다!&lt;br /&gt;하트 한번씩 눌러주세요~!&lt;br /&gt;감사합니다.&lt;/span&gt;&lt;/blockquote&gt;</description>
      <category>Python/알고리즘 문제풀이</category>
      <category>은공지능 공작소 파이썬</category>
      <category>은공지능 컨트롤제트</category>
      <category>컨트롤제트 파이썬</category>
      <category>파이썬 알고리즘</category>
      <category>프로그래머스</category>
      <category>프로그래머스 컨트롤제트</category>
      <category>프로그래머스 파이썬</category>
      <author>pychan</author>
      <guid isPermaLink="true">https://chan-lab.tistory.com/30</guid>
      <comments>https://chan-lab.tistory.com/30#entry30comment</comments>
      <pubDate>Thu, 17 Nov 2022 18:06:36 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] 로그인 성공? 알고리즘 문제풀이</title>
      <link>https://chan-lab.tistory.com/29</link>
      <description>
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;673&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgrJXn/btrRoxZmc9P/LsbHi1lXeTWs62UJs0fhFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgrJXn/btrRoxZmc9P/LsbHi1lXeTWs62UJs0fhFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgrJXn/btrRoxZmc9P/LsbHi1lXeTWs62UJs0fhFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgrJXn%2FbtrRoxZmc9P%2FLsbHi1lXeTWs62UJs0fhFk%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;1196&quot; height=&quot;673&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;673&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;안녕하세요. 은공지능 공작소의 파이찬입니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;오늘부터 프로그래머스 파이썬 알고리즘 문제풀이를 하나씩 올려보려고 합니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;거의 2년 반 만의 포스팅이네요... 이전 회사에서 너무 바쁜 나날들을 보냈습니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;오늘 풀어볼 문제는&lt;u&gt;&lt;b&gt; &quot;로그인 성공?&quot;&lt;/b&gt;&lt;/u&gt; 이라는 문제입니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;문제 바로가기 &amp;darr; 하단 링크 클릭&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/120883&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/120883&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1668478616271&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/120883&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b9Hs67/hyQBeehqhZ/MJsQBaSYPafhdP7QgD7ORK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/hZlOz/hyQA3RmqFR/CB05nqfkO15ovQ7V5XPkkK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/120883&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/120883&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b9Hs67/hyQBeehqhZ/MJsQBaSYPafhdP7QgD7ORK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/hZlOz/hyQA3RmqFR/CB05nqfkO15ovQ7V5XPkkK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1. for문을 이용하여 input parameter 하나씩 살펴보기&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1668414881404&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(id_pw, db):
    for id, pw in db:
        print(id, pw)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1668415092654&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output
----------------------------
rardss 123
yyoom 1234
meosseugi 1234&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;아이디와 비밀번호가 각각 for문의 &lt;b&gt;id&lt;/b&gt;, &lt;b&gt;pw&lt;/b&gt;라는 변수에 담겼습니다.&lt;br /&gt;먼저 db에 담긴 내용을 살펴보겠습니다.&lt;br /&gt;현재 test case1에 대해서만 출력을 해보았는데, 결과는 위와 같습니다.&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2. if 문으로 분기 나누기&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그 다음으로 생각해 봐야 하는 것은 if 문으로 분기를 나누는 것입니다.&lt;br /&gt;id와 pw를 비교해야 하는데, &lt;u&gt;&lt;b&gt;어떤 것을 더 상위의 if문으로 둘 것인지&lt;/b&gt;&lt;/u&gt; 생각해봐야 합니다.&lt;br /&gt;&lt;br /&gt;만약 id가 일치하는 회원이 없다면?&lt;br /&gt;그냥 &lt;u&gt;&quot;fail&quot;&lt;/u&gt;을 return해주고 종료하면 됩니다.&lt;br /&gt;id가 틀렸는데 pw를 굳이 또 체크할 필요가 있을까요? 그럴 필요는 없습니다 ㅎㅎ&lt;br /&gt;&lt;br /&gt;id가 일치하는 회원이 있다면, 여기서 또 분기를 2개로 나눠야 합니다.&lt;br /&gt;① pw가 일치할 경우 -&amp;gt; &lt;u&gt;&quot;login&quot;&lt;/u&gt;을 return&lt;br /&gt;② pw가 일치하지 않을 경우 -&amp;gt; &lt;u&gt;&quot;wrong pw&quot;&lt;/u&gt;를 return&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1668416164336&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(id_pw, db):
    for id, pw in db:
        if id_pw[0] == id:
            if id_pw[1] == pw:
                return &quot;login&quot;
            else:
                return &quot;wrong pw&quot;
    return &quot;fail&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;★ 체크포인트① ★&lt;/b&gt;&lt;br /&gt;&lt;u&gt;list indexing을 이용한 id_pw 접근&lt;/u&gt;&lt;br /&gt;id_pw는 대괄호로 묶여있는 자료구조로, 이러한 것을 python에선 list라고 부릅니다.&lt;br /&gt;list의 각 요소에 접근하기 위한 방법을 indexing이라고 부르는데요,&lt;br /&gt;대괄호 안의 숫자로 각 요소에 접근할 수 있습니다. (ex- id_pw[0])&lt;br /&gt;&lt;br /&gt;+ Python index의 시작 번호는 1번 부터가 아닌 &lt;b&gt;0번&lt;/b&gt; 부터입니다.&lt;br /&gt;그러므로 id_pw[0]이라고 하는 것은, &lt;u&gt;&lt;b&gt;리스트의 첫 번째 요소&lt;/b&gt;&lt;/u&gt;에 접근한다는 뜻 입니다.&lt;/blockquote&gt;
&lt;pre id=&quot;code_1668416542913&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;id_pw = [&quot;meosseugi&quot;, &quot;1234&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;현재 id_pw라는 리스트는 위와 같이 구성되어 있습니다.&lt;br /&gt;그러므로 id_pw[0]을 사용하면, &lt;u&gt;&lt;b&gt;&quot;meosseugi&quot;&lt;/b&gt;&lt;/u&gt;라는 id값에 접근하게 됩니다.&lt;br /&gt;마찬가지 원리로 id_pw[1]는 리스트의 두 번째 요소를 가리키며,&lt;br /&gt;&lt;u&gt;&lt;b&gt;&quot;1234&quot;&lt;/b&gt;&lt;/u&gt;라는 값을 반환합니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1668416767942&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(id_pw, db):
    for id, pw in db:
        if id_pw[0] == id:
            if id_pw[1] == pw:
                return &quot;login&quot;
            else:
                return &quot;wrong pw&quot;
    return &quot;fail&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;★ 체크포인트② ★&lt;/b&gt;&lt;br /&gt;&lt;u&gt;return 명령어를 활용한 함수 즉시 종료&lt;/u&gt;&lt;br /&gt;return 명령어는 함수를 즉시 종료합니다.&lt;br /&gt;해당 함수는 &lt;u&gt;&lt;b&gt;solution&lt;/b&gt;&lt;/u&gt;이라는 이름을 갖고 있습니다.&lt;br /&gt;&lt;br /&gt;그러므로 위 코드를 풀이해보면,&lt;br /&gt;하나라도 id와 pw가 맞는 경우가 있다면 바로 &lt;u&gt;&lt;b&gt;&quot;login&quot;&lt;/b&gt;&lt;/u&gt;을 return하고&lt;br /&gt;함수가 종료된다는 뜻입니다.&lt;br /&gt;&lt;br /&gt;만약 for문이 종료될 동안 하나도 if문에 걸리는게 없다면 어떨까요?&lt;br /&gt;맨 마지막 구문인 &lt;u&gt;&lt;b&gt;return &quot;fail&quot;&lt;/b&gt;&lt;/u&gt;까지 도달하게 됩니다.&lt;br /&gt;이 경우, 입력한 id와 일치하는 것이 db에 없다는 말이 되겠습니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;3. 핵심 정리&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;해당 문제를 풀기위해 필요한 개념입니다.&lt;br /&gt;&lt;br /&gt;ⓐ 자료구조&lt;u&gt;&lt;b&gt; list&lt;/b&gt;&lt;/u&gt;에 대한 이해 (indexing 개념 포함)&lt;br /&gt;ⓑ &lt;u&gt;&lt;b&gt;for&lt;/b&gt;&lt;/u&gt; 반복문, &lt;br /&gt;ⓒ &lt;u&gt;&lt;b&gt;if&lt;/b&gt;&lt;/u&gt; 분기문&lt;br /&gt;+ &lt;b&gt;return&lt;/b&gt;을 활용한 함수 즉시 종료&lt;br /&gt;&lt;br /&gt;해당 문제는 파이썬의 기초을 잘 알고 계신 분이라면,&lt;br /&gt;무난하게 풀 수 있었던 문제라고 생각됩니다.&lt;br /&gt;기초를 탄탄히 다지는 것은 언제나 중요합니다!&lt;br /&gt;&lt;br /&gt;감사합니다.&lt;/span&gt;&lt;/blockquote&gt;</description>
      <category>Python/알고리즘 문제풀이</category>
      <category>로그인 성공 은공지능</category>
      <category>로그인 성공 프로그래머스</category>
      <category>로그인 성공?</category>
      <category>파이썬 기초</category>
      <category>파이썬 문제풀이</category>
      <category>파이썬 알고리즘</category>
      <category>프로그래머스</category>
      <author>pychan</author>
      <guid isPermaLink="true">https://chan-lab.tistory.com/29</guid>
      <comments>https://chan-lab.tistory.com/29#entry29comment</comments>
      <pubDate>Thu, 17 Nov 2022 18:06:16 +0900</pubDate>
    </item>
    <item>
      <title>[Python/Jupyter] TF-IDF 파라미터 알아보기 / min_idf, analyzer, sublinear_tf, ngram_range, max_features</title>
      <link>https://chan-lab.tistory.com/27</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;190918_tf-idf파라미터.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsXGu5/btqyo1sii5S/gvWCkkakaJOYJkbcxP5rdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsXGu5/btqyo1sii5S/gvWCkkakaJOYJkbcxP5rdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsXGu5/btqyo1sii5S/gvWCkkakaJOYJkbcxP5rdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsXGu5%2Fbtqyo1sii5S%2FgvWCkkakaJOYJkbcxP5rdK%2Fimg.png&quot; data-filename=&quot;190918_tf-idf파라미터.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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot; data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;안녕하세요. 은공지능 공작소의 파이찬입니다!&lt;br /&gt;정말 오랜만에 포스팅을 올리네요. 9월달은 정말 바쁘게 지낸 것 같습니다.&lt;br /&gt;오늘은 &lt;b&gt;tf-idf vectorizer&lt;/b&gt;를 생성할 때 필요한 여러가지 파라미터들에 대해 알아보겠습니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;min_idf,&amp;nbsp;analyzer,&amp;nbsp;sublinear_tf,&amp;nbsp;ngram_range,&amp;nbsp;max_features&lt;/b&gt;&lt;br /&gt;이렇게 5가지 파라미터들에 대해서 알아볼 것입니다.&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=MFUyoWu8ddw&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/behRYV/hyCTEL8LJP/9o7DCSQJr3A5WfgSQw5LZ0/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot; data-video-width=&quot;1000&quot; data-video-height=&quot;360&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/MFUyoWu8ddw&quot; width=&quot;1000&quot; height=&quot;360&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;1. 사전준비&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1568882548496&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from sklearn.feature_extraction.text import TfidfVectorizer

text = ['I go to my home my home is very large',
        'I went out my home I go to the market',
        'I bought a yellow lemon I go back to home']

tfidf_vectorizer = TfidfVectorizer()&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot;&gt;우선 위와같이 데이터를 생성해 줍니다.&lt;br /&gt;저번 시간에 썼던 데이터와 동일한 데이터 입니다.&lt;br /&gt;오늘 사용할 파라미터는 TfidfVectorizer()의 &lt;b&gt;괄호 안&lt;/b&gt;에 들어가는 것들입니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1568884129908&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tfidf_vectorizer.fit(text) # 벡터라이저가 단어들을 학습합니다.
tfidf_vectorizer.vocabulary_ # 벡터라이저가 학습한 단어사전을 출력합니다.
sorted(tfidf_vectorizer.vocabulary_.items()) # 단어사전을 정렬합니다.&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1568884180543&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output:
[('back', 0),
 ('bought', 1),
 ('go', 2),
 ('home', 3),
 ('is', 4),
 ('large', 5),
 ('lemon', 6),
 ('market', 7),
 ('my', 8),
 ('out', 9),
 ('the', 10),
 ('to', 11),
 ('very', 12),
 ('went', 13),
 ('yellow', 14)]&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot;&gt;먼저 &lt;b&gt;fit 명령어&lt;/b&gt;를 통해서 text 변수에 저장된 &lt;b&gt;데이터를 학습&lt;/b&gt;시켜줘야 합니다.&lt;br /&gt;이렇게 학습이 끝나면, 단어사전과 idf 벡터 등을 출력해볼 수 있습니다.&lt;br /&gt;단어사전은 &lt;b&gt;.vocabulary_ 명령어&lt;/b&gt;를 통해 출력이 가능합니다.&lt;br /&gt;&lt;br /&gt;저희는 출력을 이쁘게 하기 위해서 &lt;b&gt;sorted&lt;/b&gt; 명령어도 같이 사용해 보았습니다.&lt;br /&gt;sorted 명령어를 통해 살펴보니, 단어들은 &lt;b&gt;알파벳 오름차순&lt;/b&gt;으로&lt;br /&gt;인덱스가 부여된다는 사실도 알 수 있었습니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;2. min_df 파라미터 알아보기&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3sclH/btqymTWAnFf/rqpThC37HXm1juKDT0IPqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3sclH/btqymTWAnFf/rqpThC37HXm1juKDT0IPqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3sclH/btqymTWAnFf/rqpThC37HXm1juKDT0IPqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3sclH%2FbtqymTWAnFf%2FrqpThC37HXm1juKDT0IPqK%2Fimg.png&quot; width=&quot;1000&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot; data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;min-df&lt;/b&gt;는 DF(document-frequency)의 &lt;b&gt;최소 빈도값&lt;/b&gt;을 설정해주는 파라미터입니다.&lt;br /&gt;DF는 특정 단어가 나타나는 &lt;b&gt;'문서의 수'&lt;/b&gt;를 의미합니다.&lt;br /&gt;단어의 수가 아니라 &lt;b&gt;문서의 수&lt;/b&gt;라는 것에 주의해 주세요.&lt;br /&gt;&lt;br /&gt;DF 개념에 대해 위의 예시로 다시 설명을 드리자면&lt;br /&gt;단어 'home'의 경우 전체 문서에서 빈도는 4번 이지만,&lt;br /&gt;'home'이라는 &lt;b&gt;단어가 포함된 문서의 수는 3개이기 때문에 DF = 3&lt;/b&gt; 입니다.&lt;br /&gt;&lt;br /&gt;이러한 DF의 최소값을 설정하여 해당 값보다 작은 DF를 가진 단어들은&lt;br /&gt;단어사전 (vocabulary_)에서 제외하고, 인덱스를 부여하지 않습니다.&lt;br /&gt;이것이 바로 min_df 파라미터 입니다. 코드로 바로 실습해 보겠습니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1568884731636&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;min_df_vectorizer = TfidfVectorizer(min_df = 2)
min_df_vectorizer.fit(text)
sorted(min_df_vectorizer.vocabulary_.items())&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1568884746332&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output:
[('go', 0), ('home', 1), ('my', 2), ('to', 3)]&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot; data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;TfidfVectorizer&lt;/b&gt; 객체를 생성할 때, 위와 같이 &lt;b&gt;min-df&lt;/b&gt; 파라미터를 설정하였습니다.&lt;br /&gt;최소 DF가 2로 설정되었으니, 1인 것들은 모두 탈락하게 됩니다.&lt;br /&gt;(PPT 설명화면에서 회색박스 글자들은 모두 DF가 1인 것들입니다.)&lt;br /&gt;&lt;br /&gt;단어사전을 출력해보니 4개의 단어만 남았습니다.&lt;br /&gt;최소 DF를 2 이상 갖는 단어들이 단어사전에 남아있게 되는 것입니다.&lt;br /&gt;이 역시 &lt;b&gt;알파벳 오름차순&lt;/b&gt;으로 인덱스를 부여받아&lt;b&gt; 0 ~ 3 의 값&lt;/b&gt;이 할당이 되었습니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;3. analyzer 파라미터 알아보기&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot;&gt;analyzer 파라미터는 학습단위를 결정하는 파라미터입니다.&lt;br /&gt;word, char 2가지 옵션 정도를 고려해볼 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;analyzer = 'word'&lt;/b&gt;라고 설정시, 학습의 단위를 &lt;b&gt;단어&lt;/b&gt;로 설정합니다. (ex - home, go, my ...)&lt;br /&gt;&lt;b&gt;analyzer = 'char'&lt;/b&gt;라고 설정시, 학습의 단위를 &lt;b&gt;글자&lt;/b&gt;로 설정합니다.(ex - a, b, c, d ...)&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1568885285686&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vectorizer = TfidfVectorizer(analyzer = 'word')
vectorizer.fit(text)
sorted(vectorizer.vocabulary_.items())&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1568885306612&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output:
[('back', 0),
 ('bought', 1),
 ('go', 2),
 ('home', 3),
 ('is', 4),
 ('large', 5),
 ('lemon', 6),
 ('market', 7),
 ('my', 8),
 ('out', 9),
 ('the', 10),
 ('to', 11),
 ('very', 12),
 ('went', 13),
 ('yellow', 14)]&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;analyzer = 'word'&lt;/b&gt;로 파라미터를 주었을 때, 단어 사전의 모습입니다.&lt;br /&gt;기존의 결과와 크게 다르지 않은 모습을 보여줍니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1568885377658&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vectorizer = TfidfVectorizer(analyzer = 'char')
vectorizer.fit(text)
sorted(vectorizer.vocabulary_.items())&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1568885400599&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output:
[(' ', 0),
 ('a', 1),
 ('b', 2),
 ('c', 3),
 ('e', 4),
 ('g', 5),
 ('h', 6),
 ('i', 7),
 ('k', 8),
 ('l', 9),
 ('m', 10),
 ('n', 11),
 ('o', 12),
 ('r', 13),
 ('s', 14),
 ('t', 15),
 ('u', 16),
 ('v', 17),
 ('w', 18),
 ('y', 19)]&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot;&gt;analyzer = 'char'로 설정했을 때의 모습입니다.&lt;br /&gt;위의 결과물처럼 각 글자마다 인덱스가 부여된 것을 확인하실 수 있습니다.&lt;br /&gt;&lt;br /&gt;그렇다면 위와 같이 char 기반의 analyzer가 실제 모델에서&lt;br /&gt;좋은 성능을 보일지 의문이 남을 수도 있을 것 같습니다.&lt;br /&gt;&lt;br /&gt;결론부터 말씀드리면, 상당히 좋은 결과를 내놓을 수 있습니다.&lt;br /&gt;제가 &lt;b&gt;CNN 모델&lt;/b&gt;에서 char analyzer로 학습을 시킨 적이 있었는데, &lt;br /&gt;생각보다 괜찮은 결과가 나왔던 것으로 기억합니다.&lt;br /&gt;&lt;br /&gt;그러니 모델의 성능을 올리기 위해서,&lt;br /&gt;word 기반 방법만 고집할 것이 아니라 char 기반의 방법도 시도해 볼 만하다고 생각합니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;4. sublinear_tf 파라미터 알아보기&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot;&gt;sublinear_tf 파라미터는 TF (Term-Frequency, 단어빈도) &lt;b&gt;값의 &lt;br /&gt;스무딩(smoothing)&lt;/b&gt; 여부를 결정하는 파라미터 입니다. (True/False)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;TF -&amp;gt; 1 + ln(TF)&lt;/b&gt;&lt;br /&gt;위와 같은 수식을 통해 &lt;b&gt;스무딩 처리&lt;/b&gt;가 이루어집니다.&lt;br /&gt;이를 이해하기 쉽도록 간단한 예제를 하나 준비해 보았습니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1568886077717&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy as np
def sublinear_func(input):
    rst = 1 + np.log(input)
    return rst
    
sublinear_func(100)
sublinear_func(10000)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1568889255446&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output:
5.605170185988092
10.210340371976184&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot;&gt;sublinear_tf를 구현해보는 간단한 함수를 만들어 보았습니다.&lt;br /&gt;결과를 보시면 100은 5.6 정도로, 10000은 10.2 정도로 &lt;b&gt;값이 확 줄어든 것&lt;/b&gt;을 확인하실 수 있습니다.&lt;br /&gt;이처럼 sublinear_tf는 높은 TF값을 &lt;b&gt;완만하게 처리&lt;/b&gt;하는 효과를 가지고 있습니다.&lt;br /&gt;&lt;br /&gt;TF의 &lt;b&gt;아웃라이어&lt;/b&gt;가 너무 심한 데이터의 경우, &lt;br /&gt;이런 서브리니어 파라미터를 True로 바꿔주면 어느정도 효과를 기대할 수 있습니다. &lt;br /&gt;간단히 코드 실습 후 넘어가겠습니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1568889498505&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vectorizer = TfidfVectorizer(sublinear_tf = True) # defalut는 False입니다.
vectorizer.fit(text)
a = vectorizer.transform(text).toarray()
a&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1568889524525&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output:
array([[0.        , 0.        , 0.23427226, 0.39665741, 0.39665741,
        0.39665741, 0.        , 0.        , 0.51076864, 0.        ,
        0.        , 0.23427226, 0.39665741, 0.        , 0.        ],
       [0.        , 0.        , 0.24902824, 0.24902824, 0.        ,
        0.        , 0.        , 0.42164146, 0.3206692 , 0.42164146,
        0.42164146, 0.24902824, 0.        , 0.42164146, 0.        ],
       [0.44514923, 0.44514923, 0.26291231, 0.26291231, 0.        ,
        0.        , 0.44514923, 0.        , 0.        , 0.        ,
        0.        , 0.26291231, 0.        , 0.        , 0.44514923]])&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot;&gt;위와 같이 sublinear_tf를 &lt;b&gt;True&lt;/b&gt;로 설정하면, 높은 TF값들에 대해서 &lt;b&gt;스무딩 처리&lt;/b&gt;를 해줍니다.&lt;br /&gt;하지만 저희 예제 데이터는 너무 작기 때문에, 해당 파라리터의 효과가 별로 없는 것 같네요.&lt;br /&gt;&lt;b&gt;'TF 값에 대해 아웃라이어 처리&lt;/b&gt;를 해준다'라는 효과 정도만 기억하고 넘어가시면 되겠습니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;5. ngram_range 파라미터 이해하기&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot;&gt;n-gram이라는 것은 단어의 묶음을 말합니다.&lt;br /&gt;이 단어의 묶음을 범위를 설정하는 것이 &lt;b&gt;ngram_range&lt;/b&gt; 파라미터입니다.&lt;br /&gt;&lt;br /&gt;예를들어, ngram_range = (1, 1)이라면 단어의 묶음을 &lt;b&gt;1개부터 1개&lt;/b&gt;까지 설정하라는 의미입니다.&lt;br /&gt;단어사전에는 1개 단어묶음에 인덱스가 할당되겠죠.&lt;br /&gt;이는 기존의 벡터라이저와 별 차이가 없는 결과를 내놓습니다.&lt;br /&gt;&lt;br /&gt;만약 ngram_range = (1, 2)라고 한다면, 단어의 묶음을 &lt;b&gt;1개부터 2개까지&lt;/b&gt; 설정하라는 뜻입니다.&lt;br /&gt;단어사전에는 1개 단어묶음도 있고, 2개 단어묶음도 존재하게 되겠죠.&lt;br /&gt;가령, 'go home', 'very good'과 같은 &lt;b&gt;2개 짜리 묶음도 인덱스를 받게&lt;/b&gt; 되는 것입니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1568890045395&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vectorizer = TfidfVectorizer(ngram_range = (1, 1))
vectorizer.fit(text)
sorted(vectorizer.vocabulary_.items())&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1568890077491&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output:
[('back', 0),
 ('bought', 1),
 ('go', 2),
 ('home', 3),
 ('is', 4),
 ('large', 5),
 ('lemon', 6),
 ('market', 7),
 ('my', 8),
 ('out', 9),
 ('the', 10),
 ('to', 11),
 ('very', 12),
 ('went', 13),
 ('yellow', 14)]&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot;&gt;ngram_range를 (1,1)로 설정했을 때의 모습입니다.&lt;br /&gt;단어사전을 살펴보니, 기존의 벡터라이저와 별 차이가 없는 것을 볼 수 있습니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1568890185368&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vectorizer = TfidfVectorizer(ngram_range = (1, 2))
vectorizer.fit(text)
sorted(vectorizer.vocabulary_.items())&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1568890242439&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output:
[('back', 0),
 ('back to', 1),
 ('bought', 2),
 ('bought yellow', 3),
 ('go', 4),
 ('go back', 5),
 ('go to', 6),
 ('home', 7),
 ('home go', 8),
 ...&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot;&gt;이번에는 &lt;b&gt;ngram_range를 (1, 2)&lt;/b&gt;로 설정해보았습니다.&lt;br /&gt;이는 단어묶음을&lt;b&gt; 1개부터 2개&lt;/b&gt;까지로 세팅하겠다는 뜻입니다.&lt;br /&gt;단어사전을 출력해보니, 단어 2개 묶음도 인덱스를 받은 것을 볼 수 있습니다.&lt;br /&gt;&lt;br /&gt;사실 이번 포스팅은 이 ngram을 설명할고 하다가,&lt;br /&gt;아예 기본적인 파라미터들을 다 설명해기로 하고 만든 것입니다 ^^&lt;br /&gt;&lt;br /&gt;그럼 이 ngram_range를 사용하는 이유는 무엇일까요?&lt;br /&gt;&lt;b&gt;단어가 묶여야 비로소 의미를 가지는 것&lt;/b&gt;들이 있기 때문입니다.&lt;br /&gt;예를들어 'very'라는 단어 하나만으로는 의미를 잘 알 수 없지만&lt;br /&gt;&lt;b&gt;'very good', 'very bad'&lt;/b&gt; 등과 같이 뒤에 오는 단어가 같이 오면 정확한 의미를 알 수 있습니다.&lt;br /&gt;이렇게 &lt;b&gt;묶여야 의미가 살아나는 녀석들 때문에&lt;/b&gt;, ngram_range를 사용한다고 볼 수 있습니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;6. max_features 파라미터 알아보기&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot;&gt;max_feature는 tf-idf vector의 &lt;b&gt;최대 feature를 설정&lt;/b&gt;해주는 파라미터입니다.&lt;br /&gt;해당 파라미터를 이해하려면, feature의 개념에 대해 아셔야 합니다.&lt;br /&gt;&lt;br /&gt;머신러닝에서 feature란, &lt;b&gt;테이블의 컬럼&lt;/b&gt;에 해당하는 개념입니다.&lt;br /&gt;또한 &lt;b&gt;행렬의 열&lt;/b&gt;에 해당하는 것이기도 합니다.&lt;br /&gt;&lt;br /&gt;TF-IDF 벡터는 단어사전의 인덱스만큼 feature를 부여받습니다.&lt;br /&gt;그럼 구체적인 예시를 코드로 한 번 살펴보겠습니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1568890862738&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;text&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1568890882854&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output:
['I go to my home my home is very large',
 'I went out my home I go to the market',
 'I bought a yellow lemon I go back to home']&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot;&gt;저희의 데이터는 위와 같이 생겼습니다.&lt;br /&gt;모두 &lt;b&gt;15 종류&lt;/b&gt;의 단어가 사용되었는데요. 그러므로 feature값은 15가 할당이 됩니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1568891001762&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vectorizer = TfidfVectorizer()
a = vectorizer.fit_transform(text).toarray()
a.shape&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1568891015351&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output:
(3, 15)&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot;&gt;벡터의 shape를 출력해보면 (3, 15)가 나옵니다.&lt;br /&gt;이 15라는 값이 feature에 해당하는 것입니다. 이해가 되셨죠?&lt;br /&gt;&lt;br /&gt;이제 max_features 파라미터를 통해,&lt;br /&gt;이 feature값을 10으로 제한해보겠습니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1568891113621&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vectorizer = TfidfVectorizer(max_features = 10)
a = vectorizer.fit_transform(text).toarray()
a.shape&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1568891127464&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output:
(3, 10)&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot;&gt;feature의 값을 10으로 제한하니, 벡터의 모양이 변했습니다.&lt;br /&gt;&lt;b&gt;(3, 10)&lt;/b&gt;으로 shape가 바뀐 것을 확인하실 수 있을 겁니다.&lt;br /&gt;&lt;br /&gt;해당 파라미터는 어느 상황에 사용하게 될까요?&lt;br /&gt;자연어처리 데이터를 다루다보면, &lt;b&gt;엄청 긴 데이터&lt;/b&gt;를 만날 수 있습니다.&lt;br /&gt;&lt;br /&gt;예를 들어서 다른 데이터의 단어들은 10정도를 가지는데, &lt;br /&gt;어떤 데이터만 단어 종류가 100이 넘어간다고 하면, &lt;br /&gt;&lt;b&gt;이 100에 맞추어 feature의 수가 엄청 늘어나게 됩니다.&lt;/b&gt; &lt;br /&gt;그럴 경우, &lt;b&gt;모델 성능이 저하&lt;/b&gt;될 수도 있는 것이죠.&lt;br /&gt;&lt;br /&gt;그렇기 때문에 사전에 &lt;b&gt;EDA&lt;/b&gt;를 통해서 데이터의 &lt;b&gt;length&lt;/b&gt;를 확인하시는 것이 중요합니다. &lt;br /&gt;그렇게 되면 통계적으로 엄청 정확한 기준은 아닐지라도, &lt;br /&gt;대략 해당 파라미터의 스타트 지점을 유추해 볼 수 있을 것입니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;7. 마무리&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLqBEt/btqyp1S6Pdj/jtDB0GRGBZmJlsAGTECsN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLqBEt/btqyp1S6Pdj/jtDB0GRGBZmJlsAGTECsN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLqBEt/btqyp1S6Pdj/jtDB0GRGBZmJlsAGTECsN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLqBEt%2Fbtqyp1S6Pdj%2FjtDB0GRGBZmJlsAGTECsN0%2Fimg.png&quot; data-filename=&quot;blob&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;style3&quot;&gt;네 이렇게 오늘은 tf-idf의 중요한 파라미터 5가지에 대해서 알아보았습니다. &lt;br /&gt;도움이 되셨다면 포스팅 하단에 하트 버튼 한 번씩 눌러주시는 것 잊지 마세요~!&lt;br /&gt;&lt;br /&gt;지금까지 은공지능 공작소의 파이찬이었습니다.&lt;br /&gt;감사합니다.&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>딥러닝 공부/자연어처리</category>
      <category>ngram</category>
      <category>ngram_range</category>
      <category>tf-idf max_features</category>
      <category>tf-idf 파라미터</category>
      <category>tfidf analyzer</category>
      <category>tfidf min df</category>
      <category>tfidf sublinear_tf</category>
      <author>pychan</author>
      <guid isPermaLink="true">https://chan-lab.tistory.com/27</guid>
      <comments>https://chan-lab.tistory.com/27#entry27comment</comments>
      <pubDate>Thu, 19 Sep 2019 17:46:06 +0900</pubDate>
    </item>
    <item>
      <title>[Python/Tensorflow]  tf.estimator error 해결 (Fetch 0 argument has invalid type error, TF_SessionRun_wrapper error)</title>
      <link>https://chan-lab.tistory.com/26</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;190829_2_tf.estimator.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yr1HJ/btqxS4Qc81N/IN5FZnPHc0ArtNfxq5tDR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yr1HJ/btqxS4Qc81N/IN5FZnPHc0ArtNfxq5tDR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yr1HJ/btqxS4Qc81N/IN5FZnPHc0ArtNfxq5tDR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fyr1HJ%2FbtqxS4Qc81N%2FIN5FZnPHc0ArtNfxq5tDR0%2Fimg.png&quot; data-filename=&quot;190829_2_tf.estimator.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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;안녕하세요. 은공지능 공작소의 파이찬입니다.&lt;br /&gt;오늘은 &lt;b&gt;Tensorflow estimator&lt;/b&gt;의 2가지 &lt;b&gt;에러를 해결&lt;/b&gt;하는 포스팅을 준비했습니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. TypeError: Fetch argument 0 has invalid type &amp;lt;class 'numpy.int64'&amp;gt; must be string or Tensor&lt;/b&gt;&lt;br /&gt;&lt;b&gt;2. TypeError: TF_SessionRun_wrapper: expected all value in input dict to be ndarray&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;자신의 코드와 데이터에 문제가 없는데, 자꾸 위의 에러가 뜨시는 분들은&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;계속 포스팅을 봐주시길 바랍니다. 우선 간단한 요약부터 시작하겠습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=nMk1RpYD8Qk&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/KG356/hyCDphvnko/JMXL5LWKHc05pkzg1YLGl0/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/nMk1RpYD8Qk&quot; width=&quot;860&quot; height=&quot;645&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;1. 트러블 슈팅 요약&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1567140644036&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip uninstall numpy # numpy 없다고 뜰 때까지 계속 반복해주세요.
pip install numpy # 저는 1.17버전이 깔렸으니, 참고해주세요.
pip install cython # 이 부분은 스킵해도 될 수 있는데, 저는 실행하였기에 남겨둡니다.&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Tensorflow estimator에서 &lt;b&gt;TypeError&lt;/b&gt;가 뜬 이유는 Numpy 라이브러리 때문이었습니다.&lt;br /&gt;1.15 버전과 1.16 버전이 충돌해서 문제가 발생하는 것 같았습니다.&lt;br /&gt;위의 코드처럼 &lt;b&gt;numpy를 지웠다가 다시 깔아주면&lt;/b&gt; 문제는 해결됩니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;만약 더 자세한 설명이 필요하신 분들은 계속 봐주세요.&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;2-1. 문제 상황 (에러 메시지)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yHRux/btqxPTijATe/4BVgadE1mcRWummU8FKpl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yHRux/btqxPTijATe/4BVgadE1mcRWummU8FKpl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yHRux/btqxPTijATe/4BVgadE1mcRWummU8FKpl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyHRux%2FbtqxPTijATe%2F4BVgadE1mcRWummU8FKpl1%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;span&gt;위와 같이 2가지 에러메시지가 뜨는 상황입니다.&lt;br /&gt;각각 다른 코드인데, 해결법은 동일합니다.&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;2-2. 모든 프로그램 창 닫아주기 (주피터, 파이참 등)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/va40a/btqxShiftZM/MECKdK3MkAehB8kHlKgKt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/va40a/btqxShiftZM/MECKdK3MkAehB8kHlKgKt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/va40a/btqxShiftZM/MECKdK3MkAehB8kHlKgKt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fva40a%2FbtqxShiftZM%2FMECKdK3MkAehB8kHlKgKt1%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;반드시 모든 프로그램(파이참, 주피터 등)을 닫아주시길 바랍니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;안 그러면, 위와 같은 &lt;b&gt;PermissionError 메시지&lt;/b&gt;가 뜹니다...&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k0Fyt/btqxS6AwpD6/kK6tBpm4bbAnJW6DJBJyXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k0Fyt/btqxS6AwpD6/kK6tBpm4bbAnJW6DJBJyXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k0Fyt/btqxS6AwpD6/kK6tBpm4bbAnJW6DJBJyXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk0Fyt%2FbtqxS6AwpD6%2FkK6tBpm4bbAnJW6DJBJyXk%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;그래도 Numpy가 제거는 됩니다 ㅎㅎ&lt;br /&gt;위의 사진은 주피터 노트북을 킨 상태에서 pip uninstall numpy를 날려줬을 때의 모습입니다.&lt;br /&gt;마지막 줄에 &lt;b&gt;numpy 1.16 버전이 제거&lt;/b&gt;가 되었다고 뜬 것을 확인하실 수 있을 겁니다.&lt;br /&gt;&lt;br /&gt;그래도 여러분들은 저같은 시행착오를 방지하기 위해서,&lt;br /&gt;&lt;b&gt;꼭 모든 프로그램을 닫고&lt;/b&gt; 명령어를 날려주시길 바랍니다. 계속 진행해보겠습니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;2-3. pip uninstall numpy 명령어 실행&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;(numpy가 없다고 뜰 때까지 계속 반복)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TKWrv/btqxShCFJqk/JKh9fU4mw2ngKWQ5BG82o1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TKWrv/btqxShCFJqk/JKh9fU4mw2ngKWQ5BG82o1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TKWrv/btqxShCFJqk/JKh9fU4mw2ngKWQ5BG82o1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTKWrv%2FbtqxShCFJqk%2FJKh9fU4mw2ngKWQ5BG82o1%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;다시 모든 프로그램을 종료하고 돌아왔습니다.&lt;br /&gt;그리고 &lt;b&gt;pip uninstall numpy&lt;/b&gt; 명령어를 날려줍니다.&lt;br /&gt;&lt;br /&gt;역시 제거할 numpy가 남아있었네요.&lt;br /&gt;아까 분명 numpy 1.16 버전이 제거가 되었다고 된 상태였음에도, &lt;b&gt;1.15버전이 남아있습니다&lt;/b&gt;.&lt;br /&gt;y를 눌러서 제거를 해주시면 됩니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boEFZx/btqxUJY4e8L/XBCO5XuRGjuU14kAYYb0i1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boEFZx/btqxUJY4e8L/XBCO5XuRGjuU14kAYYb0i1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boEFZx/btqxUJY4e8L/XBCO5XuRGjuU14kAYYb0i1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboEFZx%2FbtqxUJY4e8L%2FXBCO5XuRGjuU14kAYYb0i1%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;numpy가 깔끔하게 제거되었는지 알아보기 위해, 간단한 테스트를 진행해보겠습니다.&lt;br /&gt;위의 화면처럼 우선 &lt;b&gt;python을 실행&lt;/b&gt;시켜주시길 바랍니다. 그냥 python이라고 치시면 돼요 ㅎㅎ&lt;br /&gt;&lt;br /&gt;파이썬이 실행이 되었다면, '&amp;gt;&amp;gt;&amp;gt;'이런 표시가 코드에 나타나게 됩니다.&lt;br /&gt;이 상태에서 &lt;b&gt;import numpy&lt;/b&gt; 명령어를 통해, numpy 라이브러리를 불러와줍니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;No module named 'numpy'&lt;/b&gt;라고 뜬 부분이 보이시나요?&lt;br /&gt;&amp;nbsp;numpy라는 라이브러리가 &lt;b&gt;성공적으로 제거&lt;/b&gt;가 되었다는 뜻입니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;2-4. pip install numpy 명령어 실행&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dNRPAr/btqxQTvBeBf/FSsGa24YNUBpc854go9jMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dNRPAr/btqxQTvBeBf/FSsGa24YNUBpc854go9jMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dNRPAr/btqxQTvBeBf/FSsGa24YNUBpc854go9jMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdNRPAr%2FbtqxQTvBeBf%2FFSsGa24YNUBpc854go9jMK%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;pip install numpy 명령어를 날려서, 다시 numpy를 설치해줍니다.&lt;br /&gt;마지막줄을 보니, numpy 1.17.1 버전이 설치가 되었군요.&lt;br /&gt;&lt;br /&gt;하지만 빨간색줄로 에러가 상당히 많이 떠서... 좀 거슬립니다.&lt;br /&gt;그래서 &lt;b&gt;cython만 우선 설치&lt;/b&gt;해보고 테스트를 해보기로 했습니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qT4MB/btqxUpGyJ8J/WPmC3aQp5ldlIQXOn9i910/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qT4MB/btqxUpGyJ8J/WPmC3aQp5ldlIQXOn9i910/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qT4MB/btqxUpGyJ8J/WPmC3aQp5ldlIQXOn9i910/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqT4MB%2FbtqxUpGyJ8J%2FWPmC3aQp5ldlIQXOn9i910%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;cython이 성공적으로 설치가 된 모습입니다.&lt;br /&gt;이 부분은 스킵을 해도 상관 없을 것 같긴 합니다.&lt;br /&gt;하지만 저는 실행시켜준 부분이기에, 혹시 몰라 이렇게 알려드리는 겁니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;3. 코딩 테스트&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pk0bN/btqxUrj4LpL/I1IJWeJpVKKdvmZRVELxE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pk0bN/btqxUrj4LpL/I1IJWeJpVKKdvmZRVELxE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pk0bN/btqxUrj4LpL/I1IJWeJpVKKdvmZRVELxE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpk0bN%2FbtqxUrj4LpL%2FI1IJWeJpVKKdvmZRVELxE0%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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;다시 코드를 돌려보니, 에러가 났던 것이 &lt;b&gt;정상적으로 작동&lt;/b&gt;합니다.&lt;br /&gt;이 에러를 가지고 거의 3일동안 씨름했거든요.. ㅜㅜ 감개무량합니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;KakaoTalk_20190812_062946100.jpg&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XoAwT/btqxUqFrV2q/Gz4jnRTFkI8Iepd6frzupK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XoAwT/btqxUqFrV2q/Gz4jnRTFkI8Iepd6frzupK/img.jpg&quot; data-alt=&quot;사진: 파이찬 여름 휴가 중 (가평에서)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XoAwT/btqxUqFrV2q/Gz4jnRTFkI8Iepd6frzupK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXoAwT%2FbtqxUqFrV2q%2FGz4jnRTFkI8Iepd6frzupK%2Fimg.jpg&quot; data-filename=&quot;KakaoTalk_20190812_062946100.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;/&gt;&lt;/span&gt;&lt;figcaption&gt;사진: 파이찬 여름 휴가 중 (가평에서)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;이렇게 오늘은 텐서플로우 에스티메이터 &lt;b&gt;TypeError를 해결&lt;/b&gt;해보았습니다.&lt;br /&gt;여름이 끝나가는데, 다들 여름휴가는 다녀오셨나요? ㅎㅎ&lt;br /&gt;가끔은 머리도 식히고, &lt;b&gt;휴식도 필요&lt;/b&gt;하다는 것 잊지 마세요~!&lt;br /&gt;&lt;br /&gt;지금까지 은공지능 공작소의 파이찬이었습니다.&lt;br /&gt;감사합니다.&lt;/blockquote&gt;</description>
      <category>딥러닝 공부/설치 및 환경설정</category>
      <category>Fetch 0 argument 에러</category>
      <category>TF_SessionRun_wrapper error</category>
      <category>텐서플로 에스티메이터 에러</category>
      <author>pychan</author>
      <guid isPermaLink="true">https://chan-lab.tistory.com/26</guid>
      <comments>https://chan-lab.tistory.com/26#entry26comment</comments>
      <pubDate>Fri, 30 Aug 2019 13:48:25 +0900</pubDate>
    </item>
    <item>
      <title>[Jupyter] 주피터 노트북 초보자들을 위한 단축키 꿀팁 5가지</title>
      <link>https://chan-lab.tistory.com/25</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;190829_주피터노트북 단축키.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uPDco/btqxMtEggIY/8tmcEr2Tw61uRvwyZhGvjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uPDco/btqxMtEggIY/8tmcEr2Tw61uRvwyZhGvjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uPDco/btqxMtEggIY/8tmcEr2Tw61uRvwyZhGvjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuPDco%2FbtqxMtEggIY%2F8tmcEr2Tw61uRvwyZhGvjk%2Fimg.png&quot; data-filename=&quot;190829_주피터노트북 단축키.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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;안녕하세요. 은공지능 공작소의 파이찬입니다!!!&lt;br /&gt;&lt;/span&gt;오늘은 주피터 노트북에 처음 입문하시는 분들을 위한&lt;br /&gt;단축키 꿀팁 5가지를 준비했습니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=-PU0VkijTkY&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/b3qCCn/hyCDubfnTD/2iPs1tVDpwgcx3NkdiljC0/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot; data-original-url=&quot;https://www.youtube.com/watch?v=-PU0VkijTkY&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/-PU0VkijTkY&quot; width=&quot;860&quot; height=&quot;645&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;1. 코드창, 커맨드창 단축키 (Enter, Esc)&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;honey1.gif&quot; width=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZK8jn/btqxRu9aiKP/WYBEpDoOkmdWQALmM1ext0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZK8jn/btqxRu9aiKP/WYBEpDoOkmdWQALmM1ext0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZK8jn/btqxRu9aiKP/WYBEpDoOkmdWQALmM1ext0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/ZK8jn/btqxRu9aiKP/WYBEpDoOkmdWQALmM1ext0/img.gif&quot; data-filename=&quot;honey1.gif&quot; width=&quot;1000&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;가장 기본이 되는 단축키 입니다.&lt;br /&gt;&lt;b&gt;Enter는 코드창을 실행&lt;/b&gt;하여 &lt;b&gt;초록색 테두리&lt;/b&gt;의 셀로 바뀌게 합니다.&lt;br /&gt;여기서 빠져나와 다시 &lt;b&gt;커맨드 창&lt;/b&gt;으로 돌아가려면, &lt;b&gt;Esc&lt;/b&gt;를 누릅니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;모든 단축키는 파란색 커맨드 창에서&lt;/b&gt; 동작을 합니다.&lt;br /&gt;또한, 커맨드 창모드(파란색)에서는 화살표로 &lt;b&gt;위, 아래 셀로 이동&lt;/b&gt;이 가능합니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;2. 제목 만들기 (숫자키 1 ~ 6)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;honey2.gif&quot; width=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WWrcM/btqxQTOSkPk/sNnXRF4fkBmhiC9fU4xcFk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WWrcM/btqxQTOSkPk/sNnXRF4fkBmhiC9fU4xcFk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WWrcM/btqxQTOSkPk/sNnXRF4fkBmhiC9fU4xcFk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/WWrcM/btqxQTOSkPk/sNnXRF4fkBmhiC9fU4xcFk/img.gif&quot; data-filename=&quot;honey2.gif&quot; width=&quot;1000&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;숫자키 1 ~ 6&lt;/b&gt;을 눌러 제목을 만들 수 있습니다.&lt;br /&gt;&lt;/span&gt;이 역시 파란색 커맨드 셀에서 실행해야 한다는 것을 잊지 마세요.&lt;br /&gt;&lt;br /&gt;#의 개수가 많아질 수록 글자크기는 작아집니다.&lt;br /&gt;제가 주로 사용하는 크기는 &lt;b&gt;# 하나, # 셋&lt;/b&gt; 입니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;# 뒤에 원하시는 제목을 적은 후 Ctrl + Enter&lt;/b&gt;를 누르시면&lt;br /&gt;깔끔한 제목이 완성이 됩니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;3. 셀 추가 및 삭제 (b,a / dd)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;honey3.gif&quot; width=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4UNla/btqxPdAwslj/v1EAluyfELe9vRhyiZMjvk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4UNla/btqxPdAwslj/v1EAluyfELe9vRhyiZMjvk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4UNla/btqxPdAwslj/v1EAluyfELe9vRhyiZMjvk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/b4UNla/btqxPdAwslj/v1EAluyfELe9vRhyiZMjvk/img.gif&quot; data-filename=&quot;honey3.gif&quot; width=&quot;1000&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;셀추가는 b버튼, a버튼을 통해서 합니다.&lt;br /&gt;보통 아래로 셀을 추가하기 때문에 &lt;b&gt;b를 많이 씁니다.&lt;/b&gt;&lt;br /&gt;셀을 삭제하실 때에는 &lt;b&gt;d&lt;/b&gt;를 두번 연타하시면 됩니다. (dd)&lt;br /&gt;&lt;br /&gt;각각 below, above, delete의 약자라고 생각하시면&lt;br /&gt;외우기 편할 것입니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;4. 마크다운창 및 코드창 단축키 (m, y)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;honey4.gif&quot; width=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lpUAQ/btqxSh9zEZQ/RtukAs2lGG8nnTXa3LN23K/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lpUAQ/btqxSh9zEZQ/RtukAs2lGG8nnTXa3LN23K/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lpUAQ/btqxSh9zEZQ/RtukAs2lGG8nnTXa3LN23K/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/lpUAQ/btqxSh9zEZQ/RtukAs2lGG8nnTXa3LN23K/img.gif&quot; data-filename=&quot;honey4.gif&quot; width=&quot;1000&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;m키&lt;/b&gt;로 코드창을 &lt;b&gt;마크다운창&lt;/b&gt;으로 변경시킬 수 있습니다.&lt;br /&gt;&lt;/span&gt;이 마크다운창에서 다양한 필기를 하는 것입니다.&lt;br /&gt;다시 &lt;b&gt;코드창&lt;/b&gt;으로 돌아오려면 &lt;b&gt;y를&lt;/b&gt; 누릅니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;5. 마크다운 꿀팁 (br태그, 머리글, 수평선)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;honey5.gif&quot; width=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSv91J/btqxOJzJcNF/fcYklCkzVXTIOlbLLgoksK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSv91J/btqxOJzJcNF/fcYklCkzVXTIOlbLLgoksK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSv91J/btqxOJzJcNF/fcYklCkzVXTIOlbLLgoksK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bSv91J/btqxOJzJcNF/fcYklCkzVXTIOlbLLgoksK/img.gif&quot; data-filename=&quot;honey5.gif&quot; width=&quot;1000&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;만약에 마크다운에서 줄을 바꾸고 싶으시다면,&lt;br /&gt;&lt;/span&gt;&lt;b&gt;&amp;lt;br&amp;gt; 태그&lt;/b&gt;를 사용해 보세요. 그냥 &amp;lt;br&amp;gt;이라고 치시면 됩니다.&lt;br /&gt;이는 &lt;b&gt;일종의 html 태그&lt;/b&gt;인데요, 마크다운에서도 이런 html 언어가 적용이 됩니다!&lt;br /&gt;(만약 html 지식이 좀 있으신 분들은 여러모로 유리합니다!)&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;honey6.gif&quot; width=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0ggdb/btqxN532Gp7/4xbxUz8OwZCjQvoD2KnxOk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0ggdb/btqxN532Gp7/4xbxUz8OwZCjQvoD2KnxOk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0ggdb/btqxN532Gp7/4xbxUz8OwZCjQvoD2KnxOk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/0ggdb/btqxN532Gp7/4xbxUz8OwZCjQvoD2KnxOk/img.gif&quot; data-filename=&quot;honey6.gif&quot; width=&quot;1000&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;- 를 통해 &lt;b&gt;글머리&lt;/b&gt;를 넣을 수 있습니다.&lt;br /&gt;많은 항목들을 &lt;b&gt;나열&lt;/b&gt;할 때, 글머리로 정리하면 &lt;b&gt;깔끔&lt;/b&gt;하죠!&lt;br /&gt;또한 &lt;b&gt;숫자형&lt;/b&gt;으로도 글머리를 넣을 수 있으니 참고바랍니다.&lt;br /&gt;(1.&amp;nbsp; &amp;nbsp; 2.&amp;nbsp; &amp;nbsp;&amp;lt;- 이런식으로 숫자와 점을 쓰시면 순서형 글머리가 됩니다)&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;honey7.gif&quot; width=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BxJiF/btqxQo9rzOx/bF2mTVEGSzKDULssYTT4O1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BxJiF/btqxQo9rzOx/bF2mTVEGSzKDULssYTT4O1/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BxJiF/btqxQo9rzOx/bF2mTVEGSzKDULssYTT4O1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/BxJiF/btqxQo9rzOx/bF2mTVEGSzKDULssYTT4O1/img.gif&quot; data-filename=&quot;honey7.gif&quot; width=&quot;1000&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;필기를 하다가 단락 등을 구분할 때, &lt;b&gt;수평선(---)&lt;/b&gt;을 그어주면 좋습니다.&lt;br /&gt;&lt;/span&gt;저런식으로 수평선을 그어주면 훨씬 깔끔한 느낌이 듭니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;마무리&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;248499.jpg&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DZsQM/btqxNUobm8U/Lb9KHTtKBJUtG0gYh6FGZ0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DZsQM/btqxNUobm8U/Lb9KHTtKBJUtG0gYh6FGZ0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DZsQM/btqxNUobm8U/Lb9KHTtKBJUtG0gYh6FGZ0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDZsQM%2FbtqxNUobm8U%2FLb9KHTtKBJUtG0gYh6FGZ0%2Fimg.jpg&quot; data-filename=&quot;248499.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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;수고하셨습니다~!!&lt;br /&gt;오늘은 주피터 노트북을 처음 쓰시는 분들을 위해서&lt;br /&gt;많이 쓰이는 &lt;b&gt;단축키 + 마크다운 언어 꿀팁&lt;/b&gt;을 함께 보았습니다.&lt;br /&gt;&lt;br /&gt;도움이 되셨다면 하단의 하트버튼 한 번 부탁드립니다.&lt;br /&gt;감사합니다!&lt;/blockquote&gt;</description>
      <category>딥러닝 공부/설치 및 환경설정</category>
      <category>jupyter notebook 꿀팁</category>
      <category>jupyter notebook 은공지능</category>
      <category>주피터노트북 꿀팁</category>
      <category>주피터노트북 단축키</category>
      <category>주피터노트북 초보자</category>
      <author>pychan</author>
      <guid isPermaLink="true">https://chan-lab.tistory.com/25</guid>
      <comments>https://chan-lab.tistory.com/25#entry25comment</comments>
      <pubDate>Thu, 29 Aug 2019 16:06:53 +0900</pubDate>
    </item>
    <item>
      <title>[Python/Jupyter] 본격 TF-IDF 개념 해부</title>
      <link>https://chan-lab.tistory.com/24</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;190824_TFIDF개념해부.png&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djtPFz/btqxHBvynmP/g2fX6dkcUxiEKkfBw4vrV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djtPFz/btqxHBvynmP/g2fX6dkcUxiEKkfBw4vrV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djtPFz/btqxHBvynmP/g2fX6dkcUxiEKkfBw4vrV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdjtPFz%2FbtqxHBvynmP%2Fg2fX6dkcUxiEKkfBw4vrV0%2Fimg.png&quot; data-filename=&quot;190824_TFIDF개념해부.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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;안녕하세요! 은공지능 공작소 운영자 파이찬입니다.&lt;br /&gt;&lt;/span&gt;오늘은 &lt;b&gt;TF-IDF&lt;/b&gt; 벡터화에 대한 내용을 다루겠습니다.&lt;br /&gt;자연어처리를 하다 보면 많이 등장하는 &lt;b&gt;Feature extraction&lt;/b&gt; 기법입니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=ngYeCV57GlQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/iDlbf/hyCz0gNXIN/uXWaKyztsUeiBEoapi9Eok/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/ngYeCV57GlQ&quot; width=&quot;860&quot; height=&quot;645&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;1. TF-IDF의 개념&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcxs8z/btqxIELUDTn/WaYe32nWRWClT1lQNkdEYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcxs8z/btqxIELUDTn/WaYe32nWRWClT1lQNkdEYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcxs8z/btqxIELUDTn/WaYe32nWRWClT1lQNkdEYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbcxs8z%2FbtqxIELUDTn%2FWaYe32nWRWClT1lQNkdEYk%2Fimg.png&quot; width=&quot;1000&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;TF-IDF의 풀네임은 &lt;b&gt;Term Frequency - Inverse Document Frequency&lt;/b&gt;입니다.&lt;br /&gt;TF, IDF의 의미를 각각 이해하시면 정확한 의미 파악이 가능합니다.&lt;br /&gt;자세한 내용은 위의 그림을 참조해 주세요.&lt;br /&gt;&lt;br /&gt;그럼 이 TF-IDF가 어떻게 사용되고,&lt;br /&gt;어떤 맥락에서 등장하게 되었는지 이해해보도록 하겠습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Iycvf/btqxIGppGWt/6ssinQnK6eL4948eRBkPJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Iycvf/btqxIGppGWt/6ssinQnK6eL4948eRBkPJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Iycvf/btqxIGppGWt/6ssinQnK6eL4948eRBkPJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIycvf%2FbtqxIGppGWt%2F6ssinQnK6eL4948eRBkPJk%2Fimg.png&quot; width=&quot;1000&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;TF-IDF&lt;/b&gt;는 일종의 &lt;b&gt;특징 추출(Feature extraction)&lt;/b&gt; 기법입니다.&lt;br /&gt;&lt;/span&gt;특징 추출이란, 말 그대로 &lt;b&gt;raw data에서 특징을 뽑아내는 것&lt;/b&gt;을 의미합니다.&lt;br /&gt;&lt;br /&gt;좀 추상적으로 들릴 수도 있는데요, 한마디로 정의하자면 &lt;b&gt;'수치화'입니다.&lt;/b&gt;&lt;br /&gt;텍스트 데이터를 컴퓨터가 그대로 인식할 수는 없습니다.&lt;br /&gt;컴퓨터가 인식하려면 이를 숫자의 형태로 바꾸어 주어야 합니다.&lt;br /&gt;&lt;br /&gt;이렇게 숫자의 형태로 바꾸어 주는 과정에서,&lt;br /&gt;어떻게 하면 사람이 인지하듯이, 데이터의 특징을 잘 담을 수 있을지 고민하게 되고&lt;br /&gt;여러 가지 특징 추출 기법이 등장하는 것입니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c23lsm/btqxJaQ8QiG/ptAM3iCIIVnuobCPU5k7a1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c23lsm/btqxJaQ8QiG/ptAM3iCIIVnuobCPU5k7a1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c23lsm/btqxJaQ8QiG/ptAM3iCIIVnuobCPU5k7a1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc23lsm%2FbtqxJaQ8QiG%2FptAM3iCIIVnuobCPU5k7a1%2Fimg.png&quot; width=&quot;1000&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;여러가지 특징 추출 기법 중 가장 기본적이 count 기반 특징 추출기법입니다.&lt;br /&gt;python scikit에서 &lt;b&gt;CountVectorizer&lt;/b&gt;가 바로 이것입니다.&lt;br /&gt;&lt;br /&gt;하지만 위의 그림에서 나오듯이, 이 CountVectorizer는 한계점이 존재합니다.&lt;br /&gt;단어의 빈도수를 기반으로 하기 때문에,&lt;br /&gt;조사, 관사 등의 &lt;b&gt;의미 없는 단어에 높은 수치를 부여&lt;/b&gt;할 수 있다는 것입니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5oOmz/btqxIF48jYg/YzcMwue5wb5YI1Lg1Bxxc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5oOmz/btqxIF48jYg/YzcMwue5wb5YI1Lg1Bxxc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5oOmz/btqxIF48jYg/YzcMwue5wb5YI1Lg1Bxxc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5oOmz%2FbtqxIF48jYg%2FYzcMwue5wb5YI1Lg1Bxxc1%2Fimg.png&quot; width=&quot;1000&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이러한 단점을 해결할 수 있는 것이 TF-IDF입니다.&lt;br /&gt;일반적으로 TF-IDF가 CountVectorizer 보다 좋은 결과를 내놓는 것으로 알려져 있습니다.&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAcZ6p/btqxJyRygZ5/qHkJU57VSTkNeKjUL7DKU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAcZ6p/btqxJyRygZ5/qHkJU57VSTkNeKjUL7DKU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAcZ6p/btqxJyRygZ5/qHkJU57VSTkNeKjUL7DKU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAcZ6p%2FbtqxJyRygZ5%2FqHkJU57VSTkNeKjUL7DKU0%2Fimg.png&quot; width=&quot;1000&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이제 다시 한번 정확하게, &lt;b&gt;TF, DF, IDF의 의미&lt;/b&gt;를 짚고 넘어가겠습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;위의 그림을 통해 의미를 이해하시면 됩니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;+&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;유튜브 동영상에는 설명이 빠진 것이 있어 보충합니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;TF-IDF에서 &lt;b&gt;한 글자의 단어(Term)는 단어 사전에서 제외&lt;/b&gt;됩니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;위의 문서들에 등장하는 단어 중 'I' 나 'a' 같은 단어에 이에 해당됩니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWpa0v/btqxJS3jyz2/MgWGcvYSrVciYjPs2kYIX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWpa0v/btqxJS3jyz2/MgWGcvYSrVciYjPs2kYIX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWpa0v/btqxJS3jyz2/MgWGcvYSrVciYjPs2kYIX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWpa0v%2FbtqxJS3jyz2%2FMgWGcvYSrVciYjPs2kYIX0%2Fimg.png&quot; width=&quot;1000&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;DF의 개념은 혼동될 수 있으니 &lt;b&gt;조심&lt;/b&gt;하셔야 합니다.&lt;br /&gt;TF가 '단어'의 빈도를 나타내었다면, &lt;b&gt;'DF'는 문서의 빈도&lt;/b&gt;를 나타냅니다.&lt;br /&gt;&lt;br /&gt;위의 그림에서 home은 전체 문서에서 총 4번 등장합니다.&lt;br /&gt;그렇다고 해서&lt;b&gt; DF = 4로 잡으시면 안 된다&lt;/b&gt;는 말씀입니다.&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6QAhS/btqxIErEsJK/hT1bwgBlvN46IzZCmyHdXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6QAhS/btqxIErEsJK/hT1bwgBlvN46IzZCmyHdXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6QAhS/btqxIErEsJK/hT1bwgBlvN46IzZCmyHdXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6QAhS%2FbtqxIErEsJK%2FhT1bwgBlvN46IzZCmyHdXk%2Fimg.png&quot; width=&quot;1000&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;비록 단어의 등장 횟수는 4번이지만, &lt;b&gt;해당 단어를 가진 문서는 총 3개&lt;/b&gt;이기 때문에&lt;br /&gt;&lt;/span&gt;여기서 &lt;b&gt;home의 DF는 3&lt;/b&gt;으로 잡는 것이 정확합니다.&lt;br /&gt;이러한 점을 숙지하시고 넘어가시면 되겠습니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpzmJE/btqxHTQqV6N/E8geIktYta5qcyHGIDLodk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpzmJE/btqxHTQqV6N/E8geIktYta5qcyHGIDLodk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpzmJE/btqxHTQqV6N/E8geIktYta5qcyHGIDLodk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpzmJE%2FbtqxHTQqV6N%2FE8geIktYta5qcyHGIDLodk%2Fimg.png&quot; width=&quot;1000&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;마지막으로 IDF의 개념을 잡고 넘어가겠습니다.&lt;br /&gt;&lt;/span&gt;IDF는 DF에 &lt;b&gt;Inverse&lt;/b&gt;를 붙여준 것입니다.&lt;br /&gt;수학에서 Inverse는 '역수'라는 의미를 가지고 있습니다.&lt;br /&gt;&lt;br /&gt;역수는 분모와 분자를 뒤집는 것을 의미합니다.&lt;br /&gt;예를 들어 3을 3/1이라고 표현하고, 분모와 분자를 뒤집는다면,&lt;br /&gt;1/3이라고 할 수 있습니다. 이것이 역수의 개념입니다.&lt;br /&gt;&lt;br /&gt;역수를 취해주면, 원래는 &lt;b&gt;큰 값이 작은 값으로 확 줄어드는 효과&lt;/b&gt;를 낼 수 있습니다.&lt;br /&gt;이러한 방식으로 많이 등장하는 단어에 패널티를 주기 때문에&lt;br /&gt;DF에 Inverse를 붙여서 IDF라고 이름이 붙여졌습니다.&lt;br /&gt;IDF를 구하는 수식은 위의 그림을 참조해주시면 됩니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1566717102277&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from sklearn.feature_extraction.text import TfidfVectorizer

text = ['I go to my home my home is very large', # Doc[0]
        'I went out my home I go to the market', # Doc[1]
        'I bought a yellow lemon I go back to home'] # Doc[2]

tfidf_vectorizer = TfidfVectorizer() # TF-IDF 객체선언&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이제 본격적으로 코드 실습을 시작하겠습니다.&lt;br /&gt;설명자료에서 쓰인 문장들을 그대로 가져왔습니다. &lt;b&gt;총 3개의 문서&lt;/b&gt;가 담긴 데이터입니다.&lt;br /&gt;&lt;br /&gt;모듈은 사이킷런의 Feature extraction을 사용합니다.&lt;br /&gt;그중에서도 &lt;b&gt;TfidfVectorizer라는 모듈을 사용하여 객체를 선언&lt;/b&gt;해주면 됩니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1566717497970&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tfidf_vectorizer.fit(text) # 단어를 학습시킴
tfidf_vectorizer.vocabulary_ # 단어사전을 출력
sorted(tfidf_vectorizer.vocabulary_.items()) # 단어사전 정렬&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1566717589727&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output:
[('back', 0),
 ('bought', 1),
 ('go', 2),
 ('home', 3),
 ('is', 4),
 ('large', 5),
 ('lemon', 6),
 ('market', 7),
 ('my', 8),
 ('out', 9),
 ('the', 10),
 ('to', 11),
 ('very', 12),
 ('went', 13),
 ('yellow', 14)]&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;단어 사전을 정렬해서 출력한 모습입니다.&lt;br /&gt;&lt;b&gt;한 글자 짜리 단어들은 제외&lt;/b&gt;하고 단어 사전이 만들어졌습니다.&lt;br /&gt;&lt;br /&gt;a, b, c, d &lt;b&gt;오름차순&lt;/b&gt;으로 순차적으로 인덱스가 할당된 모습입니다.&lt;br /&gt;이제 Vectorizer는 이 사전을 참고하여, TF/DF/IDF 벡터화를 수행하게 됩니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;2.&amp;nbsp;TF,&amp;nbsp;DF,&amp;nbsp;IDF&amp;nbsp;벡터화&amp;nbsp;과정의&amp;nbsp;이해&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1566717866873&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tfidf_vectorizer.idf_&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1566717918094&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output:
array([1.69314718, 1.69314718, 1.        , 1.        , 1.69314718,
       1.69314718, 1.69314718, 1.69314718, 1.28768207, 1.69314718,
       1.69314718, 1.        , 1.69314718, 1.69314718, 1.69314718])&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이제 TF, DF, IDF 벡터화 과정에 대해서 설명드리겠습니다.&lt;br /&gt;그전에 IDF와 TF-IDF과정을 거친 결과가 어떻게 되는지 확인하고 넘어가겠습니다.&lt;br /&gt;위의 결과는&lt;b&gt; IDF 벡터화의 결과물&lt;/b&gt;입니다.&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1566718153429&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tfidf_vectorizer.idf_.shape&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1566718168385&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output:
(15,)&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;코드의 뒤에 .&lt;b&gt;shape를&lt;/b&gt; 붙여서 결과를 확인해 보십시오.&lt;br /&gt;그러면 &lt;b&gt;(15, )&lt;/b&gt; 라는 결과가 출력이 됩니다.&lt;br /&gt;이는 .vocabulary_ 명령어를 통해 확인한 &lt;b&gt;단어 사전의 단어수와 일치&lt;/b&gt;합니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1566718244179&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tfidf_vectorizer.transform(text).toarray()&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1566718255242&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output:
array([[0.        , 0.        , 0.2170186 , 0.4340372 , 0.36744443,
        0.36744443, 0.        , 0.        , 0.55890191, 0.        ,
        0.        , 0.2170186 , 0.36744443, 0.        , 0.        ],
       [0.        , 0.        , 0.24902824, 0.24902824, 0.        ,
        0.        , 0.        , 0.42164146, 0.3206692 , 0.42164146,
        0.42164146, 0.24902824, 0.        , 0.42164146, 0.        ],
       [0.44514923, 0.44514923, 0.26291231, 0.26291231, 0.        ,
        0.        , 0.44514923, 0.        , 0.        , 0.        ,
        0.        , 0.26291231, 0.        , 0.        , 0.44514923]])&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;위의 결과는 TF-IDF 벡터화의 최종 결과물입니다.&lt;br /&gt;각각의 Document 마다 array가 하나씩 할당되어, 총 &lt;b&gt;3개&lt;/b&gt;의 결과물이 나왔습니다.&lt;br /&gt;&lt;/span&gt;대괄호로 묶인 덩어리를 세어보면 3개가 있는 것을 확인할 수 있습니다.&lt;br /&gt;&lt;br /&gt;이렇게 하여 IDF의 모습, Tf-IDF의 최종 결과물까지 확인해보았습니다.&lt;br /&gt;저희의 목표는 어떻게 이런 결과가 나오게 되었는지를 자세히 살펴보는 것입니다.&lt;br /&gt;즉 &lt;b&gt;과정을 해부&lt;/b&gt;하는 것이지요!&lt;br /&gt;&lt;br /&gt;지금부터 다시 PPT 자료를 통해,&lt;br /&gt;&lt;b&gt;TF 벡터화, DF 벡터화, IDF 벡터화&lt;/b&gt;에 대해 하나하나씩 자세히 파헤쳐보겠습니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wpIeS/btqxKqZOOgR/cvjuq9HK6bxWxDU4UFyjZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wpIeS/btqxKqZOOgR/cvjuq9HK6bxWxDU4UFyjZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wpIeS/btqxKqZOOgR/cvjuq9HK6bxWxDU4UFyjZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwpIeS%2FbtqxKqZOOgR%2Fcvjuq9HK6bxWxDU4UFyjZ1%2Fimg.png&quot; width=&quot;1000&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;왼쪽의 단어 사전은 &lt;b&gt;fit 함수&lt;/b&gt;를 통해 만들어준 것입니다.&lt;br /&gt;&lt;/span&gt;이를 쉽게 그림으로 표현해보면 오른쪽과 같이 됩니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ejmAdM/btqxHUuYrlf/v27zRXcGl2DZvFQorpALSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ejmAdM/btqxHUuYrlf/v27zRXcGl2DZvFQorpALSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ejmAdM/btqxHUuYrlf/v27zRXcGl2DZvFQorpALSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FejmAdM%2FbtqxHUuYrlf%2Fv27zRXcGl2DZvFQorpALSk%2Fimg.png&quot; width=&quot;1000&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;이렇게 만들어준 단어 사전을 통해, TF가 벡터화되는 것입니다.&lt;br /&gt;각 &lt;b&gt;문서(Document)마다 하나씩&lt;/b&gt; TF가 만들어집니다.&lt;br /&gt;그러니 &lt;b&gt;총 3개의 TF&lt;/b&gt;가 생성되는 것이죠.&lt;br /&gt;&lt;br /&gt;각각의 TF 벡터에는 해당 단어들의 빈도가 숫자로 들어가게 됩니다.&lt;br /&gt;예를 들어, Doc[0]의 home이라는 항을 살펴보겠습니다.&lt;br /&gt;home이라는 단어는 Doc[0]에 총 2번 등장했기 때문에 2가 할당이 되는 방식입니다.&lt;br /&gt;이런 방식으로 전체 TF 벡터가 만들어집니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oXuTW/btqxIFKUnIk/39Bov0QQ32IlfJ4x1Zr410/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oXuTW/btqxIFKUnIk/39Bov0QQ32IlfJ4x1Zr410/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oXuTW/btqxIFKUnIk/39Bov0QQ32IlfJ4x1Zr410/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoXuTW%2FbtqxIFKUnIk%2F39Bov0QQ32IlfJ4x1Zr410%2Fimg.png&quot; width=&quot;1000&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번에는 DF(Document Frequency)의 벡터화 과정에 대해 알아보겠습니다.&lt;br /&gt;&lt;/span&gt;DF의 벡터화도 TF 벡터화와 비슷합니다.&lt;br /&gt;다만, DF는 단어의 수가 아닌 &lt;b&gt;'해당 단어가 포함된 문서의 수'라는&lt;/b&gt; 점을 기억해주시면 됩니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Db3CF/btqxJaDHdGX/I0ySBtM9cgTfb5BOsyTYTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Db3CF/btqxJaDHdGX/I0ySBtM9cgTfb5BOsyTYTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Db3CF/btqxJaDHdGX/I0ySBtM9cgTfb5BOsyTYTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDb3CF%2FbtqxJaDHdGX%2FI0ySBtM9cgTfb5BOsyTYTK%2Fimg.png&quot; width=&quot;1000&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;마지막으로 IDF(Inverse-Document Frequency) 벡터화 과정입니다.&lt;br /&gt;&lt;/span&gt;IDF 벡터화는 위의 그림처럼 일종의 자연로그 변환을 거칩니다.&lt;br /&gt;이런 방식으로 &lt;b&gt;값이 높은 것들은 낮추고, 값이 낮은 것들은 높일 수&lt;/b&gt; 있습니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;3. IDF 벡터화 해부&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1566726256628&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tfidf_vectorizer.idf_&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1566726292906&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output:
array([1.69314718, 1.69314718, 1.        , 1.        , 1.69314718,
       1.69314718, 1.69314718, 1.69314718, 1.28768207, 1.69314718,
       1.69314718, 1.        , 1.69314718, 1.69314718, 1.69314718])&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이제 위와 같은 수치들을 직접 구해볼 것입니다. &lt;br /&gt;코딩해서 계산한 과정이 맞다면 바로 위에 있는 결과와 같은 결과가 나오겠고, &lt;br /&gt;제대로 IDF를 이해한 것이겠죠? ^^&lt;br /&gt;&lt;br /&gt;IDF 벡터를 만들기 위해선 &lt;b&gt;DF부터&lt;/b&gt; 만들어야 합니다.&lt;br /&gt;DF 벡터는 직접 일일이 손코딩을 해줘야 합니다.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;하지만 여러분은 &lt;b&gt;그냥 아래 코드를 복붙&lt;/b&gt;해주세요~ 수고는 제가 합니다&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1566726503798&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy as np
DF_vec = np.array([1, 1, 3, 3, 1,
                   1, 1, 1, 2, 1,
                   1, 3, 1, 1, 1])&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;DF 벡터를 위와 같이 만들어 주면 됩니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1566726567217&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def idf_func(n, df):
    import numpy as np
    rst = np.log((1+n)/(1+df)) + 1
    return rst&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;다음으로 DF를 IDF로 로그 변환해주는 함수를 만들어 줍니다.&lt;br /&gt;함수의 인자는 n(총 문서의 개수)과 df 벡터를 넣어주었습니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1566726661536&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;idf_func(3, DF_vec)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1566726676736&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output:
array([1.69314718, 1.69314718, 1.        , 1.        , 1.69314718,
       1.69314718, 1.69314718, 1.69314718, 1.28768207, 1.69314718,
       1.69314718, 1.        , 1.69314718, 1.69314718, 1.69314718])&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1566726684416&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tfidf_vectorizer.idf_&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1566726696387&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output:
array([1.69314718, 1.69314718, 1.        , 1.        , 1.69314718,
       1.69314718, 1.69314718, 1.69314718, 1.28768207, 1.69314718,
       1.69314718, 1.        , 1.69314718, 1.69314718, 1.69314718])&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;함수를 통해 구한 것과 idfVectorizer로 구한 &lt;b&gt;값이 정확히 같게&lt;/b&gt; 나왔습니다.&lt;br /&gt;포인트는&amp;nbsp;&lt;b&gt;로그 변환 방식을 이해하는&lt;/b&gt;&amp;nbsp;것입니다.&lt;br /&gt;이렇게 하여 IDF 벡터화 과정 해부가 끝났습니다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;+&lt;br /&gt;해당 로그 변환은 IDF_smoothing을 거친 것입니다. (Default option)&lt;br /&gt;이 IDF_smoothing에 대해서는 다음 포스팅에서 다루어 보도록 하겠습니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;4. TF-IDF 벡터화 해부&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1566727006255&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tfidf_vectorizer.transform(text).toarray()&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1566727022777&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output:
array([[0.        , 0.        , 0.2170186 , 0.4340372 , 0.36744443,
        0.36744443, 0.        , 0.        , 0.55890191, 0.        ,
        0.        , 0.2170186 , 0.36744443, 0.        , 0.        ],
       [0.        , 0.        , 0.24902824, 0.24902824, 0.        ,
        0.        , 0.        , 0.42164146, 0.3206692 , 0.42164146,
        0.42164146, 0.24902824, 0.        , 0.42164146, 0.        ],
       [0.44514923, 0.44514923, 0.26291231, 0.26291231, 0.        ,
        0.        , 0.44514923, 0.        , 0.        , 0.        ,
        0.        , 0.26291231, 0.        , 0.        , 0.44514923]])&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이제 TF-IDF 벡터화를 해부해보겠습니다.&lt;br /&gt;&lt;/span&gt;위의 &lt;b&gt;벡터 수치들을 직접 만들어 보는 것&lt;/b&gt;이 저희의 목표입니다.&lt;br /&gt;&lt;br /&gt;TF-IDF 벡터화는 쉽게 말해서 TF x IDF로 이루어져 있다고 설명을 드렸습니다.&lt;br /&gt;그런데 여기까지 해도 결과는 실제 코드에서 나온 결과와 같지 않을 것입니다.&lt;br /&gt;&lt;br /&gt;왜냐면 이 곱한 결과에 &lt;b&gt;L2정규화&lt;/b&gt;까지 해야 &lt;br /&gt;위에 보이는 결과가 나오기 때문이지요. 그림으로 설명드리면 다음과 같습니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cihGlY/btqxHT3XpKk/wFkJDb1otwm7ka1pVXtki1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cihGlY/btqxHT3XpKk/wFkJDb1otwm7ka1pVXtki1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cihGlY/btqxHT3XpKk/wFkJDb1otwm7ka1pVXtki1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcihGlY%2FbtqxHT3XpKk%2FwFkJDb1otwm7ka1pVXtki1%2Fimg.png&quot; width=&quot;1000&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;최종 TF-IDF는 위와 같이 크게 &lt;b&gt;2단계&lt;/b&gt;를 거쳐서 산출됩니다.&lt;br /&gt;&lt;br /&gt;1. TF벡터와 IDF벡터를 &lt;b&gt;원소곱&amp;nbsp;&lt;/b&gt;해줍니다.&lt;br /&gt;2. 위의 결과에 &lt;b&gt;L2 정규화&lt;/b&gt;를 해줍니다.&lt;br /&gt;&lt;br /&gt;L2 정규화에 대해서 간단히 설명드리겠습니다.&lt;br /&gt;위의 하얀색 박스로 되어 있는 수식을 참고하시면 됩니다.&lt;br /&gt;각각의 원소들을 제곱합에 루트를 씌워준 값으로 나눠준 것입니다.&lt;br /&gt;이러한 방식으로 &lt;b&gt;벡터화의 결과를 좀 완만하게&lt;/b&gt; 만들 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;이렇게 2단계를 거쳐서 최종 TF-IDF 벡터가 나오게 됩니다.&lt;br /&gt;이제 이를 코딩 실습을 통해 이해해 보겠습니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1566727770285&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tfidf_vectorizer.transform(text).toarray()[0]&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1566727786503&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;array([0.        , 0.        , 0.2170186 , 0.4340372 , 0.36744443,
       0.36744443, 0.        , 0.        , 0.55890191, 0.        ,
       0.        , 0.2170186 , 0.36744443, 0.        , 0.        ])&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;저희의 목표는 위의 결과를 만드는 것입니다.&lt;br /&gt;&lt;/span&gt;이는 &lt;b&gt;첫 번째 Document에 해당하는 TF-IDF 벡터&lt;/b&gt;입니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1566727938242&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;count_vec = np.array([0, 0, 1, 2, 1,
                      1, 0, 0, 2, 0,
                      0, 1, 1, 0, 0])&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;먼저 TF 벡터부터 만들어 주겠습니다.&lt;br /&gt;위의 Doc[0]에 해당하는 TF 벡터를 그대로 복붙 해가시길 바랍니다.&lt;br /&gt;이는 &lt;b&gt;첫 번째 문서에 나오는 단어 빈도수&lt;/b&gt;를 나타내는 벡터입니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1566728074784&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tfidf_vectorizer.idf_&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1566728094330&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output:
array([1.69314718, 1.69314718, 1.        , 1.        , 1.69314718,
       1.69314718, 1.69314718, 1.69314718, 1.28768207, 1.69314718,
       1.69314718, 1.        , 1.69314718, 1.69314718, 1.69314718])&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그다음으로 해야 할 것은 &lt;b&gt;IDF 벡터&lt;/b&gt;를 만들어주는 것입니다.&lt;br /&gt;이것은 이미 이전에 저희가 다 해본 것이기 때문에,&lt;br /&gt;tfidf_vectorizer가 만들어주는 결과물을 그냥 쓰도록 하겠습니다.&lt;br /&gt;&lt;br /&gt;이제 위에서 만들어준 &lt;b&gt;TF 벡터와 여기 있는 IDF 벡터를 곱해줘야&lt;/b&gt; 합니다.&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1566728221828&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;np.multiply(count_vec, tfidf_vectorizer.idf_)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1566728237046&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output:
array([0.        , 0.        , 1.        , 2.        , 1.69314718,
       1.69314718, 0.        , 0.        , 2.57536414, 0.        ,
       0.        , 1.        , 1.69314718, 0.        , 0.        ])&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;위와 같은 방식으로 TF벡터와 IDF벡터를 곱해줍니다.&lt;br /&gt;&lt;br /&gt;여기서 중요한 것은 &lt;b&gt;np.multiply&lt;/b&gt; 함수를 쓰는 것입니다.&lt;br /&gt;이는 &lt;b&gt;벡터 각각의 원소들의 곱셈&lt;/b&gt;을 해주는 함수입니다.&lt;br /&gt;(np.matmul과는 반드시 구분해서 써야 합니다)&lt;br /&gt;&lt;br /&gt;이제 위에 나온 결과에 L2 정규화를 해주면&lt;br /&gt;최종 TF-IDF 벡터를 구하게 됩니다. 거의 다 왔습니다!&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1566728615342&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from sklearn import preprocessing
tf_idf_before_l2 = np.multiply(count_vec, tfidf_vectorizer.idf_)
tf_idf_before_l2 = tf_idf_before_l2.reshape(1, -1)
tf_idf_after_l2 = preprocessing.normalize(tf_idf_before_l2, norm='l2')&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;위와 같이 사이킷런의 preprocessing 모듈을 이용하면&lt;br /&gt;쉽게 L2 정규화를 할 수 있습니다.&lt;br /&gt;&lt;br /&gt;먼저 np.multiply한 결과를&amp;nbsp;tf_idf_before_l2에 담아줍니다.&lt;br /&gt;다음으로는 한 번 reshape를 해주는데, 이러한 과정을 거치는 이유는&lt;br /&gt;&lt;b&gt;L2 정규화의 범위를 전체로&lt;/b&gt; 잡아주기 위한 것입니다.&lt;br /&gt;(그렇지 않으면 각 행 or 열을 기준으로 잡아버립니다)&lt;br /&gt;&lt;br /&gt;마지막으로 &lt;b&gt;preprocessing.normalize&lt;/b&gt; 함수를 통해 &lt;b&gt;L2 정규화를 진행&lt;/b&gt;합니다.&lt;br /&gt;제일 마지막에 norm = 'l2'라고 된 코드로 L2 정규화를 명시해주면 됩니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1566728846940&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tf_idf_after_l2&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1566728862291&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;output:
array([[0.        , 0.        , 0.2170186 , 0.4340372 , 0.36744443,
        0.36744443, 0.        , 0.        , 0.55890191, 0.        ,
        0.        , 0.2170186 , 0.36744443, 0.        , 0.        ]])&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1566728875222&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tfidf_vectorizer.transform(text).toarray()[0]&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1566728892730&quot; class=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;array([0.        , 0.        , 0.2170186 , 0.4340372 , 0.36744443,
       0.36744443, 0.        , 0.        , 0.55890191, 0.        ,
       0.        , 0.2170186 , 0.36744443, 0.        , 0.        ])&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이제&amp;nbsp;&lt;b&gt;tf_idf_after_l2&lt;/b&gt;의 수치가 제대로 나왔는지 비교를 해봅시다.&lt;br /&gt;&lt;/span&gt;&lt;b&gt;모든 값이 정확히 벡터라이저의 값과 일치&lt;/b&gt;하는 것을 확인하실 수 있습니다.&lt;br /&gt;&lt;br /&gt;이런 식으로 TF벡터와 IDF벡터를 곱한 것에&lt;br /&gt;L2정규화까지 거치는 것이 바로 TF-IDF 벡터를 산출하는 과정인 것입니다.&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpURcD/btqxJSPR2ff/N3RrCSGV4nJIjfnmVM64Q1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpURcD/btqxJSPR2ff/N3RrCSGV4nJIjfnmVM64Q1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpURcD/btqxJSPR2ff/N3RrCSGV4nJIjfnmVM64Q1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpURcD%2FbtqxJSPR2ff%2FN3RrCSGV4nJIjfnmVM64Q1%2Fimg.png&quot; data-filename=&quot;blob&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;text-align: center;&quot; data-ke-style=&quot;box&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;(사진: 은공지능 공작소 작업실)&lt;br /&gt;&lt;br /&gt;수고하셨습니다. 오늘은 TF-IDF의 개념을 이해하고&lt;br /&gt;각각의 과정들을 해부해보는 시간을 가졌습니다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;도움이 되셨다면 하단의 &amp;hearts; 버튼 클릭을 해주시길 바랍니다.&lt;br /&gt;긴 포스팅 읽어주셔서 &lt;b&gt;감사합니다.&lt;/b&gt;&lt;/blockquote&gt;</description>
      <category>딥러닝 공부/자연어처리</category>
      <category>DF개념</category>
      <category>IDF개념</category>
      <category>TF-IDF벡터화란</category>
      <category>Tfidf.vocabulary_</category>
      <category>TfidfVectorizer.fit</category>
      <category>TF개념</category>
      <category>은공지능 공작소</category>
      <author>pychan</author>
      <guid isPermaLink="true">https://chan-lab.tistory.com/24</guid>
      <comments>https://chan-lab.tistory.com/24#entry24comment</comments>
      <pubDate>Sun, 25 Aug 2019 19:39:06 +0900</pubDate>
    </item>
  </channel>
</rss>