<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>오늘의 공부</title>
    <link>https://novemberfirst.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Fri, 10 Apr 2026 21:35:11 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>11월1일</managingEditor>
    <image>
      <title>오늘의 공부</title>
      <url>https://tistory1.daumcdn.net/tistory/2925102/attach/9dcd019bffa14b58a5f20c2425b87803</url>
      <link>https://novemberfirst.tistory.com</link>
    </image>
    <item>
      <title>[SVN/Jenkins] E155004 Error  (svn: E155004: Lock file)</title>
      <link>https://novemberfirst.tistory.com/121</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;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;iOS 자동빌드를 위해 Jenkins에 연결 중.. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;빌드 시 SVN의 저장소가 lock이 걸렸다는 로그가 콘솔에 찍히며 빌드에 실패했다.&amp;nbsp;&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;816&quot; data-origin-height=&quot;143&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Phdcg/btrtEwp0tt4/BXM4qx5BTvQIwTFohwuQ30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Phdcg/btrtEwp0tt4/BXM4qx5BTvQIwTFohwuQ30/img.png&quot; data-alt=&quot;젠킨스 빌드의 Console Output&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Phdcg/btrtEwp0tt4/BXM4qx5BTvQIwTFohwuQ30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPhdcg%2FbtrtEwp0tt4%2FBXM4qx5BTvQIwTFohwuQ30%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;816&quot; height=&quot;143&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;143&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;젠킨스 빌드의 Console Output&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;뭘까.. 하다가 검색해보니 &lt;b&gt;.svn에 lock&lt;/b&gt;파일을 지우거나 &lt;b&gt;Clean up&lt;/b&gt;을 해주면 된다고 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;.svn에 lock파일은 없었고 없으면 Clean up해주면 된다는 내용대로 따라해보기로 했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;(lock파일이 없으면 wc.db 파일을 SQLite를 실행해 작업을 해주면 된다는데... SQLite를 다운받아서 데이터베이스 파일을 까고싶지는 않았다...)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Clean up을 하고 다시 빌드를 눌렀는데..!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;똑같은 에러가 발생하며 빌드에 실패했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;무엇이 문제인고 하니&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Clean Up의 기본 설정에서 Breakup Lock을 체크해주지 않아서.. Lock이 풀리지 않았던 거였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&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;451&quot; data-origin-height=&quot;275&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VVSu8/btrtE2iotdE/hfMNu36WgffK1r3PFLpKdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VVSu8/btrtE2iotdE/hfMNu36WgffK1r3PFLpKdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VVSu8/btrtE2iotdE/hfMNu36WgffK1r3PFLpKdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVVSu8%2FbtrtE2iotdE%2FhfMNu36WgffK1r3PFLpKdk%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;451&quot; height=&quot;275&quot; data-origin-width=&quot;451&quot; data-origin-height=&quot;275&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;오늘도 다사다난하게 해결완료했다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>etc/MEMO</category>
      <category>Jenkins</category>
      <category>LOCK</category>
      <category>svn</category>
      <author>11월1일</author>
      <guid isPermaLink="true">https://novemberfirst.tistory.com/121</guid>
      <comments>https://novemberfirst.tistory.com/121#entry121comment</comments>
      <pubDate>Fri, 18 Feb 2022 16:46:35 +0900</pubDate>
    </item>
    <item>
      <title>[C#] 닷넷 API</title>
      <link>https://novemberfirst.tistory.com/119</link>
      <description>&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;span&gt;&lt;i&gt;닷넷 API&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;C#이 사용할 수 있는 API 집합체인 닷넷에는 굉장히 많은 API가 있다.&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;◎ 닷넷 API 탐색기와 Docs&lt;/span&gt;&lt;/h3&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; font-family: 'Nanum Gothic';&quot;&gt;마이크로소프트는 닷넷 API 탐색기를 제공하여 웹에서 모든 API 검색을 할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://docs.microsoft.com/en-us/dotnet/api/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.microsoft.com/en-us/dotnet/api/&lt;/a&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;1046&quot; data-origin-height=&quot;424&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WeWKM/btroxOWp0GD/hcHwzgGFsomqNioA8t0sk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WeWKM/btroxOWp0GD/hcHwzgGFsomqNioA8t0sk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WeWKM/btroxOWp0GD/hcHwzgGFsomqNioA8t0sk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWeWKM%2FbtroxOWp0GD%2FhcHwzgGFsomqNioA8t0sk1%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;1046&quot; height=&quot;424&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;424&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;위의 링크를 들어가보면 API를 검색할 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;닷넷에서 제공하는 대부분의 API는 클래스이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;그리고 구조체, 열거형이 있고, 이러한 클래스, 구조체, 열거형을 특정 이름으로 묶어 관리하는 네임스페이스가 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;* 클래스 (Class)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;: Console 클래스, String 클래스 등 거의 대부분이 클래스이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;* 구조체 (Struct)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;: DateTime 구조체, TimeSpan 구조체 형태로 표현하며, 클래스와 거의 동일하게 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;* 열거형 (enumeration)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;: Color 열거형 등이 있으며, 특정 목록을 관리할 때 편리하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;* 네임스페이스 (namespace)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;: System 네임스페이스처럼 많은 양의 클래스와 구조체, 열거형을 묶어서 관리한다.&amp;nbsp;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1037&quot; data-origin-height=&quot;561&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xJWMY/btroxjQbOxA/X6eMxrBZNWnTjiO6ye3BJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xJWMY/btroxjQbOxA/X6eMxrBZNWnTjiO6ye3BJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xJWMY/btroxjQbOxA/X6eMxrBZNWnTjiO6ye3BJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxJWMY%2FbtroxjQbOxA%2FX6eMxrBZNWnTjiO6ye3BJK%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;1037&quot; height=&quot;561&quot; data-origin-width=&quot;1037&quot; data-origin-height=&quot;561&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;위의 API 탐색기에서 Math를 검색했을 때 System.Math를 클릭해보면 기능들을 더 자세히 볼 수 있다.&amp;nbsp;&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 style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;&lt;b&gt;참고 자료;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #000000;&quot;&gt;C# 교과서 (저; 박용준 출판사; 길벗)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Study/C++ , C#</category>
      <category>c#</category>
      <author>11월1일</author>
      <guid isPermaLink="true">https://novemberfirst.tistory.com/119</guid>
      <comments>https://novemberfirst.tistory.com/119#entry119comment</comments>
      <pubDate>Wed, 22 Dec 2021 01:41:34 +0900</pubDate>
    </item>
    <item>
      <title>[C++/알고리즘] 프로그래머스 (카카오프렌즈 컬러링북)</title>
      <link>https://novemberfirst.tistory.com/118</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;&lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/1829#&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://programmers.co.kr/learn/courses/30/lessons/1829#&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636639270930&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;코딩테스트 연습 - 카카오프렌즈 컬러링북&quot; data-og-description=&quot;6 4 [[1, 1, 1, 0], [1, 2, 2, 0], [1, 0, 0, 1], [0, 0, 0, 1], [0, 0, 0, 3], [0, 0, 0, 3]] [4, 5]&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/1829#&quot; data-og-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/1829&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/kXeIW/hyMkyVt3lX/2jpwZUFYRIvd1YK7SVjsw0/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/bld9Z7/hyMkuZQQXf/bK81SNRLVBe38GTFlCtGP1/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/cLIeVL/hyMkuZQQUH/nj1xubLkNzUM5NybBOkcE0/img.png?width=500&amp;amp;height=370&amp;amp;face=0_0_500_370&quot;&gt;&lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/1829#&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/1829#&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/kXeIW/hyMkyVt3lX/2jpwZUFYRIvd1YK7SVjsw0/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/bld9Z7/hyMkuZQQXf/bK81SNRLVBe38GTFlCtGP1/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/cLIeVL/hyMkuZQQUH/nj1xubLkNzUM5NybBOkcE0/img.png?width=500&amp;amp;height=370&amp;amp;face=0_0_500_370');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;코딩테스트 연습 - 카카오프렌즈 컬러링북&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;6 4 [[1, 1, 1, 0], [1, 2, 2, 0], [1, 0, 0, 1], [0, 0, 0, 1], [0, 0, 0, 3], [0, 0, 0, 3]] [4, 5]&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;재귀를 이용한 DFS 방식으로 풀었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;방문한 픽셀은 color값을 0으로 바꿔주고 방문 시에 해당 픽셀의 color값을 비교해 같은 부분인지 체크하는 방식으로 풀었다.&amp;nbsp;&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;pre id=&quot;code_1636639306122&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
using namespace std;

vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; v;
int sizeN, sizeM;
int maxSize = 0;

bool dfs(int x, int y, int color)
{
	if (x &amp;lt;= -1 || x &amp;gt;= sizeN || y &amp;lt;= -1 || y &amp;gt;= sizeM)
	{
		return false;
	}

	if (v[y][x] != 0 &amp;amp;&amp;amp; v[y][x] == color)
	{
		v[y][x] = 0;
		maxSize += 1;
		dfs(x - 1, y, color);
		dfs(x, y - 1, color);
		dfs(x + 1, y, color);
		dfs(x, y + 1, color);
		return true;
	}
	return false;
}


vector&amp;lt;int&amp;gt; solution(int m, int n, vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; picture) {
	vector&amp;lt;int&amp;gt; answer(2, 0);
	int number_of_area = 0;
	sizeN = n;
	sizeM = m;
	v = picture;

	for (int i = 0; i &amp;lt; m; ++i)
	{
		for (int j = 0; j &amp;lt; n; ++j)
		{
			if (dfs(j, i, picture[i][j]))
			{
				number_of_area += 1;
				answer[1] = maxSize &amp;gt; answer[1] ? maxSize : answer[1];
				maxSize = 0;
			}
		}
	}
	answer[0] = number_of_area;
	return answer;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;프로그래머스 홈페이지에서 그냥 풀다가 dfs 함수를 if문으로 체크하는 부분에 i와 j를 반대로 줘서 분명 맞는데 왜 값이 다르게 나오지? 하고 디버깅까지 찍어봤다ㅠ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;[y][x] 방식으로 이용하는데 함수에 인자로 넘겨줄 때 x,y 순서로 넘겨주고 있어서 문제가 생겼던 것이다...&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>알고리즘 &amp;amp; 자료구조/프로그래머스</category>
      <category>c++</category>
      <category>카카오프렌즈</category>
      <category>프로그래머스</category>
      <author>11월1일</author>
      <guid isPermaLink="true">https://novemberfirst.tistory.com/118</guid>
      <comments>https://novemberfirst.tistory.com/118#entry118comment</comments>
      <pubDate>Thu, 11 Nov 2021 23:04:04 +0900</pubDate>
    </item>
    <item>
      <title>[자료구조] 트리 (Tree)</title>
      <link>https://novemberfirst.tistory.com/117</link>
      <description>&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;i&gt;트리&lt;/i&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;Tree&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;트리는 객체간의 관계를 표현하는 자료구조인 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;u&gt;그래프&lt;/u&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;의 일종이다. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;◎ 트리란&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;트리는 노드들이 가지처럼 연결된 &lt;/span&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;비선형 계층적 자료구조&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이다. &lt;/span&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;621&quot; data-origin-height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bv6NmF/btrkvG2g18N/jRNjAyjA5vuSzWf1eVK7M0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bv6NmF/btrkvG2g18N/jRNjAyjA5vuSzWf1eVK7M0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bv6NmF/btrkvG2g18N/jRNjAyjA5vuSzWf1eVK7M0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbv6NmF%2FbtrkvG2g18N%2FjRNjAyjA5vuSzWf1eVK7M0%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;621&quot; height=&quot;252&quot; data-origin-width=&quot;621&quot; data-origin-height=&quot;252&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;노드&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; : 트리의 구성요소에 해당하는 A,B, C, D, E, F와 같은 요소&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;간선&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; : 노드와 노드를 연결하는 연결선&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;루트 노드&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; : 트리 구조에서 최상위에 존재하는 A와 같은 노드&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;단말 노드&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; : 아래로 또 다른 노드가 연결되어 있지 않은 가장 마지막 (E,F,C,D와 같은) 노드&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;내부 노드&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; : 단말 노드를 제외한 모든 노드 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;레벨&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; : 각 층 별로 숫자를 매긴 것&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;높이&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; : 트리의 최고 레벨&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;◎ 이진트리&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PqIDM/btrkweLdJPG/KPZWoZ9eAnUkssK6aDkjlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PqIDM/btrkweLdJPG/KPZWoZ9eAnUkssK6aDkjlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PqIDM/btrkweLdJPG/KPZWoZ9eAnUkssK6aDkjlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPqIDM%2FbtrkweLdJPG%2FKPZWoZ9eAnUkssK6aDkjlK%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;402&quot; height=&quot;342&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;342&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; font-family: 'Nanum Gothic';&quot;&gt;이진트리란 루트 노드를 중심으로 두 개의 서브 트리로 나누어지며 나누어진 두 서브 트리도 모두 이진 트리여야 한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;즉, A를 기준으로 B,D,E가 왼쪽 서브 트리 C,F,G가 오른쪽 서브트리이며 각각의 서브 트리들도 이진 트리여야 한다.&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;711&quot; data-origin-height=&quot;292&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QNye3/btrkwfchA6d/j6nkt2Sgg9kKnSF2lfBp0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QNye3/btrkwfchA6d/j6nkt2Sgg9kKnSF2lfBp0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QNye3/btrkwfchA6d/j6nkt2Sgg9kKnSF2lfBp0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQNye3%2FbtrkwfchA6d%2Fj6nkt2Sgg9kKnSF2lfBp0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;711&quot; height=&quot;292&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;292&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; font-family: 'Nanum Gothic';&quot;&gt;여기서 왼쪽과 같은 트리도 이진트리가 된다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;노드가 위치할 수 있는 곳에 노드가 존재하지 않으면 공집합 노드가 존재하는 것으로 간주해 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;u&gt;공집합 노드도&lt;/u&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;'노드로 인정'&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하기 때문이다. &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이진 트리는 여러 분류로 나뉠 수 있는데 그 중 &lt;/span&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;완전 이진트리와 포화 이진트리&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;가 존재한다.&lt;/span&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;281&quot; data-origin-height=&quot;291&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2p41T/btrkpO8Op8n/bSY7HPN5hKR7nBieD6kfu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2p41T/btrkpO8Op8n/bSY7HPN5hKR7nBieD6kfu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2p41T/btrkpO8Op8n/bSY7HPN5hKR7nBieD6kfu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2p41T%2FbtrkpO8Op8n%2FbSY7HPN5hKR7nBieD6kfu0%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;281&quot; height=&quot;291&quot; data-origin-width=&quot;281&quot; data-origin-height=&quot;291&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;포화 이진 트리&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;는 위의 그림과 같이 모든 레벨이 꽉 차 있으며 노드를 더 추가하려면 레벨을 늘려야 하는 트리이다. &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;이 포화 이진 트리에서 레벨을 하나 더 늘려 H와 I를 추가한 다음 이진 트리를 보면 포화 이진 트리처럼 모든 레벨이 꽉 찬 상태는 아니지만 차곡차곡 빈 틈 없이 노드가 채워진 이진 트리가 된다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;여기서의 '차곡차곡 빈 틈 없이'는 노드가 위에서 아래로, 그리고 왼쪽에서 오른쪽의 순서대로 채워졌다는 의미가 된다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&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;409&quot; data-origin-height=&quot;356&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cI27p9/btrkr5CeIxz/8tkYHRkjfR0nd4k2CY0r71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cI27p9/btrkr5CeIxz/8tkYHRkjfR0nd4k2CY0r71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cI27p9/btrkr5CeIxz/8tkYHRkjfR0nd4k2CY0r71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcI27p9%2Fbtrkr5CeIxz%2F8tkYHRkjfR0nd4k2CY0r71%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;409&quot; height=&quot;356&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;356&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;완전 이진트리&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;는 임의의 두 단말 노드의 레벨 차이가 1이하인 경우이며 위의 그림과 같이 왼쪽에서 오른쪽으로 채워진 이진트리를 뜻한다.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;레벨 n까지의 모든 노드수는 2^n -1개이다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;◎ 트리의 순회&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;트리의 순회란 트리에 속하는 모든 노드를 한 번씩 방문하는 것이다. 트리의 순회 방식에는 전위, 중위, 후위 방식이 있다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;루트를 방문하는 작업을 V, 왼쪽과 오른쪽 서브 트리를 방문하는 작업을 각각 L과 R이라고 하면 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;전위&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;는 VLR, &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;중위&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;는 LVR, &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;후위&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;는 LRV 이다.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&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;250&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cs8JIv/btrkvIltTU9/4ET9FoU10DN9e2XbZmwPF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cs8JIv/btrkvIltTU9/4ET9FoU10DN9e2XbZmwPF1/img.png&quot; data-alt=&quot;[출처/ 위키피디아_트리 순회]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cs8JIv/btrkvIltTU9/4ET9FoU10DN9e2XbZmwPF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcs8JIv%2FbtrkvIltTU9%2F4ET9FoU10DN9e2XbZmwPF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;250&quot; height=&quot;199&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;199&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: #000000; font-family: 'Nanum Gothic';&quot;&gt;다음과 같은 사진이 있을 때 전위, 중위, 후위 순회의 결과는 다음과 같다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;전위 순회 : F,B,A,D,C,E,G,I,H&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;중위 순회 : A,B,C,D,E,F,G,H,I&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;후위 순회 : A,C,E,D,B,H,I,G,F&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;전위 순회&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;html xml&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;Void preorder(TNode *n) 
{ 
	If( n!= NULL ) 
    { 
    	Printf(&amp;ldquo;[%c]&amp;rdquo;, n-&amp;gt;data); 
        Preorder(n-&amp;gt;left); 
        Preorder(n-&amp;gt;right); 
     }
}&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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;중위 순회&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;html xml&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;Void inorder(TNode *n) 
{ 
	If( n!= NULL ) 
	{ 
    	inorder(n-&amp;gt;left); 
        Printf(&amp;ldquo;[%c]&amp;rdquo;, n-&amp;gt;data); 
        inorder (n-&amp;gt;right); 
    } 
}&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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;후위 순회&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;html xml&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;Void postorder(TNode *n) 
{ 
	If( n!= NULL ) 
	{ 
    	postorder(n-&amp;gt;left); 
        postorder (n-&amp;gt;right); 
        Printf(&amp;ldquo;[%c]&amp;rdquo;, n-&amp;gt;data); 
    } 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;참고로 이 트리의 전위순회 방식을 일반화시킨 그래프의 정점 순회 방법이 깊이 우선탐색 (DFS)이다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;탐색 도중에 인접된 모든 정점이 이미 방문된 정점을 만났을 때 바로 이전에 방문한 정점으로 돌아가기 위해 스택을 사용한다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;참고 자료;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;윤성우의 열혈 자료구조 (저; 윤성우, 출판; 오렌지 미디어)&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/%ED%8A%B8%EB%A6%AC_%EC%88%9C%ED%9A%8C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ko.wikipedia.org/wiki/%ED%8A%B8%EB%A6%AC_%EC%88%9C%ED%9A%8C&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>알고리즘 &amp;amp; 자료구조/자료구조</category>
      <category>순회</category>
      <category>이진트리</category>
      <category>자료구조</category>
      <category>트리</category>
      <author>11월1일</author>
      <guid isPermaLink="true">https://novemberfirst.tistory.com/117</guid>
      <comments>https://novemberfirst.tistory.com/117#entry117comment</comments>
      <pubDate>Wed, 10 Nov 2021 23:35:36 +0900</pubDate>
    </item>
    <item>
      <title>[디자인패턴] 어댑터 (Adapter)</title>
      <link>https://novemberfirst.tistory.com/116</link>
      <description>&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;i&gt;어댑터&lt;/i&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Adapter&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;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;어댑터 패턴은 다른 이름으로&lt;span style=&quot;background-color: #9feec3;&quot;&gt; &lt;u&gt;&lt;b&gt;Wrapper&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;라고 불리기도 하며 인터페이스가 호환되지 않는 클래스들을 함께 이용할 수 있도록 타 클래스의 인터페이스를 기존 인터페이스에 덧씌우는 패턴이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이미 만들어진 클래스를 &lt;u&gt;새로운 인터페이스에 맞게 개조&lt;/u&gt;시킬 때 사용하거나 &lt;u&gt;기존 클래스를 개조&lt;/u&gt;해 필요한 클래스를 만들 때 사용한다.&amp;nbsp;&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;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span&gt;어댑터 패턴의 구현에는 두 가지 종류가 있다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;◎ 객체 (Object) Adapter 패턴과 클래스 (Class) Adapter 패턴&lt;/span&gt;&lt;/h3&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;300&quot; data-origin-height=&quot;215&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Fc8nn/btrhfyHRnvk/gboUpF417mpO6PhdJuRiGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Fc8nn/btrhfyHRnvk/gboUpF417mpO6PhdJuRiGk/img.png&quot; data-alt=&quot;출처; 위키/어댑터 패턴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Fc8nn/btrhfyHRnvk/gboUpF417mpO6PhdJuRiGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFc8nn%2FbtrhfyHRnvk%2FgboUpF417mpO6PhdJuRiGk%2Fimg.png&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;215&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;출처; 위키/어댑터 패턴&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;1. 객체(Object)&lt;/b&gt; : &lt;i&gt;위임&lt;/i&gt;을 사용한 객체 어댑터 패턴&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;어댑터가 변환하려고 하는 &lt;span style=&quot;background-color: #99cefa;&quot;&gt;&lt;b&gt;클래스의 인스턴스&lt;/b&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;230&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Hix0V/btrhjXfhGIy/ZlVn3D6Zk8vEYEgKEUm5b0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Hix0V/btrhjXfhGIy/ZlVn3D6Zk8vEYEgKEUm5b0/img.png&quot; data-alt=&quot;출처; 위키/어댑터 패턴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Hix0V/btrhjXfhGIy/ZlVn3D6Zk8vEYEgKEUm5b0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHix0V%2FbtrhjXfhGIy%2FZlVn3D6Zk8vEYEgKEUm5b0%2Fimg.png&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;230&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;출처; 위키/어댑터 패턴&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;2. 클래스(Class)&lt;/b&gt; : &lt;i&gt;상속&lt;/i&gt;을 사용한 클래스 어댑터 패턴&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;어댑터가 여러개의 &lt;b&gt;다형성 인터페이스&lt;/b&gt;를 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;여러 개의 인터페이스를 &lt;span style=&quot;background-color: #99cefa;&quot;&gt;&lt;b&gt;상속&lt;/b&gt;&lt;/span&gt;하거나 구현해서 어댑터가 생성된다.&amp;nbsp;&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;◎ 장/단점&lt;/span&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 99.5467%; height: 269px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 19px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 19px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;객체 어댑터&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 19px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;클래스 어댑터&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 80px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 80px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 80px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;상속이 아닌 구성(Composition)을 사용하기 때문에 더 유연&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 80px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;1.&lt;/b&gt; 어댑터가 Adaptee의 서브클래스이기 때문에 Adaptee의 행동을 &lt;b&gt;오버라이드&lt;/b&gt;할 수 있다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;2.&lt;/b&gt; Adaptee 객체를 만들지 않아도 된다.&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 100px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 100px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 100px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Adaptee 객체를 만들어야 사용 가능&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 100px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;1.&lt;/b&gt; &lt;span style=&quot;background-color: #99cefa;&quot;&gt;&lt;b&gt;다중 상속이 지원되는 언어&lt;/b&gt;&lt;/span&gt;에서만 사용이 가능하다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;2.&lt;/b&gt; 상속을 이용하므로 한 어댑터 클래스가 &lt;span style=&quot;background-color: #99cefa;&quot;&gt;&lt;b&gt;특정 Adaptee 클래스에만 적용이 가능&lt;/b&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;참고 자료;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Adapter_pattern&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://en.wikipedia.org/wiki/Adapter_pattern&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://arisu1000.tistory.com/27679&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://arisu1000.tistory.com/27679&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0070d1; font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://invincibletyphoon.tistory.com/20&quot;&gt;https://invincibletyphoon.tistory.com/20&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://ansohxxn.github.io/design%20pattern/chapter13/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ansohxxn.github.io/design%20pattern/chapter13/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Study/디자인패턴</category>
      <category>디자인패턴</category>
      <category>어댑터</category>
      <author>11월1일</author>
      <guid isPermaLink="true">https://novemberfirst.tistory.com/116</guid>
      <comments>https://novemberfirst.tistory.com/116#entry116comment</comments>
      <pubDate>Tue, 12 Oct 2021 01:09:23 +0900</pubDate>
    </item>
    <item>
      <title>[Unity] 유니티의 렌더 파이프라인 (Render Pipeline)</title>
      <link>https://novemberfirst.tistory.com/114</link>
      <description>&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;i&gt;유니티의 렌더 파이프라인&lt;/i&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;LWRP, URP&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;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;렌더링 파이프라인은 3D 데이터들이 2D 이미지로 구성되어 그려지는 일련의 과정을 뜻한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;◎ 렌더링 파이프라인&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&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;728&quot; data-origin-height=&quot;127&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwhMSZ/btrg9kvQE8v/AWVwPA7AY8QaBVuvZxxnzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwhMSZ/btrg9kvQE8v/AWVwPA7AY8QaBVuvZxxnzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwhMSZ/btrg9kvQE8v/AWVwPA7AY8QaBVuvZxxnzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwhMSZ%2Fbtrg9kvQE8v%2FAWVwPA7AY8QaBVuvZxxnzK%2Fimg.png&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;127&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;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&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: #333333; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;⊙&lt;span style=&quot;color: #000000; background-color: #f3c000;&quot;&gt;&lt;b&gt;애&lt;/b&gt;플리케이션 스테이지&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;애플리케이션 스테이지는 애플리케이션 상에서 처리되는 단계를 의미한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;그래픽스 렌더링 파이프라인은 보통 GPU 파이프라인을 의미하므로 CPU에서 연산되는 애플리케이션 스테이지는 포함되지 않지만 본격적인 렌더링 파이프라인 진입 전 CPU에서 필요한 연산들을 처리해야 하므로 큰 의미로는 렌더링 파이프라인의 일부분이 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;ex) 플레이어의 매 프레임마다의 움직임, 애니메이션 정보와 뼈대 위치 연산 및 메시의 버텍스에 반영 등&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: #333333; font-family: 'Nanum Gothic';&quot;&gt;현재 프레임에서 렌더링 가능한 오브젝트들이 컬링 연산에 의해 구별된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;이 컬링 단계에서 효율적으로 오브젝트들이 선별되어 렌더링 되는 오브젝트 수를 줄이면 그만큼 GPU에서 처리하는 연산량이 줄게 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;또한 배칭처리를 위한 연산도 GPU 파이프라인에 진입하기 전에 이루어진다.&amp;nbsp;&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: #333333; font-family: 'Nanum Gothic';&quot;&gt;&lt;span&gt;⊙&lt;/span&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;지오메트리 스테이지&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;이 스테이지에서는 말 그대로 지오메트리 관련 정보, 즉 지오메트리를 구성하는 요소인 버텍스와 폴리곤 처리를 담당하며 아래와 같은 과정들을 거친다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;1. 월드-뷰-프로젝션 트랜스폼&lt;br /&gt;2. 클리핑&lt;br /&gt;3. 버텍스 쉐이더&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버텍스 트랜스폼(Vertex Transform)?&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;렌더링을 수행해야 되는 시점에 GPU가 메모리로부터 버텍스 정보를 가져와 적절한 위치에 그려주기 위해서 수행하는 트랜스폼이다.&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&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;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;⊙&lt;span style=&quot;background-color: #f3c000;&quot;&gt;래스터라이저 스테이지&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이 스테이지에서는 오브젝트를 그리는 픽셀들을 추리고 그 픽셀의 색을 결정한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;버텍스 쉐이더를 거쳐서 지오메트리들이 구축되면, 화면(혹은 버퍼)의 어느 픽셀에 그려져야 하는지 결정된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;메시의 폴리곤에 속한 영역을 픽셀로 매칭시키는 과정을 래스터라이제이션이라고 부른다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;레스터라이제이션이 끝나면 최종적으로 화면에 그려져야 할 픽셀의 최종 색이 결정된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;즉, 해당 스테이지에서는 렌더링하는 메시가 화면에 매칭되는 픽셀을 결정하고 최종 색을 입히는 과정이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;뎁스 버퍼, Z-버퍼를 이용해 깊이 판정을 하고 블렌딩을 통해 최종 출력 색상을 결정한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;블렌딩?&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;u&gt;투명도를 가지는 오브젝트&lt;/u&gt;는 픽셀 렌더링 시 &lt;b&gt;알파 블렌딩 과정&lt;/b&gt;을 거친다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;알파 블렌딩은 쉐이더에서 결정되는 알파값을 이용한다. 픽셀 출력의 알파값을 이용해서 해당 픽셀 위치의 컬러 버퍼의 기존 값과 적절하게 혼합해 최종 출력 색상을 결정한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;◎ 유니티가 제공하는 파이프라인&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;유니티는 2018년부터 유니티의 렌더링 처리 방식을 C# 스크립트로 제어할 수 있는 기능인 SRP(Scriptable Render Pipeline) 기능을 제공했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;이를 통해 전반적인 렌더링 루프를 직접 구성할 수 있으며 직접 렌더링 루프를 커스터마이징해 원하는 방식으로 렌더링을 구성할 수 있게 되었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;또한 SRP의 등장과 함께 유니티에 &lt;b&gt;기본적으로 구현되어 있는 기본 렌더링 파이프라인&lt;/b&gt;을 &lt;b&gt;빌트인(내장) 파이프라인&lt;/b&gt;이라고 부르게 되었다.&amp;nbsp;&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;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;1. HDRP (High Definition Render Pipeline)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;하이엔드나 PC 콘솔 등을 고려해서 고품질의 비주얼 구현에 적합한 파이프라인이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;포워드 렌더링, 디퍼드 렌더링을 모두 지원하며 컴퓨터 쉐이더 기술과 GPU 하드웨어를 사용한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;하지만 기본적으로 요구되는 하드웨어 스펙이 높아서 모바일 게임용으로는 적합하지 않다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;2. URP (Universal Render Pipeline)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Unity 2019.3 버전부터 LWRP(Lightweight Render Pipeline)이 유니버설 렌더 파이프라인으로 변경되었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;LWRP는 모든 모바일 디바이스에서 고품질 그래픽스를 구현하는 빠르고 확장 가능한 파이프라인이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;URP는 기본 빌트인 렌더 파이프라인보다 유연하고 확장성이 좋으며 다양한 플랫폼에 최적화된 그래픽을 제공한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;싱글 패스 포워드 렌더링과 셰이더 그래프, VFX 그래프를 지원한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://blog.unity.com/kr/technology/how-the-lightweight-render-pipeline-is-evolving&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://blog.unity.com/kr/technology/how-the-lightweight-render-pipeline-is-evolving&lt;/a&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 style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;참고 자료;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;유니티 그래픽스 최적화 스타트업 (저; 오지현(오즈라엘), 출판사; 비엘북스, 감수; 정종필)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Engine/UNITY</category>
      <category>URP</category>
      <category>유니티</category>
      <category>파이프라인</category>
      <author>11월1일</author>
      <guid isPermaLink="true">https://novemberfirst.tistory.com/114</guid>
      <comments>https://novemberfirst.tistory.com/114#entry114comment</comments>
      <pubDate>Fri, 8 Oct 2021 15:30:38 +0900</pubDate>
    </item>
    <item>
      <title>[게임수학] 슬라이딩 벡터 (Sliding Vector)</title>
      <link>https://novemberfirst.tistory.com/113</link>
      <description>&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;i&gt;슬라이딩 벡터&lt;/i&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Sliding Vector&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;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;슬라이딩 벡터는 충돌 시에 입사벡터가 입사면을 따라서 미끄러지게 하기 위해서 &lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;수평 성분만을 남긴&lt;/span&gt; 벡터&lt;/b&gt;이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;구하는 방법에는 &lt;a href=&quot;https://novemberfirst.tistory.com/112&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;반사벡터&lt;/a&gt;를 이용해 구하는 방법과 일반적인 방법이 있다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;◎ &lt;a href=&quot;https://novemberfirst.tistory.com/112&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;반사 벡터를 이용해서 구하는 방법&lt;/a&gt;&lt;/span&gt;&lt;/h3&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;946&quot; data-origin-height=&quot;464&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n471h/btrg8FFClci/pXLFE4NxVf2BNfG6bjP5Sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n471h/btrg8FFClci/pXLFE4NxVf2BNfG6bjP5Sk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n471h/btrg8FFClci/pXLFE4NxVf2BNfG6bjP5Sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn471h%2Fbtrg8FFClci%2FpXLFE4NxVf2BNfG6bjP5Sk%2Fimg.png&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;464&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;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;반사 벡터에서 입사벡터 P에 n(-P&amp;middot;n)을 한번 더해주면 &lt;b&gt;입사면에 투영된 접선벡터&lt;/b&gt;를 구할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;입사벡터의 역벡터 -P가 n에 투영된 n(-P&amp;middot;n)을 이용해 슬라이딩 벡터를 구하고 있는 중이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;따라서 반사 벡터를 이용할 때 슬라이딩 벡터 S를 구하는 공식은 다음과 같다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;S = P + n(-P&amp;middot;n)&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;◎ 일반적인 방법&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;489&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7OQlY/btrg5DBThcO/oKykmYkc1KSP5XQkE4TyN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7OQlY/btrg5DBThcO/oKykmYkc1KSP5XQkE4TyN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7OQlY/btrg5DBThcO/oKykmYkc1KSP5XQkE4TyN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7OQlY%2Fbtrg5DBThcO%2FoKykmYkc1KSP5XQkE4TyN1%2Fimg.png&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;489&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;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;일반적인 방법으로는 입사벡터 P를 n에 바로 투영시킨다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;입사벡터 P와 법선벡터 n의 끼인 각이 &lt;span style=&quot;color: #000000;&quot;&gt;0&amp;le;&amp;nbsp;&amp;theta; &amp;le; &amp;pi;/2 일 때, P&amp;middot;n의 값은 음수가 되므로, n벡터의 역벡터 방향으로 투영 벡터가 생성된다.&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 style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이렇게 얻을 수 있는 투영벡터 n(-P&amp;middot;n)을 입사벡터 P에서 빼주면 슬라이딩 벡터 S를 얻을 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이때의 슬라이딩 벡터 S를 구하는 공식은 다음과 같다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;S = P - n(-P&amp;middot;n)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;참고 자료;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://toymaker.tistory.com/entry/%EB%AF%B8%EB%81%84%EB%9F%AC%EC%A7%90-%EB%B2%A1%ED%84%B0-Sliding-Vector?category=500302&quot;&gt;https://toymaker.tistory.com/entry/%EB%AF%B8%EB%81%84%EB%9F%AC%EC%A7%90-%EB%B2%A1%ED%84%B0-Sliding-Vector?category=500302&lt;/a&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>GameProgramming/게임수학 &amp;amp; 물리</category>
      <category>게임수학</category>
      <category>슬라이딩벡터</category>
      <category>투영</category>
      <author>11월1일</author>
      <guid isPermaLink="true">https://novemberfirst.tistory.com/113</guid>
      <comments>https://novemberfirst.tistory.com/113#entry113comment</comments>
      <pubDate>Thu, 7 Oct 2021 22:22:49 +0900</pubDate>
    </item>
    <item>
      <title>[게임수학] 반사벡터 (Reflection Vector)</title>
      <link>https://novemberfirst.tistory.com/112</link>
      <description>&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;i&gt;반사벡터&lt;/i&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Reflection Vector&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;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;반사 벡터는 정반사이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span&gt;정반사는 입사각과 반사각이 동일한 반사를 의미한다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;◎ 투영 벡터&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;반사 벡터를 구하려면 투영 벡터를 먼저 구해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;&lt;b&gt;투영&lt;/b&gt;&lt;/span&gt;이란 어떤 벡터 v를 단위 벡터 n에 내적하여 구할 수 있는 v의 n방향으로의 길이를 뜻한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;392&quot; data-origin-height=&quot;355&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V6lhi/btrg3r9Q8FJ/z3O7vndxJOGFz1bZiJEaV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V6lhi/btrg3r9Q8FJ/z3O7vndxJOGFz1bZiJEaV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V6lhi/btrg3r9Q8FJ/z3O7vndxJOGFz1bZiJEaV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV6lhi%2Fbtrg3r9Q8FJ%2Fz3O7vndxJOGFz1bZiJEaV1%2Fimg.png&quot; data-origin-width=&quot;392&quot; data-origin-height=&quot;355&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;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;내적값이 스칼라이므로 투영된 방향으로의 벡터를 구하려면 이 내적값에 방향벡터 n을 곱해주면 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;(v&amp;middot;n)n을 이용해 벡터를 구할 수 있게 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;354&quot; data-origin-height=&quot;105&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/H2C2Y/btrg7Hqz5Az/3xbf47FOdWj8lHDSAYFUc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/H2C2Y/btrg7Hqz5Az/3xbf47FOdWj8lHDSAYFUc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/H2C2Y/btrg7Hqz5Az/3xbf47FOdWj8lHDSAYFUc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FH2C2Y%2Fbtrg7Hqz5Az%2F3xbf47FOdWj8lHDSAYFUc0%2Fimg.png&quot; data-origin-width=&quot;354&quot; data-origin-height=&quot;105&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;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;*&lt;/b&gt; &lt;/span&gt;왜 이렇게 되는지 추가 설명!&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;v와 n을 내적하면 cos&lt;span style=&quot;color: #000000;&quot;&gt;&amp;theta;를 결과값으로 얻게 된다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;v&amp;middot;n = ||v||||n||cos&lt;span style=&quot;background-color: #fafafa; color: #000000;&quot;&gt;&amp;theta;&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 style=&quot;font-family: 'Nanum Gothic';&quot;&gt;여기서 이 삼각형은 직각삼각형이므로 &lt;a href=&quot;https://novemberfirst.tistory.com/43&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;코사인값&lt;/a&gt;은 밑변/빗변 즉, ||n|| / ||v|| 이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;||n|| = ||v||cos&lt;span style=&quot;background-color: #fafafa; color: #000000;&quot;&gt;&amp;theta;&lt;/span&gt; 이고 투영한 길이를 w라고 했을 때&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;w = ||v||cos&lt;span style=&quot;background-color: #fafafa; color: #000000;&quot;&gt;&amp;theta;가 된다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;길이를 구했으니 방향도 알아야 하는데, 길이가 1인 단위벡터는 방향의 정보만을 갖고 있으므로&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;단위벡터인 n의 방향으로의 길이를 구하려는 투영의 값에 n을 곱해주면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;n의 방향 벡터 = n / ||n||&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;투영 벡터 = ( n / ||n|| ) * ||v||cos&lt;span style=&quot;background-color: #fafafa; color: #000000;&quot;&gt;&amp;theta;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;span style=&quot;color: #000000; font-family: 'Nanum Gothic';&quot;&gt;하지만 두 벡터 사이각을 항상 알 수 없으므로&lt;/span&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;v&amp;middot;n = ||v||||n||cos&lt;span style=&quot;background-color: #fafafa; color: #000000;&quot;&gt;&amp;theta; 라는 사실을 응용해서 &lt;span style=&quot;background-color: #fafafa; color: #000000;&quot;&gt;v&amp;middot;n/||n|| = ||v||&lt;span style=&quot;background-color: #fafafa; color: #000000;&quot;&gt;cos&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa; color: #000000;&quot;&gt;&amp;theta; 이런식을 만들어내면&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 style=&quot;background-color: #fafafa; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #000000;&quot;&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 style=&quot;background-color: #fafafa; color: #000000; font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #000000;&quot;&gt;((&lt;span style=&quot;background-color: #fafafa; color: #000000;&quot;&gt;v&amp;middot;n) / ||n|| ) * ( n / ||n|| ) 이런 공식이 나오게 된다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span class=&quot;imageblock&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfjycY/btrg8hzeVwI/oDYjskixdKxij9HB41yl31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfjycY/btrg8hzeVwI/oDYjskixdKxij9HB41yl31/img.png&quot; data-alt=&quot;data-origin-width=&amp;amp;quot;105&amp;amp;quot; data-origin-height=&amp;amp;quot;63&amp;amp;quot; width=&amp;amp;quot;173&amp;amp;quot; height=&amp;amp;quot;104&amp;amp;quot; data-ke-mobilestyle=&amp;amp;quot;widthOrigin&amp;amp;quot;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfjycY/btrg8hzeVwI/oDYjskixdKxij9HB41yl31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfjycY%2Fbtrg8hzeVwI%2FoDYjskixdKxij9HB41yl31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;◎ 반사벡터&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;투영 벡터를 이용해 구한 벡터로 반사 벡터를 계산한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;322&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/deHnZa/btrg97hiWE4/aGNGVLlRgIkqBvoVK1fqrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/deHnZa/btrg97hiWE4/aGNGVLlRgIkqBvoVK1fqrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/deHnZa/btrg97hiWE4/aGNGVLlRgIkqBvoVK1fqrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdeHnZa%2Fbtrg97hiWE4%2FaGNGVLlRgIkqBvoVK1fqrk%2Fimg.png&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;322&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;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;다음과 같이 입사벡터(P)와 법선 벡터(n)이 있을 때 반사 벡터(R)은 입사벡터(P)와 크기가 같고 반사각과 입사각이 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;P와 n을 이용하면 반사벡터(R)을 구할 수 있다.&amp;nbsp;&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;465&quot; data-origin-height=&quot;309&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ETng4/btrg8Es8imB/GbfBrN5QCpMjldCPmfvHL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ETng4/btrg8Es8imB/GbfBrN5QCpMjldCPmfvHL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ETng4/btrg8Es8imB/GbfBrN5QCpMjldCPmfvHL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FETng4%2Fbtrg8Es8imB%2FGbfBrN5QCpMjldCPmfvHL0%2Fimg.png&quot; data-origin-width=&quot;465&quot; data-origin-height=&quot;309&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;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;우선 위의 투영 벡터를 구하는 방식을 이용해 입사 벡터 P의 역벡터 -P를 n의 연장선상에 투영시켜서 투영벡터 n(-P &amp;middot; n)을 구한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;어떻게 투영 벡터를 구하는건지?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;466&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVfgGq/btrg9lfNnHB/BFIFAk2L9NBcKxvUWkhidK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVfgGq/btrg9lfNnHB/BFIFAk2L9NBcKxvUWkhidK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVfgGq/btrg9lfNnHB/BFIFAk2L9NBcKxvUWkhidK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVfgGq%2Fbtrg9lfNnHB%2FBFIFAk2L9NBcKxvUWkhidK%2Fimg.png&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;466&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;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이렇게 돌려보면 쉽게 알 수 있다!&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&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;1011&quot; data-origin-height=&quot;430&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CTPti/btrg8EGFUAu/VTYbOjojtRwz0MCOJ373ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CTPti/btrg8EGFUAu/VTYbOjojtRwz0MCOJ373ok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CTPti/btrg8EGFUAu/VTYbOjojtRwz0MCOJ373ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCTPti%2Fbtrg8EGFUAu%2FVTYbOjojtRwz0MCOJ373ok%2Fimg.png&quot; data-origin-width=&quot;1011&quot; data-origin-height=&quot;430&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;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그 후 입사 벡터 P의 시작 위치를 원점에 위치 시키고 투영으로 구한 n(-P&amp;middot;n)를 더하면 입사면에 투영된 벡터의 위치를 구할 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;입사 벡터 P에 n(-P&amp;middot;n)를 한 번 더하면 입사면에 투영된 위치를, 두번 더하면 반사벡터 R을 구할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;따라서 반사벡터 R을 구하는 공식은 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;R = P + 2n(-P&amp;middot;n)&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.12em;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;참고 자료;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://toymaker.tistory.com/entry/%EB%B0%98%EC%82%AC-%EB%B2%A1%ED%84%B0-Reflection-Vector&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://toymaker.tistory.com/entry/%EB%B0%98%EC%82%AC-%EB%B2%A1%ED%84%B0-Reflection-Vector&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ifyouwanna.tistory.com/entry/%EB%B0%98%EC%82%AC%EB%B2%A1%ED%84%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ifyouwanna.tistory.com/entry/%EB%B0%98%EC%82%AC%EB%B2%A1%ED%84%B0&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://gyong0.tistory.com/22&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://gyong0.tistory.com/22&lt;/a&gt;&lt;/p&gt;</description>
      <category>GameProgramming/게임수학 &amp;amp; 물리</category>
      <category>게임수학</category>
      <category>내적</category>
      <category>반사벡터</category>
      <category>투영</category>
      <author>11월1일</author>
      <guid isPermaLink="true">https://novemberfirst.tistory.com/112</guid>
      <comments>https://novemberfirst.tistory.com/112#entry112comment</comments>
      <pubDate>Mon, 4 Oct 2021 00:48:41 +0900</pubDate>
    </item>
    <item>
      <title>[STL] erase와 remove의 차이</title>
      <link>https://novemberfirst.tistory.com/111</link>
      <description>&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;i&gt;erase와 remove의 차이&lt;/i&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;erase, remove&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;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;한줄로 간단하게 말하자면 &lt;b&gt;erase는 멤버함수&lt;/b&gt;이고&lt;b&gt; remove는 알고리즘&lt;/b&gt;이다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;◎ erase&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;컨테이너&lt;/b&gt;의 erase는 실제 객체를 제거한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;하나를 지울 수 있는데 STL의 데이터 공간까지 다 지우는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;즉, iterator에 해당하는 하나의 요소만을 삭제하며 &lt;span style=&quot;background-color: #c1bef9;&quot;&gt;&lt;i&gt;capacity가 감소&lt;/i&gt;&lt;/span&gt;한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;549&quot; data-origin-height=&quot;62&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdsXuv/btrgHEmW3TY/ZzIX9tLAaxabUJcJeZRkzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdsXuv/btrgHEmW3TY/ZzIX9tLAaxabUJcJeZRkzK/img.png&quot; data-alt=&quot;erase는 iterator를 넘겨준다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdsXuv/btrgHEmW3TY/ZzIX9tLAaxabUJcJeZRkzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdsXuv%2FbtrgHEmW3TY%2FZzIX9tLAaxabUJcJeZRkzK%2Fimg.png&quot; data-origin-width=&quot;549&quot; data-origin-height=&quot;62&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;erase는 iterator를 넘겨준다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1633275462785&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	vector&amp;lt;int&amp;gt; v;
	v.resize(10, 0);

	for (int i = 0; i &amp;lt; v.size(); ++i)
	{
		v[i] = i + 1;
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;다음과 같이 1부터 10까지의 벡터가 있다고 가정한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1633275396363&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	auto iter = v.begin();
	v.erase(iter + 1); // index 1번값 = 2

	printVector(v);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;iterator가 begin값에서 +1, 즉 2를 가리키고 있는 상태에서 erase시키면 다음과 같은 결과가 나온다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;263&quot; data-origin-height=&quot;81&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vaema/btrgDUw8cFw/1F8oVbQ6iR4KXoVgABT23k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vaema/btrgDUw8cFw/1F8oVbQ6iR4KXoVgABT23k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vaema/btrgDUw8cFw/1F8oVbQ6iR4KXoVgABT23k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvaema%2FbtrgDUw8cFw%2F1F8oVbQ6iR4KXoVgABT23k%2Fimg.png&quot; data-origin-width=&quot;263&quot; data-origin-height=&quot;81&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;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;◎ remove&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Algorithm&lt;/b&gt;의 remove는 그 요소를 덮어씌움으로써 지워진 것처럼 보이게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;정확하게 말하면 지워야 할 원소를 뒤의 원소들을 &lt;u&gt;하나씩 앞으로 당겨서 덮어 씌우는 것이다&lt;/u&gt;.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;erase는 capacity까지 감소되었지만 remove는 조건을 함께 넘기면 조건과 일치하는 원소들은 다 지워지는데 공간은 그대로 남아있고 데이터만 삭제 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: 'Nanum Gothic';&quot;&gt;즉, 해당 조건에서 일치하는 모든 요소는 삭제하지만 &lt;span style=&quot;background-color: #c1bef9;&quot;&gt;&lt;i&gt;capacity는 그대로&lt;/i&gt;&lt;/span&gt;이다.&amp;nbsp;&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;◎ erase + remove?&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;특정 조건에 해당하는 원소를 아예 지우려면 erase와 remove를 함께 사용하면 좋다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;remove는 제거되지 않은 마지막 원소를 가리키는 itertor를 리턴하기 때문에&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;erase( remove(시작, 끝, value), 컨테이너의 end 반복자);&amp;nbsp;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;의 형태로 사용해준다.&amp;nbsp;&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;</description>
      <category>Study/STL</category>
      <category>erase</category>
      <category>remove</category>
      <category>stl</category>
      <author>11월1일</author>
      <guid isPermaLink="true">https://novemberfirst.tistory.com/111</guid>
      <comments>https://novemberfirst.tistory.com/111#entry111comment</comments>
      <pubDate>Mon, 4 Oct 2021 00:45:41 +0900</pubDate>
    </item>
    <item>
      <title>[유니티 그래픽스 최적화 스타트업] 렌더링 파이프라인</title>
      <link>https://novemberfirst.tistory.com/110</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;유&lt;/span&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;니티 그래픽스 최적화 스타트업(;비엘북스)을 읽고 정리한 내용입니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt; &lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;i&gt;유니티 그래픽스 최적화 스타트업&lt;/i&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: center;&quot;&gt;렌더링 파이프라인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;br&gt; &lt;br&gt; &lt;br&gt;렌더링 파이프라인은 간단히 말하면 3D 이미지를 2D 래스터 이미지로 표현하기 위한 단계적 방법을 말한다. &lt;br&gt; &lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;◎ 게임 루프&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;빠르게 이미지를 생성 해 이미지 하나하나가 화면에 보이는 것을 프레임이라고 하며, 1초에 몇 프레임이 렌더링 되는지를 &lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;FPS(Frames per second)&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;라는 단위로 나타낸다. &lt;/span&gt;&lt;br&gt;&lt;span style=&quot;color: #333333;&quot;&gt;화면 구성 요소들(배경, 애니메이션 포즈, 위치 등)은 각 프레임마다 조금씩 다르다.&lt;/span&gt;&lt;br&gt;이 화면 구성 요소들은 각 프레임마다 관련된 연산을 수행한 후 렌더링 되어야 할 요소들의 현재 모습이 결정된 후에 화면에 그려지는 것이다. &lt;br&gt;&lt;span style=&quot;color: #333333;&quot;&gt;만약 60FPS라고 한다면 1초에 60 프레임, 1/60초에 한 번씩 화면에 새로 그려지게 된다.&lt;/span&gt;&lt;br&gt; &lt;br&gt;매 프레임마다 연산이 이루어지는 요소들은 다양하다.&lt;br&gt;예를 들어 게임 내 오브젝트들의 상호 작용을 위한 물리 연산, 다양한 입출력 장치의 신호, 게임 로직 처리 연산, 캐릭터 애니메이션 처리, 네트워크 처리, 오디오 처리 등이 있다. &lt;br&gt; &lt;br&gt;이런 과정을 묶어 보면 게임은 다음과 같은 과정으로 나뉘어 수행된다. &lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;481&quot; data-origin-height=&quot;559&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAe11H/btreYnGMar1/mymZ5SpbvDCikiLhhku0Ik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAe11H/btreYnGMar1/mymZ5SpbvDCikiLhhku0Ik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAe11H/btreYnGMar1/mymZ5SpbvDCikiLhhku0Ik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAe11H%2FbtreYnGMar1%2FmymZ5SpbvDCikiLhhku0Ik%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;481&quot; height=&quot;559&quot; data-origin-width=&quot;481&quot; data-origin-height=&quot;559&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;br&gt;Update 단계에서는 Physics(물리), Input(입력), Logic(로직 계산), Animation(애니메이션 계산) 등이 이루어지며 Render과정에서는 씬(Scene), GUI 등을 그린다. &lt;br&gt;업데이트 과정이 처리된 후에 렌더링이 이루어지며 이러한 업데이트와 렌더링 과정이 매 프레임마다 반복된다. &lt;br&gt; &lt;br&gt;더 자세한 순서는 유니티의 공식 메뉴얼에 나와있다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;
 &lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
 &lt;div class=&quot;moreless-content&quot;&gt;
  &lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.unity3d.com/kr/2019.4/Manual/ExecutionOrder.html&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;https://docs.unity3d.com/kr/2019.4/Manual/ExecutionOrder.html&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
  &lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;이벤트 함수의 실행 순서 - Unity 매뉴얼&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;Unity 스크립트를 실행하면 사전에 지정한 순서대로 여러 개의 이벤트 함수가 실행됩니다. 이 페이지에서는 이러한 이벤트 함수를 소개하고 실행 시퀀스에 어떻게 포함되는지 설명합니다.&quot; data-og-host=&quot;docs.unity3d.com&quot; data-og-source-url=&quot;https://docs.unity3d.com/kr/2019.4/Manual/ExecutionOrder.html&quot; data-og-url=&quot;https://docs.unity3d.com/kr/2019.4/Manual/ExecutionOrder.html&quot;&gt;
   &lt;a href=&quot;https://docs.unity3d.com/kr/2019.4/Manual/ExecutionOrder.html&quot; target=&quot;_blank&quot; data-source-url=&quot;https://docs.unity3d.com/kr/2019.4/Manual/ExecutionOrder.html&quot;&gt;
    &lt;div class=&quot;og-image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;og-text&quot;&gt;
     &lt;p class=&quot;og-title&quot;&gt;이벤트 함수의 실행 순서 - Unity 매뉴얼&lt;/p&gt;
     &lt;p class=&quot;og-desc&quot;&gt;Unity 스크립트를 실행하면 사전에 지정한 순서대로 여러 개의 이벤트 함수가 실행됩니다. 이 페이지에서는 이러한 이벤트 함수를 소개하고 실행 시퀀스에 어떻게 포함되는지 설명합니다.&lt;/p&gt;
     &lt;p class=&quot;og-host&quot;&gt;docs.unity3d.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;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; &lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;◎ 렌더링 파이프라인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;한 프레임의 렌더링은 프레임이 시작되면 화면에 그려야 할 오브젝트들을 하나씩 순차적으로 그리고 그려야 할 모든 오브젝트가 화면에 그려지고 나면 비로소 프레임이 끝나고 화면에 출력된다. &lt;/span&gt;&lt;br&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이때 화면에 오브젝트를 그리기 위해서는 많은 데이터가 필요하다. &lt;/span&gt;&lt;br&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이 데이터들은 (Mesh, Texture, Shader, Transform 등) 하나의 오브젝트가 렌더링 되는 과정, 그래픽스 파이프라인에서 사용한다.&lt;/span&gt;&lt;br&gt; &lt;br&gt; &lt;br&gt; &lt;br&gt; &lt;br&gt; &lt;br&gt;&lt;b&gt;참고 자료;&lt;/b&gt;&lt;br&gt;URL&lt;/p&gt;</description>
      <category>Engine/UNITY</category>
      <author>11월1일</author>
      <guid isPermaLink="true">https://novemberfirst.tistory.com/110</guid>
      <comments>https://novemberfirst.tistory.com/110#entry110comment</comments>
      <pubDate>Mon, 13 Sep 2021 16:40:01 +0900</pubDate>
    </item>
  </channel>
</rss>