<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>밸런스 있는 삶</title>
    <link>https://himbopsa.tistory.com/</link>
    <description>안녕하십니까, 저희는 여러가지 과학, 공학 정보를 전달드리는 블로그를 기획, 운영하고 있는 학생들입니다. 
질 좋은 정보로 보답하겠습니다. 감사합니다.
에디터 : AstroPenguin (천문학), 힘법사(전자공학)</description>
    <language>ko</language>
    <pubDate>Wed, 13 May 2026 15:01:22 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>힘법사</managingEditor>
    <image>
      <title>밸런스 있는 삶</title>
      <url>https://tistory1.daumcdn.net/tistory/4294648/attach/81579f55f5be4957bbcf0adc9dfdae20</url>
      <link>https://himbopsa.tistory.com</link>
    </image>
    <item>
      <title>[근황] 밸런스 있는 삶 시즌 1 END, AND.</title>
      <link>https://himbopsa.tistory.com/55</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;음.....우선 저는 마지막 게시글을 쓴 지 3년이 지났고,&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;말투가 많이 점잖아진 것 같나요? 하하&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저희는 대학교에서 만난 친구로 시작했어요. 과도 같고 동아리도 같아서 세 명을 멤버로 엄청 뭉쳐다는 것 같아요. (한 친구는 블로그를 귀찮아합니다.) 그러다가 복학을 하고 각자 해보고 싶은 일이 생겨서 학부연구생(학부인턴)을 시작했어요. 생각해보면 이 때가 저의 학부생활 중에서 가장 돌아가고 싶고 재밌었던 순간 같네요ㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공부하는 감각을 다 까먹은 애들끼리 뭐라도 해보겠다고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방학에도 주말에도 매일 카페에 모여서 공부만 해댔던 것 같아요ㅋㅋㅋ&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;1125&quot; data-origin-height=&quot;2000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eAZn0O/btsCJkfJ8Qq/XCLzJHhzarTayggLKbD9I0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eAZn0O/btsCJkfJ8Qq/XCLzJHhzarTayggLKbD9I0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eAZn0O/btsCJkfJ8Qq/XCLzJHhzarTayggLKbD9I0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeAZn0O%2FbtsCJkfJ8Qq%2FXCLzJHhzarTayggLKbD9I0%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;378&quot; height=&quot;672&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;2000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러다 카페가 안 열면 학교 오픈랩에 들어가서 밤새서 차 끊길 때까지 공부하고 끝나면 캔맥주 하나 먹고 그랬던 것 같아서 순수하게 호기심에 가득차서 달려가던 때가 이따금 그립기도 하더라고요! 그래도 어떻게든 열심히 해서 각자가 속한 연구실에서 결과도 내고 논문도 쓰고 그러면서 각자가 원하는 바를 이루었던 것 같아요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2316&quot; data-origin-height=&quot;2316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wwBKB/btsCLqfpXjS/kKEx0uKBEFYfrLjKBpDmxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wwBKB/btsCLqfpXjS/kKEx0uKBEFYfrLjKBpDmxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wwBKB/btsCLqfpXjS/kKEx0uKBEFYfrLjKBpDmxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwwBKB%2FbtsCLqfpXjS%2FkKEx0uKBEFYfrLjKBpDmxk%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;454&quot; height=&quot;454&quot; data-origin-width=&quot;2316&quot; data-origin-height=&quot;2316&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근황을 말씀드리자면 이 블로그의 원래 주인 &quot;힘법사&quot;님은 전자공학을 졸업하여 관련 기업에 한 번에 취직해서 자신의 일에 흥미와 열정을 가지고 예전 같이 지내고 있습니다. 그리고 저는 우주과학과를 졸업하여 지금은 천문학에 대해서 더 공부하고 싶어서 대학원에 진학했어요. 그래서 사는 곳이 멀어서 자주 만나지는 못하지만 종종 모여서 술 한 잔 하고 있습니다ㅋㅋㅋㅋ스무살에 만났던 애들이 어느 새 취업을 하고 어엿한 사회의 일원이 되었고, 저도 원하는 바를 이루기 위해 달려가는 모습을 보니 가끔은 어색하기도 한데,,,막상 만나면 스무살 때 그대로입니다ㅋㅋㅋㅋㅋㅋ&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;2316&quot; data-origin-height=&quot;3088&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2tkJF/btsCJiPG0Mb/D0jnrzdrsxvgDOYjpz1cm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2tkJF/btsCJiPG0Mb/D0jnrzdrsxvgDOYjpz1cm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2tkJF/btsCJiPG0Mb/D0jnrzdrsxvgDOYjpz1cm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2tkJF%2FbtsCJiPG0Mb%2FD0jnrzdrsxvgDOYjpz1cm1%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;408&quot; height=&quot;544&quot; data-origin-width=&quot;2316&quot; data-origin-height=&quot;3088&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옛날에는 잔뜩 꾸며입고 시끄러운 술집에 가서 밤새 술을 마시고는 했는데, 요새는 그냥 조용한 포차에 들어가서 맥주 하나 시켜놓고 못 만나는 동안 하지 못한 근황토크, 적금, 투자, 자동차, 결혼관에 대한 얘기를 시작한걸 보면 이 블로그를 시작했던 23살 시절 저희의 모습은 많이 사라진 것 같아서 아쉽기도 한데 이 모습도 충분히 보기 좋은 것 같아요!&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;1027&quot; data-origin-height=&quot;1033&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnz04h/btsCDgrq0AF/BJVCWcCAzUkF2frvtQfKe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnz04h/btsCDgrq0AF/BJVCWcCAzUkF2frvtQfKe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnz04h/btsCDgrq0AF/BJVCWcCAzUkF2frvtQfKe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbnz04h%2FbtsCDgrq0AF%2FBJVCWcCAzUkF2frvtQfKe1%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;467&quot; height=&quot;470&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1027&quot; data-origin-height=&quot;1033&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2250&quot; data-origin-height=&quot;3000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uHKZW/btsCKskhcjC/6ESzYrrvwUDKEOZ2MMk4A0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uHKZW/btsCKskhcjC/6ESzYrrvwUDKEOZ2MMk4A0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uHKZW/btsCKskhcjC/6ESzYrrvwUDKEOZ2MMk4A0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuHKZW%2FbtsCKskhcjC%2F6ESzYrrvwUDKEOZ2MMk4A0%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;466&quot; height=&quot;621&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2250&quot; data-origin-height=&quot;3000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2250&quot; data-origin-height=&quot;3000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbZQw7/btsCEKsqNCu/8rrZTTzHgNXl70xW2iNwX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbZQw7/btsCEKsqNCu/8rrZTTzHgNXl70xW2iNwX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbZQw7/btsCEKsqNCu/8rrZTTzHgNXl70xW2iNwX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbZQw7%2FbtsCEKsqNCu%2F8rrZTTzHgNXl70xW2iNwX1%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;479&quot; height=&quot;639&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2250&quot; data-origin-height=&quot;3000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;돌아보니 꽤나 긴 시간 동안 함께 했고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;거기에 이 블로그가 큰 역할을 한 것 같다는 생각이 드네요!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저희는 블로그가 성장함에 따라서 함께 성장하면서 많은 추억과 기억을 쌓은 것 같아요. &lt;b&gt;수익은 왕뚜껑 컵라면 하나 사서 나눠먹을 정도입니다ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ &lt;/b&gt;어쩌면 힘법사와 제가 가장 순수하게 열정과 호기심으로 불타오르던 시절을 고스란히 담아놓은 곳인 것 같아요. 저희가 배우는 학생 입장에서 썼던 글이라 조금 부족할 수 있지만, 그 동안 유용하셨길 바랍니다ㅎㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(참고로 천문학 데이터 FITS 파일에 대한 글은 3년이 지났는데도 꾸준히 월간 조회수 100회 이상이네요ㅋㅋㅋㅋ 꾸준히 찾아와주시는 분들 너무 고마워요!!! 보고 있나? 힘법사? 주인장을 바꿔야 할 것 같지 않나?)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본론으로 돌아오자면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이 채널의 주인장인 힘법사님이 결혼을 했습니다!! 축하해!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 저는 친구 축사를 했는데 엄청 떨어서 거의 랩을 했습니다ㅜㅜ&lt;/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;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdj6Vq/btsCKSccbOI/ENxLgxcujEnZX5BlVyKwb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdj6Vq/btsCKSccbOI/ENxLgxcujEnZX5BlVyKwb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdj6Vq/btsCKSccbOI/ENxLgxcujEnZX5BlVyKwb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbdj6Vq%2FbtsCKSccbOI%2FENxLgxcujEnZX5BlVyKwb1%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;627&quot; height=&quot;836&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무튼 저희가 인생에 있어서 새로운 과정들을 밟고 있어서, 아무도 기다리지는 않았겠지만 저희 블로그는 글이 많이 올라오지 못할 것 같네요,,,,,진짜 주인장은 아니더라고 언젠가 한 번 글을 한 번 더 쓰고 끝내고 싶어서 부득이하게 제가 힘법사 대신에 쓰게 됬네요!! &lt;b&gt;근데 또 사람 일은 모르는거라 언젠가 저희가 글을 또 쓸 수도 있지 않을까요?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블로그가 만들어진 2020년 한 해 동안, 그리고 그 이후에도 3년 동안 전자공학/천문학 관련한 글을 보러 찾아와주신 모든 분들 감사드립니다! 끝은 아니고, 나중에 또 뵐게요~~~~!! 안녕!!!&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;SEASON 1 END, AND.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;힘법사, AstroPenguin&lt;/b&gt;&lt;/p&gt;</description>
      <author>AstroPenguin</author>
      <guid isPermaLink="true">https://himbopsa.tistory.com/55</guid>
      <comments>https://himbopsa.tistory.com/55#entry55comment</comments>
      <pubDate>Tue, 26 Dec 2023 18:01:40 +0900</pubDate>
    </item>
    <item>
      <title>[C/C++] main 함수</title>
      <link>https://himbopsa.tistory.com/54</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;서론&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;안녕하세요, 오늘은 C/C++ 로 프로그램을 할 때 제일 처음 만나게 되는 main 함수에 대한 주제를 정리해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저도 사실은 main 함수에 대해서는 그 전에는 단지 코드 상에서 실행시키게 되면 제일 처음 실행하는 함수 이정로 알고 있었고 깊게는 나아가지 않았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;예전에 배치 파일을 사용하면서 main 함수에 대해서 공부해야겠다.. 생각만 하고 까먹고 넘어갔었는데 오랜만에 생각나서 이렇게 공부해서 정리하게 되었습니다. 자료는 &lt;b&gt;IBM Docs&lt;/b&gt; 자료를 참고하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.ibm.com/docs/en/i/7.1?topic=functions-main-function&quot;&gt;IBM Docs - IBM Documentation&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;main 함수의 실행&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;프로그램이 실행될 때 시스템은 main 함수를 호출하게 됩니다. 이처럼 우리는 프로그래밍을 하면서 코드에서 main 함수가 제일 먼저 실행된다는 것을 아시고 계셨을겁니다. 이 우리가 자주 만나는 main 함수에도 규칙이 있습니다.&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;main 함수의 규칙&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. main 함수는 프로그램에 하나 존재해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;main 함수는 프로그램에 하나 존재해야합니다. main 함수가 없거나 main 함수가 두개 이상이면 안됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1643095723291&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main(void) {
	printf(&quot;Hello World!&quot;);

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 코드는 main 함수가 하나로 실행이 잘 이뤄집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckS4EV/btrrJTGqfCC/o5GMNbyew1BwFqUyIKcbPk/img.png&quot; data-image-src=&quot;https://blog.kakaocdn.net/dn/ckS4EV/btrrJTGqfCC/o5GMNbyew1BwFqUyIKcbPk/img.png&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;193&quot; /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1643095829207&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main(void) {
	printf(&quot;Hello World!&quot;);

	return 0;
}

int main(void) {
	printf(&quot;Hello World!&quot;);

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;반면 해당 코드처럼 main 함수가 두개 이상인 경우 &amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;error C2084: 'int main(void)' 함수에 이미 본문이 있습니다.&amp;nbsp;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해당 메세지와 함께 컴파일 에러를 일으킵니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1643095920114&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int print(void) {
	printf(&quot;Hello World!&quot;);
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;마찬가지로 main 함수가 하나도 없을 경우에도 프로그램이 컴파일 에러를 일으킵니다.&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;2. 프로그램에는 main 함수라 불리는 다른 함수가 존재해서는 안된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1번 사례에서 볼 수 있듯이 main 함수라 불리는 다른 함수가 존재할 경우 컴파일 자체가 진행되지 않겠지요?&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;3. main 함수는 inline static으로 정의되어서는 안된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;우리가 함수를 짤 때 함수를 inline으로 또는 static으로 짤 수 있습니다. main함수에는 불가능하다는 내용입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;++&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지 C와 C++에 공통되는 main 함수의 규칙이었습니다.&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;C++에서는 다른 제약이 추가로 존재&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;4.&amp;nbsp; main은 프로그램 안에서 호출될 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 주로 C++을 사용해왔기 때문에 main을 당연히 재귀함수 마냥 사용하면 안될 것이라고 막연히 생각해왔습니다. 하지만, C에서는 이런 방식이 가능합니다&lt;/p&gt;
&lt;pre id=&quot;code_1643096368487&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int val = 0;

int main(void) {
	if (val == 5) return 0;
	printf(&quot;Hello World!\n&quot;);
	val++;
	return main();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보시면 main 함수 안에서 main을 호출하고 있습니다. main 함수가 자기 자신을 호출하는 코드입니다. 컴파일을 해보면 C에서는 컴파일도 정상적으로 수행되고, 실행도 정상적으로 동작됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1230&quot; data-origin-height=&quot;364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K5B7m/btrrDPrPg1k/U2b4OoAMKiIxNzFq21YXik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K5B7m/btrrDPrPg1k/U2b4OoAMKiIxNzFq21YXik/img.png&quot; data-alt=&quot;C에서 main 함수가 main 함수를 호출한 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K5B7m/btrrDPrPg1k/U2b4OoAMKiIxNzFq21YXik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK5B7m%2FbtrrDPrPg1k%2FU2b4OoAMKiIxNzFq21YXik%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;1230&quot; height=&quot;364&quot; data-origin-width=&quot;1230&quot; data-origin-height=&quot;364&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;C에서 main 함수가 main 함수를 호출한 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ C++에서 main 함수를 호출하면 오류나는 것을 보여드려 했는데... 제 비주얼 스튜디오 2019 컴파일러가 그냥 컴파일 시켜버리네요... 이 부분은 해당 링크를 보시면 될 것 같습니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adfit&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;728x90&lt;/div&gt;
    &lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display: none;&quot; data-ad-unit=&quot;DAN-6NEVqUUGyBWfyhEK&quot; data-ad-width=&quot;728px&quot; data-ad-height=&quot;90px&quot;&gt;&lt;/ins&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/2128321/can-main-function-call-itself-in-c&quot;&gt;Can main function call itself in C++? - Stack Overflow&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1643096946407&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;Can main function call itself in C++?&quot; data-og-description=&quot;Can anybody tell what's the problem of the code below? int main () { return main(); } I tested, it compiles correctly. It's running forever. Anymore trick behind the scene?&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/2128321/can-main-function-call-itself-in-c&quot; data-og-url=&quot;https://stackoverflow.com/questions/2128321/can-main-function-call-itself-in-c&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/UUZdX/hyNb06sso0/8JhjXthiHkpTChRRSK5Vek/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/2128321/can-main-function-call-itself-in-c&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/questions/2128321/can-main-function-call-itself-in-c&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/UUZdX/hyNb06sso0/8JhjXthiHkpTChRRSK5Vek/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316');&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;Can main function call itself in C++?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Can anybody tell what's the problem of the code below? int main () { return main(); } I tested, it compiles correctly. It's running forever. Anymore trick behind the scene?&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stackoverflow.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;5. main 함수의 주소를 취할 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. main 함수는 오버로딩 될 수 없다.&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;argc, argv 파라미터&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;main 함수는 다음과 같은 형태로 보통 작성됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1643097135729&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// case 1
int main(){
	return 0;
}

// case 2
int main(void){
	return 0;
}

//case 3
int main(int argc char *argv[]){
	return 0;
}

//case 4
int main(int argc, char ** argv){
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 case 1 / 2 와 case 3 / 4는 같은 동작을 보여줍니다.&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;case 1과 case 2는 많이 사용는 이유로 많은 분들이 익숙하실 겁니다. 하지만, case 3와 case 4는 아직 만나보시지 못한 분들도 계실 것 같습니다. case 3와 case 4는 main 함수에서 입력 파라미터들을 받도록 조치한 형태입니다. 보시면 int argc라는 integer형 변수를 하나 char 포인터의 배열을 나타내는 argv를 받는 것을 보실 수 있습니다.&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;argc는 argument count를 의미하고, argv는 argument vector를 의미합니다. 즉. argc는 argv의 크기를 나타내고 argv는 간단하게 스트링들의 배열로 생각하시면 됩니다.&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;case 3와 case 4처럼 프로그래밍을 할 경우 main 함수에서 입력 파라미터를 받을 수 있게 됩니다.&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;아래 코드는 main 함수에서 입력 받은 char 포인터의 배열을 출력하도록 만든 코드입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1643097581498&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main(int argc, char *argv[]) {
	int i;
	for (i = 0; i &amp;lt; argc; i++) {
		printf(&quot;%d.%s\n&quot;, i, *(argv + i));
	}
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 코드를 컴파일하게 되면 exe 파일을 하나 얻을 수 있습니다.&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;명령 프롬프트를 켜서 해당 exe 파일이 있는 디렉토리를 써주고 그 뒤에 원하는 글들을 써주면 작동됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어서 제가 생성상 exe 파일이 C:\Users\ys006\source\repos\main\x64\Release에 존재한다고 했을 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C:\Users\ys006\source\repos\main\x64\Release\main.exe Hello World Happy day와 같이 프롬프트에 써주게 되면 아래와 같은 결과를 얻게 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1449&quot; data-origin-height=&quot;763&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvlEbO/btrrF5OK9iQ/lImv47N2rOUnZIZGFnXJK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvlEbO/btrrF5OK9iQ/lImv47N2rOUnZIZGFnXJK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvlEbO/btrrF5OK9iQ/lImv47N2rOUnZIZGFnXJK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvlEbO%2FbtrrF5OK9iQ%2FlImv47N2rOUnZIZGFnXJK0%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;1449&quot; height=&quot;763&quot; data-origin-width=&quot;1449&quot; data-origin-height=&quot;763&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자의 입력 수만큼 argc에 입력이 되었고 입력한 내용들은 모두 argv에 잘 담긴 것을 확인하실 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가적으로 반드시 변수들의 이름이 argc, argv가 아니어도 돌아갑니다.&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;제가 임의로 코드를 아래와 같이 작성하여 실행시켜 보면 파라미터 이름이 argc, argv가 아니지만 잘 동작합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1643098986217&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main(int argument_count, char** argument_vector) {
	int i;
	for (i = 0; i &amp;lt; argument_count; i++) {
		printf(&quot;%d.%s\n&quot;, i + 1, argument_vector[i]);
	}
	getchar();
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvzADb/btrrD86j13t/Ur4tJaVrvXGJr2jmQkIdq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvzADb/btrrD86j13t/Ur4tJaVrvXGJr2jmQkIdq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvzADb/btrrD86j13t/Ur4tJaVrvXGJr2jmQkIdq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvzADb%2FbtrrD86j13t%2FUr4tJaVrvXGJr2jmQkIdq1%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;1094&quot; height=&quot;164&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;164&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;넵 오늘은 main 함수에 대해서 여러가지를 알아보았습니다. 다음에도 좋은 내용 쓸 수 있도록 하겠습니다 감사합니다!&lt;/p&gt;</description>
      <category>C &amp;amp;&amp;amp; C++</category>
      <category>argc</category>
      <category>argv</category>
      <category>C</category>
      <category>C++</category>
      <category>Main</category>
      <category>main function</category>
      <category>main 함수</category>
      <category>main 함수 파라미터</category>
      <category>메인함수</category>
      <category>재귀호출</category>
      <author>힘법사</author>
      <guid isPermaLink="true">https://himbopsa.tistory.com/54</guid>
      <comments>https://himbopsa.tistory.com/54#entry54comment</comments>
      <pubDate>Tue, 25 Jan 2022 17:24:36 +0900</pubDate>
    </item>
    <item>
      <title>[천문학 데이터의 우주론을 통한 분석] Class 문을 활용하여 텍스트 형식의 WMAP 데이터 다루기 (천문학 데이터 분석 입문)-4</title>
      <link>https://himbopsa.tistory.com/53</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;안녕하세요! Class 문을 활용하여 텍스트 형식의 WMAP 데이터 다루기 (천문학 데이터 분석 입문) 4탄으로 돌아왔습니다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이전 과정들은 아래 링크로 첨부해두었으니 참고 부탁드립니다. ^^&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://himbopsa.tistory.com/50&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://himbopsa.tistory.com/50&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1642516623567&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;[Python Class 구문 입문] Class 문을 활용하여 텍스트 형식의 WMAP 데이터 다루기 (천문학 데이터 분석 &quot; data-og-description=&quot;안녕하세요, AstroPenguin입니다! 2탄인 텍스트(.txt) 형식으로 된 WMAP데이터를 통하여 CMB의 Angular Power Spectrum 그래프를 그려낸 게시물로 먼저 찾아뵙고, 순서를 바꾸어 python으로 class구문을 작성하는.&quot; data-og-host=&quot;himbopsa.tistory.com&quot; data-og-source-url=&quot;https://himbopsa.tistory.com/50&quot; data-og-url=&quot;https://himbopsa.tistory.com/50&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/uzsep/hyM9qvshED/tHezSXycaFIYy1W7SwfFy1/img.jpg?width=58&amp;amp;height=95&amp;amp;face=0_0_58_95,https://scrap.kakaocdn.net/dn/bMHBLt/hyM71Yoys2/5KziR2lJhRlPZ8eDbBgb0K/img.jpg?width=58&amp;amp;height=95&amp;amp;face=0_0_58_95&quot;&gt;&lt;a href=&quot;https://himbopsa.tistory.com/50&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://himbopsa.tistory.com/50&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/uzsep/hyM9qvshED/tHezSXycaFIYy1W7SwfFy1/img.jpg?width=58&amp;amp;height=95&amp;amp;face=0_0_58_95,https://scrap.kakaocdn.net/dn/bMHBLt/hyM71Yoys2/5KziR2lJhRlPZ8eDbBgb0K/img.jpg?width=58&amp;amp;height=95&amp;amp;face=0_0_58_95');&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;[Python Class 구문 입문] Class 문을 활용하여 텍스트 형식의 WMAP 데이터 다루기 (천문학 데이터 분석&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요, AstroPenguin입니다! 2탄인 텍스트(.txt) 형식으로 된 WMAP데이터를 통하여 CMB의 Angular Power Spectrum 그래프를 그려낸 게시물로 먼저 찾아뵙고, 순서를 바꾸어 python으로 class구문을 작성하는.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;himbopsa.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://himbopsa.tistory.com/49&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://himbopsa.tistory.com/49&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1642516634931&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;[Python(파이썬) 텍스트(.txt) 형식 천문학 데이터 다루기] Class 문을 활용하여 텍스트 형식의 WMAP 데&quot; data-og-description=&quot;안녕하세요, 거의 1년만에 새로운 글로 찾아뵙게 되었습니다. 학생회장과 학부연구생, 대외활동으로 블로그에 글을 쓰지 못하였습니다. 작년 또한 마찬가지로 파이썬으로 천문학 공부를 해보았&quot; data-og-host=&quot;himbopsa.tistory.com&quot; data-og-source-url=&quot;https://himbopsa.tistory.com/49&quot; data-og-url=&quot;https://himbopsa.tistory.com/49&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/imWVl/hyM8antSEx/9N2459BiA2FwnAdfwS7Nv1/img.png?width=604&amp;amp;height=464&amp;amp;face=0_0_604_464,https://scrap.kakaocdn.net/dn/MZLvs/hyM715acyh/iGsbCCpK276p5DytwISNk0/img.png?width=604&amp;amp;height=464&amp;amp;face=0_0_604_464,https://scrap.kakaocdn.net/dn/9WRWI/hyM9m0TrRE/c8QrUZ02HNtOW14dfq8FB1/img.jpg?width=1739&amp;amp;height=868&amp;amp;face=0_0_1739_868&quot;&gt;&lt;a href=&quot;https://himbopsa.tistory.com/49&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://himbopsa.tistory.com/49&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/imWVl/hyM8antSEx/9N2459BiA2FwnAdfwS7Nv1/img.png?width=604&amp;amp;height=464&amp;amp;face=0_0_604_464,https://scrap.kakaocdn.net/dn/MZLvs/hyM715acyh/iGsbCCpK276p5DytwISNk0/img.png?width=604&amp;amp;height=464&amp;amp;face=0_0_604_464,https://scrap.kakaocdn.net/dn/9WRWI/hyM9m0TrRE/c8QrUZ02HNtOW14dfq8FB1/img.jpg?width=1739&amp;amp;height=868&amp;amp;face=0_0_1739_868');&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;[Python(파이썬) 텍스트(.txt) 형식 천문학 데이터 다루기] Class 문을 활용하여 텍스트 형식의 WMAP 데&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요, 거의 1년만에 새로운 글로 찾아뵙게 되었습니다. 학생회장과 학부연구생, 대외활동으로 블로그에 글을 쓰지 못하였습니다. 작년 또한 마찬가지로 파이썬으로 천문학 공부를 해보았&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;himbopsa.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://himbopsa.tistory.com/52&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://himbopsa.tistory.com/52&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1642521421464&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;[matplotlib x축 숫자 간격 일치시켜 plot하기] Class 문을 활용하여 텍스트 형식의 WMAP 데이터 다루기 (&quot; data-og-description=&quot;안녕하세요! Class 문을 활용하여 텍스트 형식의 WMAP 데이터 다루기 (천문학 데이터 분석 입문) 3탄으로 돌아왔습니다! 이전 과정들은 아래 링크로 첨부해두었으니 참고 부탁드립니다. ^^ https://himb&quot; data-og-host=&quot;himbopsa.tistory.com&quot; data-og-source-url=&quot;https://himbopsa.tistory.com/52&quot; data-og-url=&quot;https://himbopsa.tistory.com/52&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/haMj5/hyM72psDoJ/W4RZzko7u3C6UzPG4ZJhz1/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/TXPxi/hyM9t6OSdK/sdXuK66NMeLnT3R9Y7tbtk/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/cfiMXC/hyM9gsSfFg/qtEd1s5aYkELKukr39oOO1/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://himbopsa.tistory.com/52&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://himbopsa.tistory.com/52&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/haMj5/hyM72psDoJ/W4RZzko7u3C6UzPG4ZJhz1/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/TXPxi/hyM9t6OSdK/sdXuK66NMeLnT3R9Y7tbtk/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/cfiMXC/hyM9gsSfFg/qtEd1s5aYkELKukr39oOO1/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&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;[matplotlib x축 숫자 간격 일치시켜 plot하기] Class 문을 활용하여 텍스트 형식의 WMAP 데이터 다루기 (&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요! Class 문을 활용하여 텍스트 형식의 WMAP 데이터 다루기 (천문학 데이터 분석 입문) 3탄으로 돌아왔습니다! 이전 과정들은 아래 링크로 첨부해두었으니 참고 부탁드립니다. ^^ https://himb&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;himbopsa.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;안녕하세요! Class 문을 활용하여 텍스트 형식의 WMAP 데이터 다루기 (천문학 데이터 분석 입문)의 마지막 시리즈인 Angluar Spectrum 그래프에 대한 천문학적인 해석을 들고 찾아왔습니다. 그럼 지금부터 시작하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;우선 직관적으로 그래프를 바라보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;90도에서 가장 작은 온도 변화를 보이고, 점점 증가하다가 1도에서 최고치를 보이고, 각도가 너무 작아지면 그 값이 줄어드는 것을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;440&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0SRGP/btrq7bn0kvi/aQW9golZKEBKp12O6VTkK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0SRGP/btrq7bn0kvi/aQW9golZKEBKp12O6VTkK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0SRGP/btrq7bn0kvi/aQW9golZKEBKp12O6VTkK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0SRGP%2Fbtrq7bn0kvi%2FaQW9golZKEBKp12O6VTkK0%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;440&quot; height=&quot;296&quot; data-origin-width=&quot;440&quot; data-origin-height=&quot;296&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 그래프에서 temperature power spectrum의 세기가 가장 높은 지점이 angular scale이 1도가 되는 지점임을 알 수 있습니다. 즉 angular scale이 1도가 되는 지점에서 온도의 요동이 가장 많은 것이고, 이는 에너지의 교환이 가장 많다고 해석될 수 있습니다. 에너지 교환이 가장 많기에 우주 공간의 물질들은 밀도의 차이를 보일 수 있을 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(만약 모든 물질이 동일한 에너지를 가진다고 치면 물질간의 상호작용이 없겠죠? 그럼 물질은 움직이지도 않고 제자리에 가만히 있을 것입니다. 그러나 에너지와 온도의 차이 또는 요동이 크다면 물질은 상호작용 또는 이동을 하게 되고 밀도가 달라질 수 있는 것입니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그렇게 우주 공간의 물질들 사이에 밀도 차이가 나타나면, 밀도가 높은 곳으로 물질들이 붕괴하게 되고 모이게 됩니다. 그리고 이러한 관측적 사실은 현재의 우주론 모델인 LambdaCDM model이 맞았음을 입증해주는 결과이기도 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이를 그림으로 나타내면 다음과 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bamUHw/btrq35h4Bkj/gK017An1BqlaxnspXPvog0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bamUHw/btrq35h4Bkj/gK017An1BqlaxnspXPvog0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bamUHw/btrq35h4Bkj/gK017An1BqlaxnspXPvog0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbamUHw%2Fbtrq35h4Bkj%2FgK017An1BqlaxnspXPvog0%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;670&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이는 우주배경복사인 CMB(Cosmic Microwave Background, 우주 마이크로파 배경복사)의 사진이고, 제가 그린 그래프는 우주 마이크로파 배경복사의 각도에 따른 온도 변화를 나타낸 그래프입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;위의 그림에서 영역의 크기가 커질수록(면적에 대응하는 각이 커질수록) 온도 변화의 폭은 적은 것을 볼 수 있습니다. 그렇기에 큰 Angular Scale 의 경우,&amp;nbsp; 그래프에서 보다시피 temperature power spectrum값이 작으므로, 요동(perturbation)이 작습니다. 그렇기에 물질은 상호작용을 하지 않고 붕괴도 하지 않습니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;반대로 그림에서 빨갛고 작은 점을 보면 그 면적이 매우 작은 것을 알 수 있고 이를 각도에 대응시키면 작은 각도임을 알 수 있습니다. 1도 정도의 Angular Scale에서는 temperature power spectrum값이 매우 크고, 요동(perturbation)이 크다는 뜻이기에 물질은 상호작용을 하며 붕괴를 하게 되어 한 점으로 모이고 구조물을 만들게 됩니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;그러므로 이를 종합해보면 저희가 이번에 그린 우주 마이크로파 배경복사의 Angluar Spectrum 그래프 통하여 작은 Angular Scale에서 작은 구조물부터 생성되는 Bottom-up 이론이 맞았음을 확인할 수 있습니다. 즉 low mass scale이 이른 시기에 collapse한다는 현재의 우주론인 &amp;Lambda;CDM model을 맞았음을 다시금 확인할 수 있습니다. 이는 우주론에서 매우 중요한 사실이며 다음의 그래프와 이론은 천문학과 학생들이 배우는 현대우주론의 기반이 되는 내용입니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그래프에 대한 해석은 여기까지입니다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;여태까지 3개의 게시물을 거쳐 텍스트 형식의 천문학 데이터들 중 하나인 WMAP의 multiploe moment와 temperature power spectrum 데이터를 파이썬을 통하여 열고, class구문을 통하여 가공 후 Angluar Spectrum 그래프를 그리는 코드를 작성하여 그래프를 나타내었고, 구글에 나온 이미지와 거의 일치시켰습니다. 마지막으로 그래프의 해석을 통하여 현재의 우주론에 대하여 살짝 알아보았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이와 같이 천문학을 하기 위해서는 데이터를 코딩을 통하여 분석하고, 분석 및 가공된 그래프를 통하여 과학적 사실을 추론해내는 과정과 능력이 필요합니다. 재미있으셨나요?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;제 게시물을 보고 천문학 전공자가 아니어도 코딩을 하시는 분들 중에 특이한 데이터를 원하시는 분들과 천문학에 입문하시는 분들이 즐겁게 실습하셨으면 좋겠습니다. 다음에는 더 좋은 게시물로 찾아뵙도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;감사합니다!! :)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>과학/천문학</category>
      <category>python 우주론</category>
      <category>python 천문학</category>
      <category>우주론 코딩</category>
      <category>천문학 데이터</category>
      <category>천문학 코딩</category>
      <category>파이썬 우주론</category>
      <category>파이썬 천문학</category>
      <category>현대우주론</category>
      <author>AstroPenguin</author>
      <guid isPermaLink="true">https://himbopsa.tistory.com/53</guid>
      <comments>https://himbopsa.tistory.com/53#entry53comment</comments>
      <pubDate>Wed, 19 Jan 2022 01:11:07 +0900</pubDate>
    </item>
    <item>
      <title>[matplotlib x축 숫자 간격 일치시켜 plot하기] Class 문을 활용하여 텍스트 형식의 WMAP 데이터 다루기 (천문학 데이터 분석 입문)-3</title>
      <link>https://himbopsa.tistory.com/52</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요! Class 문을 활용하여 텍스트 형식의 WMAP 데이터 다루기 (천문학 데이터 분석 입문) 3탄으로 돌아왔습니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;이전 과정들은 아래 링크로 첨부해두었으니 참고 부탁드립니다. ^^&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;a href=&quot;https://himbopsa.tistory.com/50&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://himbopsa.tistory.com/50&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1642516623567&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;[Python Class 구문 입문] Class 문을 활용하여 텍스트 형식의 WMAP 데이터 다루기 (천문학 데이터 분석 &quot; data-og-description=&quot;안녕하세요, AstroPenguin입니다! 2탄인 텍스트(.txt) 형식으로 된 WMAP데이터를 통하여 CMB의 Angular Power Spectrum 그래프를 그려낸 게시물로 먼저 찾아뵙고, 순서를 바꾸어 python으로 class구문을 작성하는.&quot; data-og-host=&quot;himbopsa.tistory.com&quot; data-og-source-url=&quot;https://himbopsa.tistory.com/50&quot; data-og-url=&quot;https://himbopsa.tistory.com/50&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/uzsep/hyM9qvshED/tHezSXycaFIYy1W7SwfFy1/img.jpg?width=58&amp;amp;height=95&amp;amp;face=0_0_58_95,https://scrap.kakaocdn.net/dn/bMHBLt/hyM71Yoys2/5KziR2lJhRlPZ8eDbBgb0K/img.jpg?width=58&amp;amp;height=95&amp;amp;face=0_0_58_95&quot;&gt;&lt;a href=&quot;https://himbopsa.tistory.com/50&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://himbopsa.tistory.com/50&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/uzsep/hyM9qvshED/tHezSXycaFIYy1W7SwfFy1/img.jpg?width=58&amp;amp;height=95&amp;amp;face=0_0_58_95,https://scrap.kakaocdn.net/dn/bMHBLt/hyM71Yoys2/5KziR2lJhRlPZ8eDbBgb0K/img.jpg?width=58&amp;amp;height=95&amp;amp;face=0_0_58_95');&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;[Python Class 구문 입문] Class 문을 활용하여 텍스트 형식의 WMAP 데이터 다루기 (천문학 데이터 분석&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요, AstroPenguin입니다! 2탄인 텍스트(.txt) 형식으로 된 WMAP데이터를 통하여 CMB의 Angular Power Spectrum 그래프를 그려낸 게시물로 먼저 찾아뵙고, 순서를 바꾸어 python으로 class구문을 작성하는.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;himbopsa.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;a href=&quot;https://himbopsa.tistory.com/49&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://himbopsa.tistory.com/49&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1642516634931&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;[Python(파이썬) 텍스트(.txt) 형식 천문학 데이터 다루기] Class 문을 활용하여 텍스트 형식의 WMAP 데&quot; data-og-description=&quot;안녕하세요, 거의 1년만에 새로운 글로 찾아뵙게 되었습니다. 학생회장과 학부연구생, 대외활동으로 블로그에 글을 쓰지 못하였습니다. 작년 또한 마찬가지로 파이썬으로 천문학 공부를 해보았&quot; data-og-host=&quot;himbopsa.tistory.com&quot; data-og-source-url=&quot;https://himbopsa.tistory.com/49&quot; data-og-url=&quot;https://himbopsa.tistory.com/49&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/imWVl/hyM8antSEx/9N2459BiA2FwnAdfwS7Nv1/img.png?width=604&amp;amp;height=464&amp;amp;face=0_0_604_464,https://scrap.kakaocdn.net/dn/MZLvs/hyM715acyh/iGsbCCpK276p5DytwISNk0/img.png?width=604&amp;amp;height=464&amp;amp;face=0_0_604_464,https://scrap.kakaocdn.net/dn/9WRWI/hyM9m0TrRE/c8QrUZ02HNtOW14dfq8FB1/img.jpg?width=1739&amp;amp;height=868&amp;amp;face=0_0_1739_868&quot;&gt;&lt;a href=&quot;https://himbopsa.tistory.com/49&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://himbopsa.tistory.com/49&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/imWVl/hyM8antSEx/9N2459BiA2FwnAdfwS7Nv1/img.png?width=604&amp;amp;height=464&amp;amp;face=0_0_604_464,https://scrap.kakaocdn.net/dn/MZLvs/hyM715acyh/iGsbCCpK276p5DytwISNk0/img.png?width=604&amp;amp;height=464&amp;amp;face=0_0_604_464,https://scrap.kakaocdn.net/dn/9WRWI/hyM9m0TrRE/c8QrUZ02HNtOW14dfq8FB1/img.jpg?width=1739&amp;amp;height=868&amp;amp;face=0_0_1739_868');&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;[Python(파이썬) 텍스트(.txt) 형식 천문학 데이터 다루기] Class 문을 활용하여 텍스트 형식의 WMAP 데&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요, 거의 1년만에 새로운 글로 찾아뵙게 되었습니다. 학생회장과 학부연구생, 대외활동으로 블로그에 글을 쓰지 못하였습니다. 작년 또한 마찬가지로 파이썬으로 천문학 공부를 해보았&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;himbopsa.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;이전 과정들에서 x축 값인 1, 10, 100, 1000의 간격이 실제 숫자 간격에 맞게 배치되어있으나 궁극적으로 만들고자 하였던 그래프에서는 1, 10, 100, 1000의 간격이 모두 똑같게 배치되어있기에 그리고자 하는 모양과 실제 모양이 달라진 아쉬움을 극복하는 과정으로 찾아뵙게 되었습니다. 저는 여기서 트릭을 살짝 사용하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;그 트릭을 예를 들어 설명하자면 x1 = [1,5,10,100,1000]의 array를 같은 간격으로 표시하기 위해서&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;임의로 x2 = [0,1,2,3,4]의 array를 생성하여 x1 대신에 x2를 plot의 x축 값으로 두어 그래프를 그리는 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;이를 그림으로 표현하면 다음과 같습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;제목 없음.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNdSqw/btrq8JEv6mB/IKgHxGLZV20tw6ZLQ8lKo1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNdSqw/btrq8JEv6mB/IKgHxGLZV20tw6ZLQ8lKo1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNdSqw/btrq8JEv6mB/IKgHxGLZV20tw6ZLQ8lKo1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNdSqw%2Fbtrq8JEv6mB%2FIKgHxGLZV20tw6ZLQ8lKo1%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;1920&quot; height=&quot;1080&quot; data-filename=&quot;제목 없음.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;x2로 만들어진 배열에 plt.xticks([0,1,2,3,4], ['1','5','10','100','1000'])를 적어넣어 그래프 내에서 균일한 간격을 가진 위치에 원래의 값을 문자의 형태로 이름붙여주는 방식을 거치면 서로 다른 간격의 값들이어도 그래프 상에는 서로 같은 간격을 가지게끔 나타낼 수 있습니다. 그리고 이를 WMAP 클래스에 적용하면 다음과 같습니다. Angular_Spectrum_plot 함수를 다음과 같이 고쳐주어야 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1642516281562&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    def Angular_Spectrum_plot(self): # multipole momentum의 간격이 일정한 그래프를 그리는 코드
        x = np.array(self.multipole_moment)
        y = np.array(self.real_WMAP_power())
        x_point = range(len(y))
        self.size = 20
        
        plt.figure(figsize=(11,7))
        plt.errorbar(x_point,y,yerr=self.power_err,c='red')
        plt.scatter(x_point,y,c='black',s=30,marker='d')
        plt.title('The CMB Angular Spectrum', fontsize = self.size)
        plt.xlabel('Multipole Moment (l)', fontsize = self.size)
        plt.ylabel(r&quot;$\Delta T$&quot; +&quot; &quot; + r&quot;[$\mu K^2$]&quot;, fontsize = self.size)
        plt.xticks([3,15,31,41], ['10','100','500','1000'],fontsize = self.size)
        plt.yticks([1000*(y) for y in range(7)], fontsize = self.size)
        plt.show()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 수정을 거쳐 그래프를 다시 그리면 다음과 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvnfSm/btrq9Yg8qrA/ULe6LwBCGaEJfF7lMwt86k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvnfSm/btrq9Yg8qrA/ULe6LwBCGaEJfF7lMwt86k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvnfSm/btrq9Yg8qrA/ULe6LwBCGaEJfF7lMwt86k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvnfSm%2Fbtrq9Yg8qrA%2FULe6LwBCGaEJfF7lMwt86k%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;716&quot; height=&quot;464&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;464&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/24oiW/btrq7G853BH/LyqW4kBSIbKtEImjJWtSj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/24oiW/btrq7G853BH/LyqW4kBSIbKtEImjJWtSj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/24oiW/btrq7G853BH/LyqW4kBSIbKtEImjJWtSj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F24oiW%2Fbtrq7G853BH%2FLyqW4kBSIbKtEImjJWtSj1%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;716&quot; height=&quot;464&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;464&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 이 곳에서 Multipole Moment을 Angular Scale로 나타내어 두 그래프에 각도와 Multipole Moment&amp;nbsp;전부를 볼 수 있게 코드를 더 수정하였습니다. &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;이 때 Angular Scale(degree)&amp;nbsp;= 180(degree) / 10^Multipole Moment (I)으로 Angular &lt;b&gt;Scale&lt;/b&gt;란 180도를 10의 Multipole Moment (I)승으로 나누어준 값을 의미합니다. 이는 추후에 그래프 분석에 큰 역할을 합니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1642516369570&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;###최종 수정 코드###
class WMAP():
    def __init__(self):
        self.multipole_moment = []
        self.TT_power_spec = []
        self.power_err = []
        
    def readfile(self, filename): # 텍스트 형식의 파일을 여는 코드
        try:
            file = open(filename,'r')
            del_2nd_row = file.readline()
            
            for line in file:
                line = line.strip()
                columns = line.split()
                self.multipole_moment.append(float(columns[0]))
                self.TT_power_spec.append(float(columns[3]))
                self.power_err.append(float(columns[6]))
            file.close()
        except:
            print('FileNotFoundError : Please check your filename')
        
    def real_WMAP_power(self): # 오차를 빼서 정확한 값을 찾는 코드
        observated_value = np.array(self.TT_power_spec)
        error_value = np.array(self.power_err)
        real_value = observated_value - error_value
        return real_value
    
    def Angular_Spectrum_plot(self): # 그래프를 그리는 코드(최종)
        x = np.array(self.multipole_moment)
        y = np.array(self.real_WMAP_power())
        x_point = range(len(y))
        self.title = 15
        self.size = 12

        fig, ax = plt.subplots(constrained_layout=True)
        ax.plot(x_point,y, c = 'r')
        ax.set_xlabel(r&quot;Angular Scale ($\degree$)&quot;, fontsize = self.size)
        ax.set_ylabel(r&quot;$\Delta T$&quot; +&quot; &quot; + r&quot;[$\mu K^2$]&quot;, fontsize = self.size)
        
        def l_to_degree(x):
            angle = 180./x
            return angle
        
        def degree_to_l(x):
            l = 180./x
            return l
        
        secax = ax.secondary_xaxis('top')#, functions=(l_to_degree, degree_to_l))
        secax.set_xlabel('Multipole Moment (l)', fontsize = self.size)
        secax.set_xticks([0])
        
        plt.errorbar(x_point,y,yerr=self.power_err,c='red')
        plt.scatter(x_point,y,c='black',s=20,marker='d')
        plt.title('The CMB Angular Spectrum', fontsize = self.title)
        #plt.xlabel('Multipole Moment (l)', fontsize = self.size)
        plt.ylabel(r&quot;$\Delta T$&quot; +&quot; &quot; + r&quot;[$\mu K^2$]&quot;, fontsize = self.size)
        plt.xticks([0,3,21,41], labels=[r&quot;90$\degree$&quot;,r&quot;18$\degree$&quot;,r&quot;1$\degree$&quot;,r&quot;0.2$\degree$&quot;], fontsize = self.size)
        plt.yticks([1000*(y+1) for y in range(6)], fontsize = self.size)
        plt.text(3,5600,'10')
        plt.text(15,5600,'100')
        plt.text(31,5600,'500')
        plt.text(41,5600,'1000')
        plt.show()
        # r&quot;{$l(l+1)\C_1/2\pi$}&quot;
        
    def log10_Angular_Spectrum_plot(self): # 로그 스케일의 그래프를 그리는 코드(최종)
        x = np.log10(np.array(self.multipole_moment))
        y = np.array(self.real_WMAP_power())
        self.title = 15
        self.size = 12
        
        fig, ax = plt.subplots(constrained_layout=True)
        ax.plot(x,y, c = 'b')
        ax.set_xlabel(r&quot;Angular Scale ($\degree$)&quot;, fontsize = self.size)
        ax.set_ylabel(r&quot;$\Delta T$&quot; +&quot; &quot; + r&quot;[$\mu K^2$]&quot;, fontsize = self.size)

        
        def l_to_degree(x):
            angle = 180./(10**x)
            return angle
        
        secax = ax.secondary_xaxis('top')
        secax.set_xlabel('Log Multipole Moment (Log l)', fontsize = self.size)

        plt.errorbar(x,y,yerr=self.power_err,c='b')
        plt.scatter(x,y,c='black',s=20,marker='d')
        plt.title('The Log-Scale CMB Angular Spectrum', fontsize = self.title)
        plt.xticks(np.arange(0.5, 3.5, 0.5), labels=[r&quot;90$\degree$&quot;,r&quot;18$\degree$&quot;,r&quot;5.69$\degree$&quot;,r&quot;1.80$\degree$&quot;,r&quot;0.57$\degree$&quot;, r&quot;0.18$\degree$&quot;], fontsize = self.size)
        plt.show()

WMAP = WMAP()
WMAP.readfile('WMAP_TT_power_spec.txt')
WMAP.Angular_Spectrum_plot()
WMAP.log10_Angular_Spectrum_plot()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정된 코드로 그려진 결과물은 다음과 같고 제가 궁극적으로 원하던 그래프와 거의 유사한 형태를 보임을 알 수 있습니다. 그렇다면 이 그래프가 뜻하는 바는 무엇일까요? 이에 대해서는 분량이 너무 길어져 다음 게시물로 찾아뵙도록 하겠습니다. 읽어주셔서 감사합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;440&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqbFDK/btrq8sQhc76/1K5wVLs3vWXykvTPmL3R91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqbFDK/btrq8sQhc76/1K5wVLs3vWXykvTPmL3R91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqbFDK/btrq8sQhc76/1K5wVLs3vWXykvTPmL3R91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqbFDK%2Fbtrq8sQhc76%2F1K5wVLs3vWXykvTPmL3R91%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;440&quot; height=&quot;296&quot; data-origin-width=&quot;440&quot; data-origin-height=&quot;296&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;440&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rdiWt/btrq8JEwkAm/ZBBfIUW1XcotXvZytu18T1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rdiWt/btrq8JEwkAm/ZBBfIUW1XcotXvZytu18T1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rdiWt/btrq8JEwkAm/ZBBfIUW1XcotXvZytu18T1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrdiWt%2Fbtrq8JEwkAm%2FZBBfIUW1XcotXvZytu18T1%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;440&quot; height=&quot;296&quot; data-origin-width=&quot;440&quot; data-origin-height=&quot;296&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>과학/천문학</category>
      <category>matplotlib</category>
      <category>python x축 간격</category>
      <category>그래프 x축 간격</category>
      <category>파이썬 x축 간격</category>
      <category>파이썬 축 간격</category>
      <category>파이썬x축</category>
      <category>파이썬그래프</category>
      <author>AstroPenguin</author>
      <guid isPermaLink="true">https://himbopsa.tistory.com/52</guid>
      <comments>https://himbopsa.tistory.com/52#entry52comment</comments>
      <pubDate>Wed, 19 Jan 2022 00:55:46 +0900</pubDate>
    </item>
    <item>
      <title>[C] 입력 버퍼 비우기</title>
      <link>https://himbopsa.tistory.com/51</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;C 언어로 프로그램을 짜다 보면&lt;/p&gt;
&lt;pre id=&quot;code_1642516588106&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int main(void){
	char buf[10];
	scanf(&quot;%s&quot;, &amp;amp;buf);
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 경우와 같이 입력을 사용자로부터 받아와야 하는 경우를 만나보셨을 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저도 최근에 제 친구가 C언어로 다이아몬드 출력하는 부분을 연습 코드로 만들고 있는 것을 보고 저도 재밌을 것 같아서 같이 만들었는데요, 그때 사용자로부터 입력을 받으면서 문제를 하나 만났습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1642516710819&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int main(void) {
	
	int size;
	char blank_sym;
	char sym;
	printf(&quot;Please enter the size of diamond shape : &quot;);
	scanf(&quot;%d&quot;, &amp;amp;size);

	printf(&quot;Please enter blank symbol which you want to use : &quot;);
	scanf(&quot;%c&quot;, &amp;amp;blank_sym);

	printf(&quot;Please enter symbol which you want to use : &quot;);
	scanf(&quot;%c&quot;, &amp;amp;sym);
	print_dia(sym,blank_sym, size);
	return 0;
}&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;이게 문제의 코드입니다. main 함수를 확인하면, 사용자로 부터 입력을 총 3라인에서 받는 것을 확인할 수 있습니다. 자 그러면 원하는 동작 순서는 다음과 같습니다.&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;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 사용자로부터 다이아몬드의 배경으로 사용할 char를 입력받는다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 사용자로부터 다이아몬드를 표현할 char를 입력받는다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자 어떻게 될까요?&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adfit&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;728x90&lt;/div&gt;
    &lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display: none;&quot; data-ad-unit=&quot;DAN-6NEVqUUGyBWfyhEK&quot; data-ad-width=&quot;728px&quot; data-ad-height=&quot;90px&quot;&gt;&lt;/ins&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1379&quot; data-origin-height=&quot;726&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dCJB1P/btrq23ZnBX8/6WgNzF8MwJJnmjLQyd7ml0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dCJB1P/btrq23ZnBX8/6WgNzF8MwJJnmjLQyd7ml0/img.png&quot; data-alt=&quot;그림1. 문제 상황&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dCJB1P/btrq23ZnBX8/6WgNzF8MwJJnmjLQyd7ml0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdCJB1P%2Fbtrq23ZnBX8%2F6WgNzF8MwJJnmjLQyd7ml0%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;1379&quot; height=&quot;726&quot; data-origin-width=&quot;1379&quot; data-origin-height=&quot;726&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림1. 문제 상황&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보시면 제가 5를 입력을 해준 후에&amp;nbsp;&lt;b&gt;2 과정을&lt;/b&gt; 생략하고 바로 3번째 입력을 받아버립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러면 프로그램이 원하는 의도로 동작하지 못하겠죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 일이 발생하는 이유는 엔터 입력(\n)이 입력 버퍼에 남아 사용하자가 입력하지 않았지만 프로그램이 입력으로 받아 동작했기 때문입니다.&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;이를 해결해주는 방법으로 저는 과거에는 해당 일이 발생하는 부분에 모두 getchar();를 삽입 주었습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1642517183993&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int main(void) {
	
	int size;
	char blank_sym;
	char sym;
	printf(&quot;Please enter the size of diamond shape : &quot;);
	scanf(&quot;%d&quot;, &amp;amp;size);
	getchar();
	printf(&quot;Please enter blank symbol which you want to use : &quot;);
	scanf(&quot;%c&quot;, &amp;amp;blank_sym);
	getchar();
	printf(&quot;Please enter symbol which you want to use : &quot;);
	scanf(&quot;%c&quot;, &amp;amp;sym);
	print_dia(sym,blank_sym, size);
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 써주게 되면 입력 버퍼에 남아있는 \n가 getchar(); 에 의해서 제거되게 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1229&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTB2Z1/btrq7avQSwo/gXW9j5dEUJTNboCNxIr9r1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTB2Z1/btrq7avQSwo/gXW9j5dEUJTNboCNxIr9r1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTB2Z1/btrq7avQSwo/gXW9j5dEUJTNboCNxIr9r1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTB2Z1%2Fbtrq7avQSwo%2FgXW9j5dEUJTNboCNxIr9r1%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;1229&quot; height=&quot;370&quot; data-origin-width=&quot;1229&quot; data-origin-height=&quot;370&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램이 아주 잘 동작하죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 다른 방법은 무엇이 있을까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 최근에는 while(getchar() != '\n')를 사용해주고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 해석을 해보면, '\n'가 사라질 때까지 getchar()를 호출해주겠다는 의미가 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 적용해 코드를 만들어 보면 아래처럼 쓸 수 있겠죠&lt;/p&gt;
&lt;pre id=&quot;code_1642517368994&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int main(void) {
	
	int size;
	char blank_sym;
	char sym;
	printf(&quot;Please enter the size of diamond shape : &quot;);
	scanf(&quot;%d&quot;, &amp;amp;size);

	printf(&quot;Please enter blank symbol which you want to use : &quot;);
	while (getchar() != '\n');
	scanf(&quot;%c&quot;, &amp;amp;blank_sym);

	printf(&quot;Please enter symbol which you want to use : &quot;);
	while (getchar() != '\n');
	scanf(&quot;%c&quot;, &amp;amp;sym);
	print_dia(sym,blank_sym, size);
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1245&quot; data-origin-height=&quot;529&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdbHz6/btrq7HfPJgj/bX2An1hU2FgNkJzBwRNss1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdbHz6/btrq7HfPJgj/bX2An1hU2FgNkJzBwRNss1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdbHz6/btrq7HfPJgj/bX2An1hU2FgNkJzBwRNss1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdbHz6%2Fbtrq7HfPJgj%2FbX2An1hU2FgNkJzBwRNss1%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;1245&quot; height=&quot;529&quot; data-origin-width=&quot;1245&quot; data-origin-height=&quot;529&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마찬가지로 실행결과 또한 훌륭합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음에도 좋은 포스팅으로 돌아오겠습니다 감사합니다!&lt;/p&gt;</description>
      <category>C &amp;amp;&amp;amp; C++</category>
      <category>C</category>
      <category>C 언어</category>
      <category>C 입력</category>
      <category>C언어 예제</category>
      <category>getchar</category>
      <category>scanf</category>
      <category>\n</category>
      <category>문자입력</category>
      <category>사용자 입력</category>
      <category>입력 버퍼</category>
      <author>힘법사</author>
      <guid isPermaLink="true">https://himbopsa.tistory.com/51</guid>
      <comments>https://himbopsa.tistory.com/51#entry51comment</comments>
      <pubDate>Tue, 18 Jan 2022 23:52:58 +0900</pubDate>
    </item>
    <item>
      <title>[Python Class 구문 입문] Class 문을 활용하여 텍스트 형식의 WMAP 데이터 다루기 (천문학 데이터 분석 입문)-1</title>
      <link>https://himbopsa.tistory.com/50</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, AstroPenguin입니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2탄인 텍스트(.txt) 형식으로 된 WMAP데이터를 통하여 CMB의 Angular Power Spectrum 그래프를 그려낸 게시물로 먼저 찾아뵙고, 순서를 바꾸어 python으로 class구문을 작성하는 기초에 대한 게시물로 찾아뵙게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://himbopsa.tistory.com/49&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://himbopsa.tistory.com/49&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1642516069796&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;[Python(파이썬) 텍스트(.txt) 형식 천문학 데이터 다루기] Class 문을 활용하여 텍스트 형식의 WMAP 데&quot; data-og-description=&quot;안녕하세요, 거의 1년만에 새로운 글로 찾아뵙게 되었습니다. 학생회장과 학부연구생, 대외활동으로 블로그에 글을 쓰지 못하였습니다. 작년 또한 마찬가지로 파이썬으로 천문학 공부를 해보았&quot; data-og-host=&quot;himbopsa.tistory.com&quot; data-og-source-url=&quot;https://himbopsa.tistory.com/49&quot; data-og-url=&quot;https://himbopsa.tistory.com/49&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/imWVl/hyM8antSEx/9N2459BiA2FwnAdfwS7Nv1/img.png?width=604&amp;amp;height=464&amp;amp;face=0_0_604_464,https://scrap.kakaocdn.net/dn/MZLvs/hyM715acyh/iGsbCCpK276p5DytwISNk0/img.png?width=604&amp;amp;height=464&amp;amp;face=0_0_604_464,https://scrap.kakaocdn.net/dn/9WRWI/hyM9m0TrRE/c8QrUZ02HNtOW14dfq8FB1/img.jpg?width=1739&amp;amp;height=868&amp;amp;face=0_0_1739_868&quot;&gt;&lt;a href=&quot;https://himbopsa.tistory.com/49&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://himbopsa.tistory.com/49&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/imWVl/hyM8antSEx/9N2459BiA2FwnAdfwS7Nv1/img.png?width=604&amp;amp;height=464&amp;amp;face=0_0_604_464,https://scrap.kakaocdn.net/dn/MZLvs/hyM715acyh/iGsbCCpK276p5DytwISNk0/img.png?width=604&amp;amp;height=464&amp;amp;face=0_0_604_464,https://scrap.kakaocdn.net/dn/9WRWI/hyM9m0TrRE/c8QrUZ02HNtOW14dfq8FB1/img.jpg?width=1739&amp;amp;height=868&amp;amp;face=0_0_1739_868');&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;[Python(파이썬) 텍스트(.txt) 형식 천문학 데이터 다루기] Class 문을 활용하여 텍스트 형식의 WMAP 데&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요, 거의 1년만에 새로운 글로 찾아뵙게 되었습니다. 학생회장과 학부연구생, 대외활동으로 블로그에 글을 쓰지 못하였습니다. 작년 또한 마찬가지로 파이썬으로 천문학 공부를 해보았&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;himbopsa.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 게시물을 참고하여 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;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;class 구문이란, 한 구문 안에 여러개의 함수를 포함시켜서 여러 함수에 대한 기능을 복합적으로 사용할 수 있도록 하는 구문입니다. 예를 들어 한 class 구문 안에서 덧셈, 뺄셈, 곱셈, 나눗셈을 하게끔 만들 수 있습니다. 이를 간단하게 코드로 만들어보았습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1642514944869&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class four_fundamental_arithmetic_operation():
    def __init__(self, num1, num2):
        self.number1 = num1
        self.number2 = num2
        
    def add(self):
        return self.number1 + self.number2
    
    def subtract(self):
        return self.number1 - self.number2
            
    def multiply(self):
        return self.number1 * self.number2
    
    def devide(self):
        if self.number2 == 0:
            value = &quot;number can't be devided by zero&quot;
        else:
            value = self.number1 / self.number2
        return value
    
calculate_4 = four_fundamental_arithmetic_operation(10,5)
print(calculate_4.add())
print(calculate_4.subtract())
print(calculate_4.multiply())
print(calculate_4.devide())&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 class의 이름을 정해주고 __init__(self,...)의 과정을 거쳐 class구문 안에서 사용한 변수들에 대하여 정의해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 해당 변수들 앞에는 무조건 self가 들어가야 합니다.&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;self가 들어가야 하는 이유 : calculate_4 = four_fundamental_arithmetic_operation(10,5)구문에서 각각의 add, subtract, multiply, devide 함수를 사용할 때 calculate_4안에 있는 내용들을 토대로 사용하여야 합니다. 자기 자신이 선언 및 호출, 사용되기에 자기 자신을 __init__안에 변수로 받아야 합니다. (그렇기에 관례적으로 self를 사용한다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;class 클래스명(): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def __init__(self, 입력값1, 입력값2....):&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; self.정보1 = 입력값1 (numpy를 활용하거나 다른 숫자들과의 연산 또는 기타 과정으로 가공 가능)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; self.정보2 = 입력값2&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;이후에는 위의 코드와 같이 원하는 함수들을 정의하고 구축해주면 됩니다. 이 때 주의하여야 할 점은 __init__에서 선언해준 변수들에 대해서는 self.정보1와 같은 형식으로 사용해주어야합니다. 그렇지 않으면 에러가 발생하거나 정보를 올바르게 인식할 수 없습니다. 클래스 내부에 함수를 전부 작성 하였으면 calculate_4 = four_fundamental_arithmetic_operation(10,5)와 같이 사용하고자 하는 클래스와 그 안에 들어갈 변수를 정의해줍니다. 그 후 &lt;b&gt;클래스명.함수명(변수들)&lt;/b&gt;을 원하는 순서대로 입력해주어 클래스 내에서 원하는 과정을 거치시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 출력값은 저희가 암산으로 계산한 것과 같은 값이 나오게 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;캡처.JPG&quot; data-origin-width=&quot;58&quot; data-origin-height=&quot;95&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbaQ3q/btrq8IS8sUw/7OQQRag4yFI8E4imr5pJ81/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbaQ3q/btrq8IS8sUw/7OQQRag4yFI8E4imr5pJ81/img.jpg&quot; data-alt=&quot;출력값&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbaQ3q/btrq8IS8sUw/7OQQRag4yFI8E4imr5pJ81/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbaQ3q%2Fbtrq8IS8sUw%2F7OQQRag4yFI8E4imr5pJ81%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;58&quot; height=&quot;95&quot; data-filename=&quot;캡처.JPG&quot; data-origin-width=&quot;58&quot; data-origin-height=&quot;95&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출력값&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지가 class 구문에 대한 간단한 설명이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 게시물을 참고하시여 앞서 찾아뵙게 된 [Python(파이썬) 텍스트(.txt) 형식 천문학 데이터 다루기] Class 문을 활용하여 텍스트 형식의 WMAP 데이터 다루기 (천문학 데이터 분석 입문)-2 게시물을 이해하시고 실습을 해보시면 좋을 것 같습니다. 그러면 3탄에서는 2탄의 아쉬운 점을 극복하는 과정과 그래프에 대한 간단한 설명으로 찾아뵙도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사합니다!&lt;/p&gt;</description>
      <category>과학/천문학</category>
      <category>python class</category>
      <category>python 클래스</category>
      <category>파이썬 class</category>
      <category>파이썬 클래스</category>
      <category>파이썬기초</category>
      <author>AstroPenguin</author>
      <guid isPermaLink="true">https://himbopsa.tistory.com/50</guid>
      <comments>https://himbopsa.tistory.com/50#entry50comment</comments>
      <pubDate>Tue, 18 Jan 2022 23:26:59 +0900</pubDate>
    </item>
    <item>
      <title>[천문학 데이터, Python(파이썬) 텍스트(.txt) 형식] Class 문을 활용하여 텍스트 형식의 WMAP 데이터 다루기 (천문학 데이터 분석 입문)-2</title>
      <link>https://himbopsa.tistory.com/49</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, 거의 1년만에 새로운 글로 찾아뵙게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학생회장과 학부연구생, 대외활동으로 블로그에 글을 쓰지 못하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작년 또한 마찬가지로 파이썬으로 천문학 공부를 해보았습니다. 좋은 데이터와 분석 코드가 있어 공유해드리고자합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작년 1학기에는 천문학 데이터를 찾아보고 구글에 검색해보아서 나온 그래프를 똑같이 구현하고 그 의미를 분석하는 것이 저의 소소한 취미였습니다. 그러던 중 천체물리 수업에서 초기 우주에 대한 수업을 듣게 되었고, WMAP 데이터에 흥미가 가게 되었습니다.&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;그래서 곧바로 데이터를 서칭하여 열어보았더니, WMAP 데이터를 통하여 천문학 전용 라이브러리를 사용하지 않고 기초적인 파이썬 코딩으로도 데이터 분석이 가능하고 과학적으로 유의미한 결과를 낼 수 있었습니다. 그래서 흥미로운 주제로 파이썬을 통해 텍스트 파일을 다루어보고 싶거나, 천문학 데이터 분석에 입문하시는 분들을 위해서 제가 거쳐온 과정을 공유해드리고자 합니다. 그럼 시작하겠습니다~!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(파이썬에서의 Class 문의 활용과 텍스트 파일을 열고 읽는 과정이 궁금하신 분은 제가 추후에 제작할 class 구문에 대한 게시물을 참고하시거나 조금 밑으로 내리셔서 코드블럭을 참고해주시길 바랍니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://himbopsa.tistory.com/50&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://himbopsa.tistory.com/50&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1642516051186&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;[Python Class 구문 입문] Class 문을 활용하여 텍스트 형식의 WMAP 데이터 다루기 (천문학 데이터 분석 &quot; data-og-description=&quot;안녕하세요, AstroPenguin입니다! 2탄인 텍스트(.txt) 형식으로 된 WMAP데이터를 통하여 CMB의 Angular Power Spectrum 그래프를 그려낸 게시물로 먼저 찾아뵙고, 순서를 바꾸어 python으로 class구문을 작성하는.&quot; data-og-host=&quot;himbopsa.tistory.com&quot; data-og-source-url=&quot;https://himbopsa.tistory.com/50&quot; data-og-url=&quot;https://himbopsa.tistory.com/50&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/uzsep/hyM9qvshED/tHezSXycaFIYy1W7SwfFy1/img.jpg?width=58&amp;amp;height=95&amp;amp;face=0_0_58_95,https://scrap.kakaocdn.net/dn/bMHBLt/hyM71Yoys2/5KziR2lJhRlPZ8eDbBgb0K/img.jpg?width=58&amp;amp;height=95&amp;amp;face=0_0_58_95&quot;&gt;&lt;a href=&quot;https://himbopsa.tistory.com/50&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://himbopsa.tistory.com/50&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/uzsep/hyM9qvshED/tHezSXycaFIYy1W7SwfFy1/img.jpg?width=58&amp;amp;height=95&amp;amp;face=0_0_58_95,https://scrap.kakaocdn.net/dn/bMHBLt/hyM71Yoys2/5KziR2lJhRlPZ8eDbBgb0K/img.jpg?width=58&amp;amp;height=95&amp;amp;face=0_0_58_95');&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;[Python Class 구문 입문] Class 문을 활용하여 텍스트 형식의 WMAP 데이터 다루기 (천문학 데이터 분석&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요, AstroPenguin입니다! 2탄인 텍스트(.txt) 형식으로 된 WMAP데이터를 통하여 CMB의 Angular Power Spectrum 그래프를 그려낸 게시물로 먼저 찾아뵙고, 순서를 바꾸어 python으로 class구문을 작성하는.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;himbopsa.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WMAP (Wilkinson Microwave Anisotropy Probe) mission은 우주 마이크로파 배경 복사의 온도 분포를 전체 우주의 지도로 살펴봄으로써 우주의 기하학적인 내용 및 진화에 대하여 알아보는 임무입니다. 저희는 텍스트 형식의 WMAP 데이터를 파이썬을 통하여 분석해보고, 심화과정으로는 저희가 분석한 내용이 우주에서 뜻하는 의미에 대하여 이야기해볼 예정입니다.&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://lambda.gsfc.nasa.gov/product/map/current/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://lambda.gsfc.nasa.gov/product/map/current/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1641456190148&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;LAMBDA - Wilkinson Microwave Anisotropy Probe&quot; data-og-description=&quot;&quot; data-og-host=&quot;lambda.gsfc.nasa.gov&quot; data-og-source-url=&quot;https://lambda.gsfc.nasa.gov/product/map/current/&quot; data-og-url=&quot;https://lambda.gsfc.nasa.gov/product/map/current/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://lambda.gsfc.nasa.gov/product/map/current/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://lambda.gsfc.nasa.gov/product/map/current/&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;LAMBDA - Wilkinson Microwave Anisotropy Probe&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;lambda.gsfc.nasa.gov&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;wmap page.JPG&quot; data-origin-width=&quot;1870&quot; data-origin-height=&quot;863&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lc0i8/btrp0aqgHKa/HJQ7viJih0XFgaP97AnYuK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lc0i8/btrp0aqgHKa/HJQ7viJih0XFgaP97AnYuK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lc0i8/btrp0aqgHKa/HJQ7viJih0XFgaP97AnYuK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flc0i8%2Fbtrp0aqgHKa%2FHJQ7viJih0XFgaP97AnYuK%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;1870&quot; height=&quot;863&quot; data-filename=&quot;wmap page.JPG&quot; data-origin-width=&quot;1870&quot; data-origin-height=&quot;863&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 링크를 타고 해당 페이지와 같은 곳으로 들어오셨다면 성공입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;wmap page2.jpg&quot; data-origin-width=&quot;1732&quot; data-origin-height=&quot;868&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Z2dZ1/btrpSlmdGt3/sP1wKltxXbS9y7wr0VKWb0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Z2dZ1/btrpSlmdGt3/sP1wKltxXbS9y7wr0VKWb0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Z2dZ1/btrpSlmdGt3/sP1wKltxXbS9y7wr0VKWb0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZ2dZ1%2FbtrpSlmdGt3%2FsP1wKltxXbS9y7wr0VKWb0%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;1732&quot; height=&quot;868&quot; data-filename=&quot;wmap page2.jpg&quot; data-origin-width=&quot;1732&quot; data-origin-height=&quot;868&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;wmap page3.jpg&quot; data-origin-width=&quot;1732&quot; data-origin-height=&quot;868&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/14AWb/btrpUGDYylT/AzeY2T4V2WSAiAi5EnHPbk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/14AWb/btrpUGDYylT/AzeY2T4V2WSAiAi5EnHPbk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/14AWb/btrpUGDYylT/AzeY2T4V2WSAiAi5EnHPbk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F14AWb%2FbtrpUGDYylT%2FAzeY2T4V2WSAiAi5EnHPbk%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;1732&quot; height=&quot;868&quot; data-filename=&quot;wmap page3.jpg&quot; data-origin-width=&quot;1732&quot; data-origin-height=&quot;868&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WMPA 데이터는 1~9년 동안의 데이터가 있으니 원하시는 데이터로 다운받으시면 되겠습니다. (저는 7년동안의 데이터를 사용하였습니다.)&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;wmap page4.jpg&quot; data-origin-width=&quot;1739&quot; data-origin-height=&quot;868&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MjbML/btrpYlMlLGd/Jbirvkmey4nj8SHTao1PdK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MjbML/btrpYlMlLGd/Jbirvkmey4nj8SHTao1PdK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MjbML/btrpYlMlLGd/Jbirvkmey4nj8SHTao1PdK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMjbML%2FbtrpYlMlLGd%2FJbirvkmey4nj8SHTao1PdK%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;1739&quot; height=&quot;868&quot; data-filename=&quot;wmap page4.jpg&quot; data-origin-width=&quot;1739&quot; data-origin-height=&quot;868&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;wmap page5.jpg&quot; data-origin-width=&quot;1774&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8sjb7/btrpWzcZZxr/zYglbIOuKpKhZdX46LbmLk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8sjb7/btrpWzcZZxr/zYglbIOuKpKhZdX46LbmLk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8sjb7/btrpWzcZZxr/zYglbIOuKpKhZdX46LbmLk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8sjb7%2FbtrpWzcZZxr%2FzYglbIOuKpKhZdX46LbmLk%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;1774&quot; height=&quot;748&quot; data-filename=&quot;wmap page5.jpg&quot; data-origin-width=&quot;1774&quot; data-origin-height=&quot;748&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Binned라고 쓰여진 데이터를 클릭하셔야 저희가 다루기 쉬운 데이터를 다운받을 수 있으니 유의 바랍니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같은 과정을 거치시면 데이터는 쉽게 다운받을 수 있습니다. 그렇다면 이제 데이터를 열어서 데이터에 대한 정보를 알아볼까요?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;wmap page6.jpg&quot; data-origin-width=&quot;1524&quot; data-origin-height=&quot;870&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/N9jI0/btrpTgeqdl2/cK1VA2X3RDQpFkfUZDyJ0K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/N9jI0/btrpTgeqdl2/cK1VA2X3RDQpFkfUZDyJ0K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/N9jI0/btrpTgeqdl2/cK1VA2X3RDQpFkfUZDyJ0K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FN9jI0%2FbtrpTgeqdl2%2FcK1VA2X3RDQpFkfUZDyJ0K%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;1524&quot; height=&quot;870&quot; data-filename=&quot;wmap page6.jpg&quot; data-origin-width=&quot;1524&quot; data-origin-height=&quot;870&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저희가 직접적으로 사용할 데이터는 1열의 multipole moment, 4열의 온도 변화에 대한 수치인 temperautre power spectrum, 7열의 에러 보정 수치입니다. 천문학 데이터는 보통 열어보면 관측기, 레퍼런스, 데이터 명과 목적, 각 열에 대한 정보 등 다루기 쉽게 설명이 지정되어있습니다. 그렇다면 지금부터 이 데이터를 파이썬을 통하여 분석해보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;이 때 텍스트파일을 조금 가공하여야 합니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;데이터 정보와 각 열에 대하여 적혀있는 정보들을 모두 지워주어야 합니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;그 후 숫자로 나오는 데이터들 중 처음 데이터 값인 multipole moment = 2일 때의 수치를 지워주면 데이터 분석이 더욱 쉬워집니다. (첫 행에서 error값을 뺐을 때 음수가 나오게 됩니다. 제가 우주론 전공자가 아니라 그 이유는 자세히 모릅니다. 그래프를 그리는 실습을 위하여 이 점은 감안하고 넘어간 점 양해 부탁드립니다.)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저희가 최종적으로 이 데이터를 분석하여 그려야 할 그래프는 바로 다음과 같은 그림입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 그래프가 뜻하는 의미와 왜 그려야 하는지는 다음 게시물을 통하여 설명해드리도록 하겠습니다. :)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;캡처.JPG&quot; data-origin-width=&quot;1863&quot; data-origin-height=&quot;902&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OHr2u/btrpW7tHocW/dojbHumKF2wxkKyCFDI6Vk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OHr2u/btrpW7tHocW/dojbHumKF2wxkKyCFDI6Vk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OHr2u/btrpW7tHocW/dojbHumKF2wxkKyCFDI6Vk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOHr2u%2FbtrpW7tHocW%2FdojbHumKF2wxkKyCFDI6Vk%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;1863&quot; height=&quot;902&quot; data-filename=&quot;캡처.JPG&quot; data-origin-width=&quot;1863&quot; data-origin-height=&quot;902&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 제가 사용한 class구문의 코드를 보여드리겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1641457190332&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
import matplotlib.pyplot as plt

class WMAP():
    def __init__(self):
        self.multipole_moment = []
        self.TT_power_spec = []
        self.power_err = []&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선은 &amp;nbsp;def __init__(self): 구문을 통하여&amp;nbsp; 저희가 class 내에서 변수로 사용할 multiploe moment, power, error에 대해서 정의해줍니다. 우선은 빈 list로 두어 다음 구문에서 텍스트 파일을 읽어 각각에 대한 정보를 집어넣을 예정입니다. 이러한 방식은 제가 천문학 데이터를 분석 및 가공할 때 즐겨쓰는 방법입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로는 오늘의 하이라이트인 텍스트 파일을 파이썬으로 읽는 과정입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1642511966674&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;file = open(&quot;파일명.txt&quot;, 'r') # 파일을 불러온다
header = file.readline() # 파일을 한 줄씩 읽어들인다

first_name = []
last_name = []
gender = []
adress = []

for line in file:
    line = line.strip() # 맨 앞과 뒤의 공백을 없애준다
    columns = line.split() # 각각의 열을 쪼개준다.
    first_name.append(columns[0])
    last_name.append(float(columns[1]))
    gender.append(float(columns[4]))
    adress.append(float(columns[6]))
f.close() # 열었던 파일을 닫는다&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신상정보에 대한 텍스트 파일이 있다는 가정하에, 다음과 같이 파일을 열고 한 줄 씩 불러들입니다. 그리고 원하는 정보들에 대한 빈 list를 선언해줍니다.&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;그 후 .strip()구문으로 맨 앞과 뒤의 공백을 없애준 후 .split 구문으로 각각의 열을 다른 list로 쪼개줍니다. 마지막으로 각각의 정보를 나타내는 빈 list에 원하는 정보를 append해준 후 열었던 파일을 도로 닫아주면 됩니다. 다만 저희의 wamp 데이터를 활용하는 코드는 class 내부에 있기 때문에 readflie(self, filename)이라는 새로운 함수를 만들어주었습니다.&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;텍스트로 된 wmap데이터를 읽어오는 코드를 추가한 class 구문은 다음과 같습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1642512259552&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
import matplotlib.pyplot as plt

class WMAP():
    def __init__(self):
        self.multipole_moment = []
        self.TT_power_spec = []
        self.power_err = []
        
    def readfile(self, filename): # 텍스트 형식의 파일을 여는 코드
        try:
            file = open(filename,'r')
            del_2nd_row = file.readline()
            
            for line in file:
                line = line.strip()
                columns = line.split()
                self.multipole_moment.append(float(columns[0]))
                self.TT_power_spec.append(float(columns[3]))
                self.power_err.append(float(columns[6]))
            file.close()
        except:
            print('FileNotFoundError : Please check your filename')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 곳에서는 try-except 구문을 사용하여 파일을 찾을 수 없어 에러가 뜨는 경우에는 파일 이름을 다시 체크해달라는 에러메세지가 뜨도록 설정하였습니다.&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;파일을 불러들여오고, 원하는 정보들인 multipole moment, temperature power spectrum, error값들에 대하여 선언 및 수치들에 대한 append가 끝났으니, 이제 해당 정보들을 가공하는 과정을 거쳐주겠습니다. temperature power spectrum에서 error값을 빼주어 오차에 대한 보정을 진행해준 후 multipole moment - temperature power spectrum의 관계를 보여주는 그래프를 그려내는 함수를 추가하였습니다. 그리고 이러한 과정을 multipole moment에 log scale을 적용하여 다시금 진행하였습니다. 그리하여 나오게 된 전체 코드는 다음과 같습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1642512423938&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
import matplotlib.pyplot as plt

class WMAP():
    def __init__(self):
        self.multipole_moment = []
        self.TT_power_spec = []
        self.power_err = []
        
    def readfile(self, filename): # 텍스트 형식의 파일을 여는 코드
        try:
            file = open(filename,'r')
            del_2nd_row = file.readline()
            
            for line in file:
                line = line.strip()
                columns = line.split()
                self.multipole_moment.append(float(columns[0]))
                self.TT_power_spec.append(float(columns[3]))
                self.power_err.append(float(columns[6]))
            file.close()
        except:
            print('FileNotFoundError : Please check your filename')
        
    def real_WMAP_power(self): # 오차를 빼서 정확한 값을 찾는 코드
        observated_value = np.array(self.TT_power_spec)
        error_value = np.array(self.power_err)
        real_value = observated_value - error_value
        return real_value
    
    def Angular_Spectrum_plot(self): # 그래프를 그리는 코드
        x = np.array(self.multipole_moment)
        y = np.array(self.real_WMAP_power())
        self.size = 20
        
        plt.figure(figsize=(9,7))
        plt.errorbar(x,y,yerr=self.power_err,c='red')
        plt.scatter(x,y,c='black',s=30,marker='d')
        plt.title('The CMB Power Spectrum', fontsize = self.size)
        plt.xlabel('Multipole Moment (l)', fontsize = self.size)
        plt.ylabel(r&quot;$\Delta T$&quot; +&quot; &quot; + r&quot;[$\mu K^2$]&quot;, fontsize = self.size)
        plt.xticks([10, 100, 500, 1000], fontsize = self.size)
        plt.yticks([1000*(y+1) for y in range(6)], fontsize = self.size)
        plt.show()
        # r&quot;{$l(l+1)\C_1/2\pi$}&quot;
        
    def log10_Angular_Spectrum_plot(self): # 로그 스케일의 그래프를 그리는 코드
        x = np.log10(np.array(self.multipole_moment))
        y = np.array(self.real_WMAP_power())
        self.size = 20
        
        plt.figure(figsize=(9,7))
        plt.errorbar(x,y,yerr=self.power_err,c='blue')
        plt.scatter(x,y,c='black',s=30,marker='d')
        plt.title('The Log-Scale CMB Power Spectrum', fontsize = self.size)
        plt.xlabel('Log Multipole Moment (log l)', fontsize = self.size)
        plt.ylabel(r&quot;$\Delta T$&quot; +&quot; &quot; + r&quot;[$\mu K^2$]&quot;, fontsize = self.size)
        plt.xticks([0.5*(x+1) for x in range(6)], fontsize = self.size)
        plt.yticks([1000*(y+1) for y in range(6)], fontsize = self.size)
        plt.show()
        # r&quot;{$l(l+1)\C_1/2\pi$}&quot;

WMAP = WMAP()
WMAP.readfile('WMAP_TT_power_spec.txt')
print(WMAP.real_WMAP_power())
WMAP.Angular_Spectrum_plot()
WMAP.log10_Angular_Spectrum_plot()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 과정을 거쳐 나오게 되는 그래프는 아래의 이미지와 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;11.png&quot; data-origin-width=&quot;604&quot; data-origin-height=&quot;464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Y0Vyy/btrq4tXcaCi/qJVHUBmwkCuURg6z37FCu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Y0Vyy/btrq4tXcaCi/qJVHUBmwkCuURg6z37FCu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Y0Vyy/btrq4tXcaCi/qJVHUBmwkCuURg6z37FCu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FY0Vyy%2Fbtrq4tXcaCi%2FqJVHUBmwkCuURg6z37FCu1%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;604&quot; height=&quot;464&quot; data-filename=&quot;11.png&quot; data-origin-width=&quot;604&quot; data-origin-height=&quot;464&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;12.png&quot; data-origin-width=&quot;604&quot; data-origin-height=&quot;464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCAVwL/btrq1mYR4W5/NKSF79vZjMKA0kSDaktAUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCAVwL/btrq1mYR4W5/NKSF79vZjMKA0kSDaktAUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCAVwL/btrq1mYR4W5/NKSF79vZjMKA0kSDaktAUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCAVwL%2Fbtrq1mYR4W5%2FNKSF79vZjMKA0kSDaktAUK%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;604&quot; height=&quot;464&quot; data-filename=&quot;12.png&quot; data-origin-width=&quot;604&quot; data-origin-height=&quot;464&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래프들을 보시면 제가 만들고자 하였던 이미지와 많이 다른 것을 알 수 있습니다. 이는 제가 그린 빨간색 그래프에서는 x축 값인 1, 10, 100, 1000의 간격이 실제 숫자 간격에 맞게 배치되어있으나 궁극적으로 만들고자 하였던 그래프에서는 1, 10, 100, 1000의 간격이 모두 똑같게 배치되어있기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 게시물에서는 이를 극복하는 과정과 제가 그려낸 그래프가 우주론에서 어떠한 의미를 가지고 있는지에 대하여 간단히 서술해드리도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;긴 글 읽어주셔서 감사드립니다 :)&lt;/p&gt;</description>
      <category>과학/천문학</category>
      <category>WMAP</category>
      <category>우주론</category>
      <category>우주론데이터</category>
      <category>우주론코딩</category>
      <category>천문학데이터</category>
      <category>천문학실습</category>
      <category>천문학파이썬</category>
      <category>텍스트파일읽기</category>
      <category>파이썬텍스트</category>
      <author>AstroPenguin</author>
      <guid isPermaLink="true">https://himbopsa.tistory.com/49</guid>
      <comments>https://himbopsa.tistory.com/49#entry49comment</comments>
      <pubDate>Tue, 18 Jan 2022 22:44:52 +0900</pubDate>
    </item>
    <item>
      <title>동영상 캡쳐 프로그램 (C++/Opencv)</title>
      <link>https://himbopsa.tistory.com/48</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요 오늘은 제가 동영상 캡쳐 프로그램을 보여드리도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;0.간단한 설명&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램은&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt; C++&lt;/b&gt;&lt;/span&gt;와 &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;Opencv&lt;/b&gt;&lt;/span&gt;를 이용해서 제작하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램은 지정된 동영상 파일들을 재생시키고 사용자가 동영상을 확인하면서 이미지 형태로 영상을 캡쳐할 수 있도록 해줍니다. 소스코드 또한 글 맨뒤에 포함하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Opencv 설치법은 아래 링크에서 보실 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://himbopsa.tistory.com/34&quot;&gt;OpenCV 설치하기(C++) (tistory.com)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1641455801519&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;OpenCV 설치하기(C++)&quot; data-og-description=&quot;&amp;nbsp;안녕하십니까, 힘법사입니다. 오늘은 OpenCV 설치법에 대해서 알아보도록 하겠습니다! 1. 설치 파일 다운로드 Releases - OpenCV Releases - OpenCV Become a Member Stay up to date on OpenCV and Computer Vi..&quot; data-og-host=&quot;himbopsa.tistory.com&quot; data-og-source-url=&quot;https://himbopsa.tistory.com/34&quot; data-og-url=&quot;https://himbopsa.tistory.com/34&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cncftq/hyMZKhGxMW/pgi1WOgh1wXMPAeEI0jxjk/img.png?width=800&amp;amp;height=207&amp;amp;face=0_0_800_207,https://scrap.kakaocdn.net/dn/bmhxa2/hyMZKB0MMy/xhx8gmKPBzTB24BMtQU71k/img.png?width=800&amp;amp;height=207&amp;amp;face=0_0_800_207,https://scrap.kakaocdn.net/dn/bR4aqT/hyMZHSNBS7/n0B2TBYdJ2ciWr67snRCJK/img.png?width=967&amp;amp;height=459&amp;amp;face=0_0_967_459&quot;&gt;&lt;a href=&quot;https://himbopsa.tistory.com/34&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://himbopsa.tistory.com/34&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cncftq/hyMZKhGxMW/pgi1WOgh1wXMPAeEI0jxjk/img.png?width=800&amp;amp;height=207&amp;amp;face=0_0_800_207,https://scrap.kakaocdn.net/dn/bmhxa2/hyMZKB0MMy/xhx8gmKPBzTB24BMtQU71k/img.png?width=800&amp;amp;height=207&amp;amp;face=0_0_800_207,https://scrap.kakaocdn.net/dn/bR4aqT/hyMZHSNBS7/n0B2TBYdJ2ciWr67snRCJK/img.png?width=967&amp;amp;height=459&amp;amp;face=0_0_967_459');&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;OpenCV 설치하기(C++)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;안녕하십니까, 힘법사입니다. 오늘은 OpenCV 설치법에 대해서 알아보도록 하겠습니다! 1. 설치 파일 다운로드 Releases - OpenCV Releases - OpenCV Become a Member Stay up to date on OpenCV and Computer Vi..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;himbopsa.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 시작&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://drive.google.com/file/d/1Pym_k0LYyrHHImvM2ZluCg7F_eD-uPfe/view?usp=sharing&quot;&gt;https://drive.google.com/file/d/1Pym_k0LYyrHHImvM2ZluCg7F_eD-uPfe/view?usp=sharing&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1641454845539&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;Google Drive - 모든 파일을 한 곳에서&quot; data-og-description=&quot;하나의 계정으로 모든 Google 서비스를 Google Drive로 이동하려면 로그인하세요.&quot; data-og-host=&quot;accounts.google.com&quot; data-og-source-url=&quot;https://drive.google.com/file/d/1Pym_k0LYyrHHImvM2ZluCg7F_eD-uPfe/view?usp=sharing&quot; data-og-url=&quot;https://accounts.google.com/ServiceLogin?service=wise&amp;amp;passive=1209600&amp;amp;continue=https://drive.google.com/file/d/1Pym_k0LYyrHHImvM2ZluCg7F_eD-uPfe/view?usp%3Dsharing&amp;amp;followup=https://drive.google.com/file/d/1Pym_k0LYyrHHImvM2ZluCg7F_eD-uPfe/view?usp%3Dsharing&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://drive.google.com/file/d/1Pym_k0LYyrHHImvM2ZluCg7F_eD-uPfe/view?usp=sharing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://drive.google.com/file/d/1Pym_k0LYyrHHImvM2ZluCg7F_eD-uPfe/view?usp=sharing&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;Google Drive - 모든 파일을 한 곳에서&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;하나의 계정으로 모든 Google 서비스를 Google Drive로 이동하려면 로그인하세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;accounts.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adfit&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;728x90&lt;/div&gt;
    &lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display: none;&quot; data-ad-unit=&quot;DAN-6NEVqUUGyBWfyhEK&quot; data-ad-width=&quot;728px&quot; data-ad-height=&quot;90px&quot;&gt;&lt;/ins&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 해당 링크에서 파일을 다운받으실 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1021&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1WMJB/btrpUIIxoJ7/DmKvbkg0mb5Br2BF8Tk1Ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1WMJB/btrpUIIxoJ7/DmKvbkg0mb5Br2BF8Tk1Ok/img.png&quot; data-alt=&quot;그림. 프로그램 풀더와 파일들&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1WMJB/btrpUIIxoJ7/DmKvbkg0mb5Br2BF8Tk1Ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1WMJB%2FbtrpUIIxoJ7%2FDmKvbkg0mb5Br2BF8Tk1Ok%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;1021&quot; height=&quot;426&quot; data-origin-width=&quot;1021&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림. 프로그램 풀더와 파일들&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운 받으시 파일을 푸시면 위와 같이 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Video_capture로 불리는 실행시킬 수 있는 응용 프로그램&lt;/b&gt;&lt;/span&gt;과 &lt;b&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;캡쳐 이미지가 저장되는 save 풀더&lt;/span&gt;&lt;/b&gt; 그리고 &lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;캡쳐를 원하는 영상을 담는 target_vid&lt;/span&gt;&lt;/b&gt;로 이뤄져있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 작업 영상 배치&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;앞선 설명과 같이 실행 전&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt; 작업을 원하는 영상들을 target_vid 풀더에 넣어줍니다.&lt;/b&gt;&lt;/span&gt; 영상의 수는 관계없습니다. 예를 들어 5개의 영상을 넣어주게 되면 프로그램 실행 시 모두 작업에 들어가게 됩니다.&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;3.프로그램 실행&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;프로그램의 실행 법은 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Video_capture.exe를 실행 &lt;/span&gt;&lt;/b&gt;시켜 주면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;723&quot; data-origin-height=&quot;335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dZI1ZM/btrpVwOpQKb/iBLcoy0vzKYbKnIrvwjfF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dZI1ZM/btrpVwOpQKb/iBLcoy0vzKYbKnIrvwjfF0/img.png&quot; data-alt=&quot;그림. 프로그램 실행 이미지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dZI1ZM/btrpVwOpQKb/iBLcoy0vzKYbKnIrvwjfF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdZI1ZM%2FbtrpVwOpQKb%2FiBLcoy0vzKYbKnIrvwjfF0%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;723&quot; height=&quot;335&quot; data-origin-width=&quot;723&quot; data-origin-height=&quot;335&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림. 프로그램 실행 이미지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보시면 간단한 동작 방법과 함께 Enter를 누르면 시작한다고 안내해주는 메세지들을 볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;s 키를 누르면 파일이 저장&lt;/b&gt;&lt;/span&gt;되고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;스페이스바를 누르면 현재 보고 있는 영상의 일시정지와 다시 재생&lt;/span&gt;&lt;/b&gt;을 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1609&quot; data-origin-height=&quot;913&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FeF6q/btrp09RNovL/JDvzUL8KSKbuo8i1kwq470/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FeF6q/btrp09RNovL/JDvzUL8KSKbuo8i1kwq470/img.png&quot; data-alt=&quot;그림. 프로그램 실행 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FeF6q/btrp09RNovL/JDvzUL8KSKbuo8i1kwq470/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFeF6q%2Fbtrp09RNovL%2FJDvzUL8KSKbuo8i1kwq470%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;1609&quot; height=&quot;913&quot; data-origin-width=&quot;1609&quot; data-origin-height=&quot;913&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림. 프로그램 실행 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Enter를 눌러 시작하게되면 위의 그림과 같이 작업 영상을 보여줍니다. 여기서 앞서 설명한 키를 조작해 가며 작업을 해나갈 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4TTBH/btrpWzYnbge/7IE7f1KXUkZcfkoFlmnybk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4TTBH/btrpWzYnbge/7IE7f1KXUkZcfkoFlmnybk/img.png&quot; data-alt=&quot;그림. 캡쳐된 이미지들&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4TTBH/btrpWzYnbge/7IE7f1KXUkZcfkoFlmnybk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4TTBH%2FbtrpWzYnbge%2F7IE7f1KXUkZcfkoFlmnybk%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;883&quot; height=&quot;216&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;216&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림. 캡쳐된 이미지들&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네 오늘은 제가 예전에 개인적으로 영상 캡쳐들에 이용하기 위해서 만든 프로그램이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1641455739412&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define _CRT_SECURE_NO_WARNINGS

#include &amp;lt;iostream&amp;gt;
#include &amp;lt;opencv2/opencv.hpp&amp;gt;
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;io.h&amp;gt;
#include &amp;lt;Windows.h&amp;gt;
#include &amp;lt;conio.h&amp;gt; //_getch가 포함되어있는 헤더

using namespace cv;
using namespace std;
struct _finddata_t fd;

int vid_num = 0;


vector&amp;lt;string&amp;gt; split(string input, char delimiter) {
    vector&amp;lt;string&amp;gt; answer;
    stringstream ss(input);
    string temp;

    while (getline(ss, temp, delimiter)) {
        answer.push_back(temp);
    }

    return answer;
}

int isFileOrDir()
{
    if (fd.attrib &amp;amp; _A_SUBDIR)
        return 0; // 디렉토리면 0 반환
    else
        return 1; // 그밖의 경우는 &quot;존재하는 파일&quot;이기에 1 반환

}

string * FileSearch(char file_path[])
{
    string* vid_arr;
    vid_arr = new string[300];
    intptr_t handle;
    int check = 0;
    char file_path2[_MAX_PATH];

    strcat(file_path, &quot;\\&quot;);
    strcpy(file_path2, file_path);
    strcat(file_path, &quot;*&quot;);

    if ((handle = _findfirst(file_path, &amp;amp;fd)) == -1)
    {
        printf(&quot;No such file or directory\n&quot;);
    }

    while (_findnext(handle, &amp;amp;fd) == 0)
    {
        char file_pt[_MAX_PATH];
        strcpy(file_pt, file_path2);
        strcat(file_pt, fd.name);

        check = isFileOrDir();    //파일인지 디렉토리 인지 식별

        if (check == 0 &amp;amp;&amp;amp; fd.name[0] != '.')
        {
            FileSearch(file_pt);    //하위 디렉토리 검색 재귀함수
        }
        else if (check == 1 &amp;amp;&amp;amp; fd.size != 0 &amp;amp;&amp;amp; fd.name[0] != '.')
        {
            cout &amp;lt;&amp;lt; &quot;check&quot; &amp;lt;&amp;lt; endl;

            for (int tmp = 0; tmp &amp;lt; 120; tmp++) {
                if (file_pt[tmp] == 92) {
                    file_pt[tmp] = 47;
                }
            }
            vid_arr[vid_num] = file_pt;
            vid_num++;
            printf(&quot;파일명 : %s, 크기:%d\n&quot;, file_pt, fd.size);
        }
    }
    return vid_arr;
    _findclose(handle);
}



int main() {
    char file_path[_MAX_PATH] = &quot;./target_vid&quot;;    //C:\ 경로 탐색
    string* vid_arr;

    vid_arr = FileSearch(file_path);
    cout &amp;lt;&amp;lt; vid_num &amp;lt;&amp;lt; endl;
    cout &amp;lt;&amp;lt; &quot;======================================================&quot; &amp;lt;&amp;lt; endl;
    cout &amp;lt;&amp;lt; &quot;    Video Capture S/W 20210801 CHJ Version = 1.0.0    &quot; &amp;lt;&amp;lt; endl;
    cout &amp;lt;&amp;lt; &quot;======================================================&quot; &amp;lt;&amp;lt; endl;
    cout &amp;lt;&amp;lt; &quot;              &amp;darr;&amp;darr;&amp;darr;Basic Control Key&amp;darr;&amp;darr;&amp;darr;           &quot; &amp;lt;&amp;lt; endl;
    cout &amp;lt;&amp;lt; &quot;                 s = save current file  &quot;               &amp;lt;&amp;lt; endl;
    cout &amp;lt;&amp;lt; &quot;         space bar = pause video / restart video&quot; &amp;lt;&amp;lt; endl;
    cout &amp;lt;&amp;lt; &quot;======================================================&quot; &amp;lt;&amp;lt; endl;

    cout &amp;lt;&amp;lt; &quot;**hello if you want to start program press [enter]**&quot; &amp;lt;&amp;lt; endl;

    getchar();

    for (int i = 0; i &amp;lt; vid_num; i++) {
        int save_cnt = 0;
        vector&amp;lt;string&amp;gt; result = split(vid_arr[i], '/');
        vector&amp;lt;string&amp;gt; vid_name_arr = split(result[2],'.');
        string pure_video_name = vid_name_arr[0];
        cout &amp;lt;&amp;lt; &quot;now reading : &quot; &amp;lt;&amp;lt; pure_video_name &amp;lt;&amp;lt; endl;
        VideoCapture cap(vid_arr[i]);
        //cap.set(CV_CAP_PROP_FRAME_WIDTH, 1920);
        //cap.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);

        if (!cap.isOpened())
        {
            printf(&quot;Can't open the camera&quot;);
            return -1;
        }

        Mat img;

        while (1)
        {

            if (_kbhit()) {
                char c;
                cout &amp;lt;&amp;lt; &quot;Key hit!!&quot; &amp;lt;&amp;lt; endl;
                c = _getch();
                if (c == 120) {
                    cout &amp;lt;&amp;lt; &quot;stop input&quot; &amp;lt;&amp;lt; endl;
                    exit(0);
                }
                else if (c == 32) {
                    cout &amp;lt;&amp;lt; &quot;waiting for input...&quot; &amp;lt;&amp;lt; endl;
                    while (true) {
                        if (_kbhit()) {
                            c = _getch();
                            if (c == 115) {
                                cout &amp;lt;&amp;lt; &quot;Save&quot; &amp;lt;&amp;lt; endl;
                                imwrite(&quot;./save/&quot; + pure_video_name + to_string(save_cnt) + &quot;.jpg&quot;, img);
                                save_cnt++;
                            }
                            else if (c == 32) {
                                cout &amp;lt;&amp;lt; &quot;Restart&quot; &amp;lt;&amp;lt; endl;
                                break;
                            }
                        }
                        
                    }
                    
                }
                else if (c == 115) {
                    cout &amp;lt;&amp;lt; &quot;Save&quot; &amp;lt;&amp;lt; endl;
                    imwrite(&quot;./save/&quot; + pure_video_name + to_string(save_cnt) + &quot;.jpg&quot;, img);
                    save_cnt++;
                }
                else {
                    cout &amp;lt;&amp;lt; &quot;wrong input&quot; &amp;lt;&amp;lt; endl;
                }
            }

            cap &amp;gt;&amp;gt; img;

            if (img.empty())
            {
                printf(&quot;empty image&quot;);
                cap.release();
                cout &amp;lt;&amp;lt; &quot;num : &quot; &amp;lt;&amp;lt; vid_num &amp;lt;&amp;lt; endl;
                break;

            }
            Mat img_for_display;
            int xsize = img.cols;
            int ysize = img.rows;
            if (xsize &amp;gt; 1200) {
                xsize /= 2;
                ysize /= 2;
            }
            else if (ysize &amp;gt; 1200) {
                xsize /= 2;
                ysize /= 2;
            }
            resize(img, img_for_display, Size(xsize, ysize));
            imshow(&quot;camera img&quot;, img_for_display);

            if (waitKey(25) == 27) {
                break;
            }
        }
    }
	


	return 0;
}&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;</description>
      <category>C &amp;amp;&amp;amp; C++</category>
      <category>C</category>
      <category>C++</category>
      <category>C++ 예제</category>
      <category>OpenCV</category>
      <category>Opencv예제</category>
      <category>동영상 캡쳐</category>
      <category>동영상 캡쳐 프로그램</category>
      <category>비디오 캡쳐</category>
      <category>캡쳐 프로그램</category>
      <category>프로그래밍</category>
      <author>힘법사</author>
      <guid isPermaLink="true">https://himbopsa.tistory.com/48</guid>
      <comments>https://himbopsa.tistory.com/48#entry48comment</comments>
      <pubDate>Thu, 6 Jan 2022 16:56:48 +0900</pubDate>
    </item>
    <item>
      <title>[C++] 이진트리(binary tree) 전위 순회, 중위 순회, 후위 순회, 레벨 순서 순회</title>
      <link>https://himbopsa.tistory.com/47</link>
      <description>&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;1. 이진트리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이진트리는 노드를 이용한 자료구조입니다. 제가 이전에 노드와 이진트리를 사용해서 적응형 호프만 코딩을 구현한 게시물이 있습니다. 궁금하시면 확인해보시길 바라겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://himbopsa.tistory.com/46&quot;&gt;[C++] Adaptive Huffman Coding(적응형 허프만 코딩) (tistory.com)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636723530148&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;[C++] Adaptive Huffman Coding(적응형 허프만 코딩)&quot; data-og-description=&quot;&amp;nbsp;안녕하십니까, 힘법사입니다. 이번 글은 적응형 허프만 코딩에 대한 글입니다. 직접 게시물과 마찬가지로 제가 보고서를 작성하면서 만든 코드와 보고서 내용을 통해 게시물을 작성했습니다! &quot; data-og-host=&quot;himbopsa.tistory.com&quot; data-og-source-url=&quot;https://himbopsa.tistory.com/46&quot; data-og-url=&quot;https://himbopsa.tistory.com/46&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dAXTb1/hyMkBlbiej/pcX5D8v6J3dGTckv6SIUv1/img.png?width=449&amp;amp;height=1016&amp;amp;face=0_0_449_1016,https://scrap.kakaocdn.net/dn/g0cgB/hyMkEa7Lzx/RXOwbiTdEkEchUkkZDGfQK/img.png?width=449&amp;amp;height=1016&amp;amp;face=0_0_449_1016,https://scrap.kakaocdn.net/dn/c2qD3M/hyMkxb1Flv/4CFsbi0OnUkstcZ1wUgHek/img.png?width=449&amp;amp;height=1016&amp;amp;face=0_0_449_1016&quot;&gt;&lt;a href=&quot;https://himbopsa.tistory.com/46&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://himbopsa.tistory.com/46&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dAXTb1/hyMkBlbiej/pcX5D8v6J3dGTckv6SIUv1/img.png?width=449&amp;amp;height=1016&amp;amp;face=0_0_449_1016,https://scrap.kakaocdn.net/dn/g0cgB/hyMkEa7Lzx/RXOwbiTdEkEchUkkZDGfQK/img.png?width=449&amp;amp;height=1016&amp;amp;face=0_0_449_1016,https://scrap.kakaocdn.net/dn/c2qD3M/hyMkxb1Flv/4CFsbi0OnUkstcZ1wUgHek/img.png?width=449&amp;amp;height=1016&amp;amp;face=0_0_449_1016');&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;[C++] Adaptive Huffman Coding(적응형 허프만 코딩)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;안녕하십니까, 힘법사입니다. 이번 글은 적응형 허프만 코딩에 대한 글입니다. 직접 게시물과 마찬가지로 제가 보고서를 작성하면서 만든 코드와 보고서 내용을 통해 게시물을 작성했습니다!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;himbopsa.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이진트리의 구조는 각 노드가 두 개까지의 자식 노드를 보유하는 트리형 구조입니다. 아래는 제가 적응형 허프만 코딩을 할 때 그렸던 그림인데, 보시는 것처럼 맨 위의 루트 노드로부터 최대 두 개씩의 자식 노드를 생성하며 트리 구조를 생성해 나가게 됩니다. 트리라는 이름에 맞게 마치 나무를 뒤집어 놓은 모습으로 생각하실 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;525&quot; data-origin-height=&quot;521&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3LuYd/btrkJ6F6APp/R4mDkuHIarHP1er9nmFM90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3LuYd/btrkJ6F6APp/R4mDkuHIarHP1er9nmFM90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3LuYd/btrkJ6F6APp/R4mDkuHIarHP1er9nmFM90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3LuYd%2FbtrkJ6F6APp%2FR4mDkuHIarHP1er9nmFM90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;525&quot; height=&quot;521&quot; data-origin-width=&quot;525&quot; data-origin-height=&quot;521&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1636723866533&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;template &amp;lt;typename T&amp;gt;
struct node {
	T data;
	node&amp;lt;T&amp;gt;* left;
	node&amp;lt;T&amp;gt;* right;

};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 노드의 구조는 이렇게 데이터와, 왼쪽 자식 노드 주소 오른쪽 자식 노드 주소로 이뤄져 있습니다. 이런 식으로 노드가 만들어져 있을 때 탐색 알고리즘 네 가지에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 전위 순회(preorder traversal)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전위 순회는 탐색 순서가 (부모 -&amp;gt; 왼쪽 자식 -&amp;gt; 오른쪽 자식)으로 이루어지게 됩니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;872&quot; data-origin-height=&quot;729&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coziRH/btrkGM3HsDf/w2Jb1c0b0k8PaWRXgE5WEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coziRH/btrkGM3HsDf/w2Jb1c0b0k8PaWRXgE5WEk/img.png&quot; data-alt=&quot;그림. 이진 트리 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coziRH/btrkGM3HsDf/w2Jb1c0b0k8PaWRXgE5WEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoziRH%2FbtrkGM3HsDf%2Fw2Jb1c0b0k8PaWRXgE5WEk%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;872&quot; height=&quot;729&quot; data-origin-width=&quot;872&quot; data-origin-height=&quot;729&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림. 이진 트리 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 이진트리 예시 그림으로 예를 들어 제가 3번 노드에서 해당 탐색법을 이용할 경우 3 -&amp;gt; 5 -&amp;gt; 6 순서로 탐색이 진행됩니다. 이걸 전체 트리에 적용시켜 루트에서부터 전위 탐색을 사용하게 되면 어떻게 될까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과는 0, 1, 2, 3, 5, 6, 4, 7, 8 순서로 탐색이 일어나게 됩니다. 이에 대한 탐색 코드는 아래와 같습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1636724328213&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;template &amp;lt;typename T&amp;gt;
void preorder_tracer(node&amp;lt;T&amp;gt;* run_point) {
	if (!run_point) return;

	cout &amp;lt;&amp;lt; run_point-&amp;gt;data &amp;lt;&amp;lt; endl;
	preorder_tracer(run_point-&amp;gt;left);
	preorder_tracer(run_point-&amp;gt;right);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 중위 순회(in-order traversal)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;그렇다면 중위 순회는 어떨까요? 중위 탐색은 (왼쪽 자식 노드 -&amp;gt; 부모 노드 -&amp;gt; 오른쪽 자식 노드) 순서로 탐색이 이뤄집니다. 마찬가지의 예시로 노드 3에서 보면 5-&amp;gt;3-&amp;gt;6 순서로 이뤄지게 될 것으로 예상할 수 있습니다.&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;결과는 5, 3, 6, 2, 7, 4, 8, 1, 0 순서가 됩니다. 왼쪽부터 착실히 탐색이 되네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에 대한 코드는 아래와 같습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1636724496825&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;template &amp;lt;typename T&amp;gt;
void inodrer_tracer(node&amp;lt;T&amp;gt;* run_point) {
	if (!run_point) return;
	inodrer_tracer(run_point-&amp;gt;left);
	cout &amp;lt;&amp;lt; run_point-&amp;gt;data &amp;lt;&amp;lt; endl;
	inodrer_tracer(run_point-&amp;gt;right);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 후위 순회(post-order traversal)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;후위 순회는 자식 노드들부터 탐색하는 알고리즘으로 (왼쪽 자식 노드 -&amp;gt; 오른쪽 자식 노드 -&amp;gt; 부모 노드) 순으로 탐색을 진행하게 됩니다. 역시 3번 노드에서 이를 해석해보면 5, 6, 3 순서로 검색이 이뤄지겠군요&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;결과는 5, 6, 3, 7, 8, 4, 2, 1, 0 순서로 이뤄지게 됩니다. 이에 대한 코드는 아래와 같습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1636724759871&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;template &amp;lt;typename T&amp;gt;
void postodrer_tracer(node&amp;lt;T&amp;gt;* run_point) {
	if (!run_point) return;
	postodrer_tracer(run_point-&amp;gt;left);
	postodrer_tracer(run_point-&amp;gt;right);
	cout &amp;lt;&amp;lt; run_point-&amp;gt;data &amp;lt;&amp;lt; endl;

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 레벨 순서 순회(level oreder traversal)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;레벨 순서 순회는 루트 노드부터 아래 노드로 같은 높이(hegiht)의 노드를 왼쪽 노드에서부터 오른쪽 노드로 검색하는 방법입니다. 즉 전체 트리에서 탐색을 진행할 경우 결과는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3 4&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5 6 7 8&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;과 같은 형태로 순회하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에 대한 코드는 아래와 같고, 저는 BFS를 이용해 이를 만들었습니다. 다음에 BFS에 대해서 제가 한번 글을 쓰도록 하겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1636724920718&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;template&amp;lt;typename T&amp;gt;
void levelorder_tracer(node&amp;lt;T&amp;gt;* run_point) {
	if (!run_point) return;
	queue&amp;lt;node&amp;lt;T&amp;gt;*&amp;gt; Queue_;
	Queue_.push(run_point);
	while (!Queue_.empty()) {
		int tmp_size = Queue_.size();
		for (int i = 0; i &amp;lt; tmp_size; i++) {
			node&amp;lt;T&amp;gt;* current = Queue_.front();
			cout &amp;lt;&amp;lt; current-&amp;gt;data &amp;lt;&amp;lt; &quot; &quot;;
			if (current-&amp;gt;left != NULL) Queue_.push(current-&amp;gt;left);
			if (current-&amp;gt;right != NULL) Queue_.push(current-&amp;gt;right);
			Queue_.pop();
		}
		cout &amp;lt;&amp;lt; endl;
		
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네 이렇게 이진트리와 순회 방법들에 대해서 알아봤습니다. 저도 리마인드하고 좋았던 것 같습니다. 다음도 제가 공부한 내용 또는 제가 구현에 시도한 코딩 방법을 통해 찾아뵙도록 하겠습니다. 감사합니다.&lt;/p&gt;</description>
      <category>C &amp;amp;&amp;amp; C++</category>
      <category>Binary Tree</category>
      <category>inorder</category>
      <category>levelorder</category>
      <category>postorder</category>
      <category>preorder</category>
      <category>레벨 순서 순회</category>
      <category>이진 트리</category>
      <category>전위 순회</category>
      <category>중위 순회</category>
      <category>후위 순회</category>
      <author>힘법사</author>
      <guid isPermaLink="true">https://himbopsa.tistory.com/47</guid>
      <comments>https://himbopsa.tistory.com/47#entry47comment</comments>
      <pubDate>Fri, 12 Nov 2021 22:51:20 +0900</pubDate>
    </item>
    <item>
      <title>[C++] Adaptive Huffman Coding(적응형 허프만 코딩)</title>
      <link>https://himbopsa.tistory.com/46</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;안녕하십니까, 힘법사입니다. 이번 글은 적응형 허프만 코딩에 대한 글입니다. 직접 게시물과 마찬가지로 제가 보고서를 작성하면서 만든 코드와 보고서 내용을 통해 게시물을 작성했습니다! 해당 내용은 굉장히 이론 자체는 쉬웠는데 솔직히 구현하는데 8시간 정도 들만큼 조금 애를 먹은 것 같습니다... 하지만 어떻게든 만들어 내니 뿌듯하네요 ㅎㅎ 아쉬운 점은 Node 구조체에 제가 탐색의 편의를 위해서 부모 노드의 주소를 가지고 있는 포인터 변수를 하나 넣었는데 이거 말고 노드의 번호를 넣어서 구현했으면 어떗을까 조금 아쉽네요(유튜브를 보니 전부 노드의 번호를 이용해주더라고요) 먼저 코드 주소부터 올리겠습니다. 파일은 간단하게 헤더파일 하나가 올라가있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/2017103030/Adaptive-Huffman-Coding&quot;&gt;2017103030/Adaptive-Huffman-Coding: 적응형 허프만 코딩 헤더 파일입니다. (github.com)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636531225370&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - 2017103030/Adaptive-Huffman-Coding: 적응형 허프만 코딩 헤더 파일입니다.&quot; data-og-description=&quot;적응형 허프만 코딩 헤더 파일입니다. Contribute to 2017103030/Adaptive-Huffman-Coding development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/2017103030/Adaptive-Huffman-Coding&quot; data-og-url=&quot;https://github.com/2017103030/Adaptive-Huffman-Coding&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dYaITb/hyMigI6V8L/1xP4VKrQJ2r4FCSqVoyFo1/img.png?width=1200&amp;amp;height=600&amp;amp;face=973_144_1061_239&quot;&gt;&lt;a href=&quot;https://github.com/2017103030/Adaptive-Huffman-Coding&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/2017103030/Adaptive-Huffman-Coding&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dYaITb/hyMigI6V8L/1xP4VKrQJ2r4FCSqVoyFo1/img.png?width=1200&amp;amp;height=600&amp;amp;face=973_144_1061_239');&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;GitHub - 2017103030/Adaptive-Huffman-Coding: 적응형 허프만 코딩 헤더 파일입니다.&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;적응형 허프만 코딩 헤더 파일입니다. Contribute to 2017103030/Adaptive-Huffman-Coding development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.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;&lt;span&gt;I. 코드&lt;/span&gt;&lt;span&gt;의 목적&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Adaptive Huffman coding &lt;/span&gt;&lt;span&gt;구현과 이해&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;적응형 허프만 코딩&lt;/span&gt;&lt;span&gt;(Adaptive Huffman coding)&lt;/span&gt;&lt;span&gt;은 허프만 코딩을 기반으로한 &lt;/span&gt;&lt;span&gt;Adaptive coding &lt;/span&gt;&lt;span&gt;기법이다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;허프만 코딩의 경우 확률 테이블이 없다면 수행이 불가능 하지만 적응형 허프만 코딩의 경우 사전에 데이터에 대한 초기 정보 없이도&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;데이터들이 전송되고 이는 중에도 계속해서 코드를 생성해 나갈 수 있다는 장점이 있다 그렇기 때문에&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;실시간&lt;/span&gt;&lt;span&gt;(real-time)&lt;/span&gt;&lt;span&gt;시스템에서 인코딩 용으로 활용하기 매우 적합하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;실습에서는 이러한 적응형 허프만 코딩을 구현해 적용해보았을 때 한 심볼을 &lt;/span&gt;&lt;span&gt;1byte&lt;/span&gt;&lt;span&gt;로 잡았을 때와 비교해서 얼마나 데이터가 줄어들 수 있는지 확인해볼 수 있다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;II.&lt;/span&gt;&lt;span&gt;과정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1. node &lt;/span&gt;&lt;span&gt;구조체&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;코드는 노드 구조체를 사용한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;노드 구조체는 심볼&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;빈도&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;코드&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;자식 노드의 주소들&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;그리고 부모 노드의 주소로 구성된다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;해당 구조체에 대한 구체적인 설명은 표&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;에 나타내었다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;여기서 조금은 특별한 값은 부모 노드의 주소를 가지고 있는 &lt;/span&gt;&lt;span&gt;parent &lt;/span&gt;&lt;span&gt;값이다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;사실 자식 노드의 주소들만으로 전체 구조를 표현하여도&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;전체적인 트리의 구조를 파악할 수 있지만&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;적응형 허프만 코딩에서는 자식 노드의 변화에 따라 부모노드의 상태가 매우 적극적으로 그리고 동적으로 변화하기 때문에 더 편리하고 빠른 탐색을 가능하도록 하기 위해서 해당 값을 넣어주었다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;변수&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;설명&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;characters : string &lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;심볼 즉 대표하는 문자를 담고 있다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;frequency : unsigned int&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;현재까지 해당 심볼의 빈도를 저장한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;code : string&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;코드를 저장한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;leftChild : node*&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;왼쪽 자식노드의 주소를 저장한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;rightChild : node*&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;오른쪽 자식노드의 주소를 저장한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;parent : node*&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;부모 노드의 주소를 저장한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;2. &lt;/span&gt;&lt;span&gt;함수들&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;함수는 총 &lt;/span&gt;&lt;span&gt;9&lt;/span&gt;&lt;span&gt;개로 크게&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;전체 인코딩을 관장하는 함수&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;노드의 상태와 위치를 변화시키는 함수군&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;노드의 탐색과 검사를 진행하는 함수군으로 나눠져있다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;함수들에 대한 구체적인 서명과 설명은 표&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;에 나타내었다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;해당 함수들 중 가장 중요한 함수는 &lt;/span&gt;&lt;span&gt;get_adaptive_huffman_code() : void &lt;/span&gt;&lt;span&gt;으로 해당 함수에서 모든 논리 순서와 동작을 제어하고 서버처럼 다른 함수들을 불러서 사용한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;또 다른 특이 사항으로는 모든 탐색과 관련된 함수는 내부에서 큐&lt;/span&gt;&lt;span&gt;(Queue) &lt;/span&gt;&lt;span&gt;자료구조를 이용해주며 &lt;/span&gt;&lt;span&gt;BFS(Breadth first search, &lt;/span&gt;&lt;span&gt;넓이 우선 탬색&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;알고리즘을 사용해서 동작하게 된다&lt;/span&gt;&lt;span&gt;. BFS&lt;/span&gt;&lt;span&gt;를 사용한 이유는 탐색을 빨리 종료하게 하기 위함과&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;트리에서 노드의 깊이를 알 필요있기 때문이다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;함수&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;설명&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;SwapNode(node*,node*) : void&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;입력받은 두 노드의 위치를 바꿔준다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;findnode(node*,string): node*&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;원하는 심볼의 트리내 주소를 반환해준다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;탐색 알고리즘은 &lt;/span&gt;&lt;span&gt;BFS&lt;/span&gt;&lt;span&gt;로 수행된다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;SearchDepth(node&amp;amp;,string) : int&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;트리에서 찾고자 하는 심볼의 깊이를 반환한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;찾지못할 경우 &lt;/span&gt;&lt;span&gt;&amp;ndash;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;을 반환해준다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;탐색은 &lt;/span&gt;&lt;span&gt;BFS&lt;/span&gt;&lt;span&gt;로 이뤄진다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;UpdateFrequency(node *) : void&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;입력받은 노드의 주소로부터 트리 상단으로 노드의 빈도 수 값을 갱신한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;CheckTree(node&amp;amp;,node*vector&amp;lt;string&amp;gt;,vector&amp;lt;int&amp;gt;) : void&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;트리 내부의 상하 관계를 파악한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;더 깊은 곳에 있는 노드의 빈도수가 더 얕은 곳에 있는 노드의 빈도수보다 높다면 이를 바로 수정해준다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;AssignCode(node*): void&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;트리 전체의 &lt;/span&gt;&lt;span&gt;code&lt;/span&gt;&lt;span&gt;를 위치에 따라 업데이트 해준다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;CheckTree2(node *) : void&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;부모 노드의 자식 간의 관계를 검사한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;왼쪽 자식 노드가 오른쪽 자식 노드보다 빈도수가 높은 사실이 확인 이를 바로잡아준다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;Print(node *, const vector, const vector) : void&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;트리 전체의 코드를 출력해주는 함수다&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;get_adaptive_huffman_code() : void&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;자기 자신을 제외한 8개의 함수를 호출하고 관리하는 함수다. 궁극적으로 적응형 허프만 코딩이 동작하도록 관리한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;표 &lt;/span&gt;&lt;span&gt;2 &lt;/span&gt;&lt;span&gt;적응형 호프만 코딩을 위한 함수들&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;3. &lt;/span&gt;&lt;span&gt;적응형 허프만 코딩의 동작&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;3-1 &lt;/span&gt;&lt;span&gt;루트 노드 초기화&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;처음 프로그램이 동작하면 루트 노드를 생성하고 해당 노드에 &lt;/span&gt;&lt;span&gt;NEW &lt;/span&gt;&lt;span&gt;노드에 해당하는 값인 빈도수&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;과 심볼에는 해당 노드가 &lt;/span&gt;&lt;span&gt;NEW&lt;/span&gt;&lt;span&gt;임을 알려주기 위해 &lt;/span&gt;&lt;span&gt;NEW &lt;/span&gt;&lt;span&gt;값을 적어준다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;그리고 가리키는 다른 노드들이 없기 때문에 전부 &lt;/span&gt;&lt;span&gt;NULL&lt;/span&gt;&lt;span&gt;로 초기화 시킨다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;3-2 &lt;/span&gt;&lt;span&gt;사용자 입력 단계&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;사용자로부터 받은 심볼을 검사하는 단계다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;지금까지 입력으로 들어온 이력을 관리하는 배열인 &lt;/span&gt;&lt;span&gt;vector&amp;lt;string&amp;gt; charst&lt;/span&gt;&lt;span&gt;을 검색해 해당 심볼이 이전에 없던 심볼이라면 &lt;/span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt;를 수행한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;만약 이력이 있는 심볼이면 &lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span&gt;를 수행한다&lt;/span&gt;&lt;span&gt;. quit&lt;/span&gt;&lt;span&gt;이 입력되면 종료한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;325&quot; data-origin-height=&quot;172&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bowr9m/btrko7NPF81/FvBA5SY4pstmMXZh6Owx61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bowr9m/btrko7NPF81/FvBA5SY4pstmMXZh6Owx61/img.png&quot; data-alt=&quot;그림1&amp;amp;amp;nbsp; 사용자의 입력을 기다리는 화면 &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bowr9m/btrko7NPF81/FvBA5SY4pstmMXZh6Owx61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbowr9m%2Fbtrko7NPF81%2FFvBA5SY4pstmMXZh6Owx61%2Fimg.png&quot; data-origin-width=&quot;325&quot; data-origin-height=&quot;172&quot; data-ke-mobilestyle=&quot;widthOrigin&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;그림1&amp;nbsp; 사용자의 입력을 기다리는 화면 &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;A. &lt;/span&gt;&lt;span&gt;트리에 존재하지 않는 심볼이 입력으로 들어왔을 경우&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;해당 경우 &lt;/span&gt;&lt;span&gt;NEW &lt;/span&gt;&lt;span&gt;노드가 현재 트리 상 어디에 있는지 탐색한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;해당 과정은 &lt;/span&gt;&lt;span&gt;findnode &lt;/span&gt;&lt;span&gt;함수를 통해서 수행되고&lt;/span&gt;&lt;span&gt;, NEW &lt;/span&gt;&lt;span&gt;노드를 찾을 때 까지 &lt;/span&gt;&lt;span&gt;BFS &lt;/span&gt;&lt;span&gt;알고리즘을 계속해서 수행한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;NEW &lt;/span&gt;&lt;span&gt;노드를 찾게 되면 기존의 &lt;/span&gt;&lt;span&gt;NEW &lt;/span&gt;&lt;span&gt;노드는 또 하나의 부모 노드로 정보를 업데이트 해주고 해당 부모 노드 아래에 새로운 &lt;/span&gt;&lt;span&gt;NEW &lt;/span&gt;&lt;span&gt;노드와 새 심볼 노드를 생성한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;446&quot; data-origin-height=&quot;283&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1M5Qz/btrkpP0rKKj/k8g8V093IGQQuKEowQoS8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1M5Qz/btrkpP0rKKj/k8g8V093IGQQuKEowQoS8K/img.png&quot; data-alt=&quot;그림2&amp;amp;amp;nbsp; 새로운 NEW 노드 생성 과정 &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1M5Qz/btrkpP0rKKj/k8g8V093IGQQuKEowQoS8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1M5Qz%2FbtrkpP0rKKj%2Fk8g8V093IGQQuKEowQoS8K%2Fimg.png&quot; data-origin-width=&quot;446&quot; data-origin-height=&quot;283&quot; data-ke-mobilestyle=&quot;widthOrigin&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;그림2&amp;nbsp; 새로운 NEW 노드 생성 과정 &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;해당 과정을 보여주는 것이 그림&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;로 보게 되면 새로운 빈도수 &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;의 &lt;/span&gt;&lt;span&gt;NEW &lt;/span&gt;&lt;span&gt;하나와 기존에 없던 심볼 &lt;/span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt;를 생성한 모습이다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;457&quot; data-origin-height=&quot;465&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2qAE6/btrkqGPK0rE/iRsEL52ZVeqlNDQZxpVOc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2qAE6/btrkqGPK0rE/iRsEL52ZVeqlNDQZxpVOc1/img.png&quot; data-alt=&quot;그림3&amp;amp;amp;nbsp; 루트 노드에서 A를 입력으로 준 결과 &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2qAE6/btrkqGPK0rE/iRsEL52ZVeqlNDQZxpVOc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2qAE6%2FbtrkqGPK0rE%2FiRsEL52ZVeqlNDQZxpVOc1%2Fimg.png&quot; data-origin-width=&quot;457&quot; data-origin-height=&quot;465&quot; data-ke-mobilestyle=&quot;widthOrigin&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;그림3&amp;nbsp; 루트 노드에서 A를 입력으로 준 결과 &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;이에 대한 프로그램 출력 결과는 그림&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;과 같다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;그림&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;은 모든 리프노드&lt;/span&gt;&lt;span&gt;(Leaf Node)&lt;/span&gt;&lt;span&gt;를 출력하도록 한 것인데&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;리프노드가 두 개 생성된 것을 확인할 수 있다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;B. &lt;/span&gt;&lt;span&gt;트리에 존재하는 심볼이 입력으로 들어왔을 경우&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;해당 경우 &lt;/span&gt;&lt;span&gt;findnode &lt;/span&gt;&lt;span&gt;함수를 통해 &lt;/span&gt;&lt;span&gt;BFS &lt;/span&gt;&lt;span&gt;알고리즘으로 해당 심볼이 트리 내 어디 존재하는지 탐색을 진행한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;탐색을 끝마치고 나면&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;해당 주소의 노드의 빈도수를 &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;만큼 올려준다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;3-3 &lt;/span&gt;&lt;span&gt;트리 빈도수 갱신 및 검사 단계&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;앞선 단계와 같이 하위 노드를 만들어주거나 노드들의 상태를 변화시켜주면&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;이와 연관된 상위의 노드들의 빈도수 값 또한 변해야한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;이 과정은 &lt;/span&gt;&lt;span&gt;UpdateFrequency &lt;/span&gt;&lt;span&gt;함수를 이용해 수행된다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;그림&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;는 이 과정을 잘 보여주고 있다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;그림&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;의 &lt;/span&gt;&lt;span&gt;StepI&lt;/span&gt;&lt;span&gt;처럼 두 자식노드에 변화가 생기게 되면&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;이를 바로 그 상위 부모노드인 &lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;의 빈도수 값을 결정짓게 하고 이는 다시 그 부모 노드 &lt;/span&gt;&lt;span&gt;y&lt;/span&gt;&lt;span&gt;에 영향을 줘 빈도수 값을 &lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt;로 만들게 된다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;471&quot; data-origin-height=&quot;365&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ryPRw/btrktc1El1I/RWhMnV656MZ8P9wX2OaPQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ryPRw/btrktc1El1I/RWhMnV656MZ8P9wX2OaPQ1/img.png&quot; data-alt=&quot;그림4&amp;amp;amp;nbsp; 빈도수 갱신의 과정을 보여주는 그림 &amp;amp;amp;nbsp; &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ryPRw/btrktc1El1I/RWhMnV656MZ8P9wX2OaPQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FryPRw%2Fbtrktc1El1I%2FRWhMnV656MZ8P9wX2OaPQ1%2Fimg.png&quot; data-origin-width=&quot;471&quot; data-origin-height=&quot;365&quot; data-ke-mobilestyle=&quot;widthOrigin&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;그림4&amp;nbsp; 빈도수 갱신의 과정을 보여주는 그림 &amp;nbsp; &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;빈도수를 갱신하고 나면&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;트리의 규칙이 깨질 수 있다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;이 때 트리의 규칙이 깨졌는지 검사를 하는 단계를 실행 해야한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;검사는 두 종류를 실시한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;a) &lt;/span&gt;&lt;span&gt;트리의 노드들은 상하관계에 따라 더 상위에 있는 노드들이 빈도수가 같거나 높아야한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;b) &lt;/span&gt;&lt;span&gt;트리의 노드들은 항상 오른쪽 자식 노드가 왼쪽 자식 노드의 빈도수 보다 같거나 커야 한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;우선 &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;를 위해서 모든 심볼들의 깊이와 빈도수를 검사한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;깊이 검사는 &lt;/span&gt;&lt;span&gt;BFS&lt;/span&gt;&lt;span&gt;로 이뤄지게 되고 깊이 검사 결과 상위 심볼들 보다 더 빈도수가 높은 심볼이 탐지되게 되면 두 노드들의 위치를 바꿔준다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;해당 과정은 &lt;/span&gt;&lt;span&gt;SwapNode&lt;/span&gt;&lt;span&gt;함수로 수행되게 된다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;상하 관계 검사를 &lt;/span&gt;&lt;span&gt;CheckTree &lt;/span&gt;&lt;span&gt;함수를 통해 마치게 되면 수평관계를 검사한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;이는 &lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;의 규칙을 위반했는지 확인하는 검사로 &lt;/span&gt;&lt;span&gt;CheckTree2 &lt;/span&gt;&lt;span&gt;함수로 이뤄진다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;검사 과정은 루트로부터 모든 노드들을 검사해 가며 &lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;를 어기는 노드가 있다면 &lt;/span&gt;&lt;span&gt;SwapNode&lt;/span&gt;&lt;span&gt;를 통해 규칙을 다시 바로잡아 준다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;3-4 &lt;/span&gt;&lt;span&gt;코드 할당 단계&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;해당 단계는 &lt;/span&gt;&lt;span&gt;AssignCode &lt;/span&gt;&lt;span&gt;함수를 이용해 수행된다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;수행은 매우 간단하다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;490&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NqWbZ/btrkuondFEz/G2ewkLGDFKPRRgMlcyBRI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NqWbZ/btrkuondFEz/G2ewkLGDFKPRRgMlcyBRI1/img.png&quot; data-alt=&quot;그림5&amp;amp;amp;nbsp; 코드 할당을 보여주는 그림 &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NqWbZ/btrkuondFEz/G2ewkLGDFKPRRgMlcyBRI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNqWbZ%2FbtrkuondFEz%2FG2ewkLGDFKPRRgMlcyBRI1%2Fimg.png&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;490&quot; data-ke-mobilestyle=&quot;widthOrigin&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;그림5&amp;nbsp; 코드 할당을 보여주는 그림 &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그림 &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;와 같이 왼쪽 자식 노드에는 &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;을 오른쪽 자신 노드에는 &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;을 할당해줘가며 모든 리프노드에 대해서 코드를 할당하도록 한다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;이 과정을 끝내면 다시 &lt;/span&gt;&lt;span&gt;3-2&lt;/span&gt;&lt;span&gt;단게로 돌아가 반복한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adfit&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;728x90&lt;/div&gt;
    &lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display: none;&quot; data-ad-unit=&quot;DAN-6NEVqUUGyBWfyhEK&quot; data-ad-width=&quot;728px&quot; data-ad-height=&quot;90px&quot;&gt;&lt;/ins&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;III. &lt;/span&gt;&lt;span&gt;결론&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;이렇게 구성된 적응형 허프만 코딩 알고리즘의 수행결과를 보도록 하겠다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;테스트할 메시지는 &lt;/span&gt;&lt;span&gt;AADCCDD&lt;/span&gt;&lt;span&gt;이며 예상되는 결과는 그림&lt;/span&gt;&lt;span&gt;6&lt;/span&gt;&lt;span&gt;과 같은 트리고&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;결과는 표&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;와 같이 나올 것으로 기대할 수 있다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;440&quot; data-origin-height=&quot;388&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MSudB/btrko6Bqtkv/qC4egDMyt9iv2KQb7kKZrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MSudB/btrko6Bqtkv/qC4egDMyt9iv2KQb7kKZrK/img.png&quot; data-alt=&quot;그림6&amp;amp;amp;nbsp; 예상되는 테스트 트리 &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MSudB/btrko6Bqtkv/qC4egDMyt9iv2KQb7kKZrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMSudB%2Fbtrko6Bqtkv%2FqC4egDMyt9iv2KQb7kKZrK%2Fimg.png&quot; data-origin-width=&quot;440&quot; data-origin-height=&quot;388&quot; data-ke-mobilestyle=&quot;widthOrigin&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;그림6&amp;nbsp; 예상되는 테스트 트리 &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;심볼&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;코드&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;101&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;D&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;C&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;11&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;NEW&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span&gt;100&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;표4&amp;nbsp;&lt;/span&gt;&lt;span&gt; 예상되는 결과 표&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이에 대한 전체 입력 과정은 그림&lt;/span&gt;&lt;span&gt;7&lt;/span&gt;&lt;span&gt;에 나타내었다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;전체 과정이 잘 이뤄졌고 결과를 확인해보면&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;표&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;의 예상 결과와 시스템이 만들어낸 결과가 동일한 것을 확인할 수 있다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;449&quot; data-origin-height=&quot;1016&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lRA54/btrkoRcSGDM/B4utbxewc75K25SIGXAink/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lRA54/btrkoRcSGDM/B4utbxewc75K25SIGXAink/img.png&quot; data-alt=&quot;그림7&amp;amp;amp;nbsp; 테스트 메시지를 순서대로 모두 입력한 모습 &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lRA54/btrkoRcSGDM/B4utbxewc75K25SIGXAink/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlRA54%2FbtrkoRcSGDM%2FB4utbxewc75K25SIGXAink%2Fimg.png&quot; data-origin-width=&quot;449&quot; data-origin-height=&quot;1016&quot; data-ke-mobilestyle=&quot;widthOrigin&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;그림7&amp;nbsp; 테스트 메시지를 순서대로 모두 입력한 모습 &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;만약 해당 경우 &lt;/span&gt;&lt;span&gt;AADCCDD &lt;/span&gt;&lt;span&gt;메시지를 모두 &lt;/span&gt;&lt;span&gt;ASCII &lt;/span&gt;&lt;span&gt;코드로 보낸다고 가정했을 시 &lt;/span&gt;&lt;span&gt;7Byte &lt;/span&gt;&lt;span&gt;즉&lt;/span&gt;&lt;span&gt;, 56 bit&lt;/span&gt;&lt;span&gt;가 소모되는 것을 알 수 있다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;하지만 시스템을 통해 적응형 호프만 코딩을 해본 결과 &lt;/span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt;는 &lt;/span&gt;&lt;span&gt;3bit, D&lt;/span&gt;&lt;span&gt;는 &lt;/span&gt;&lt;span&gt;1bit, C&lt;/span&gt;&lt;span&gt;는 &lt;/span&gt;&lt;span&gt;2bit&lt;/span&gt;&lt;span&gt;로 &lt;/span&gt;&lt;span&gt;13bit&lt;/span&gt;&lt;span&gt;만이 소모되는 것을 알 수 있다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;이는 데이터량이 &lt;/span&gt;&lt;span&gt;4.31&lt;/span&gt;&lt;span&gt;배 차이나는 결과로 이를 통해 실제 적응형 허프만 코딩을 하는 것이 매우 유용한 것을 알 수 있다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;</description>
      <category>C &amp;amp;&amp;amp; C++</category>
      <category>Adaptive coding</category>
      <category>Adaptive huffman coding</category>
      <category>C++</category>
      <category>C++ 예제</category>
      <category>compression</category>
      <category>huffman coding</category>
      <category>Lossless</category>
      <category>무손실 압축</category>
      <category>적응형 허프만 코딩</category>
      <category>허프만 코딩</category>
      <author>힘법사</author>
      <guid isPermaLink="true">https://himbopsa.tistory.com/46</guid>
      <comments>https://himbopsa.tistory.com/46#entry46comment</comments>
      <pubDate>Wed, 10 Nov 2021 17:06:50 +0900</pubDate>
    </item>
  </channel>
</rss>