<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Until Dawn</title>
    <link>https://hagil.tistory.com/</link>
    <description>게임 개발을 위한 나의 모든 지식의 총 집합체</description>
    <language>ko</language>
    <pubDate>Wed, 8 Apr 2026 18:24:56 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>하길</managingEditor>
    <image>
      <title>Until Dawn</title>
      <url>https://tistory1.daumcdn.net/tistory/6705742/attach/6e5baf03663f49eaa16ff81d60fa9c54</url>
      <link>https://hagil.tistory.com</link>
    </image>
    <item>
      <title>[유니티] Git LFS 지정으로 날아간 파일 복구</title>
      <link>https://hagil.tistory.com/167</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Git을 사용하다보면, 100MB가 넘어가는 파일들은 커밋을 할 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이경우 LFS(Large File Storage)를 이용하여 파일을 올릴 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Git은 텍스트 코드 관리에 최적화 되어있어, 용량이 큰 파일을 올리게 되면 속도가 느려지게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 해결하기위해 용량이 큰 파일은 별도의 저장소(Storage)에 저장해두고, 이를 가리키는 포인터를 텍스트로 저장하는 방식으로&amp;nbsp;구성이 되어있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 이 순서가 꼬이게되면 문제가 생길 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를들면, 작업자 A와 B가 있을 때, A는 LFS를 통해 .png파일들을 Push했는데, B가 해당 내용을 Pull하기 전에 LFS를 해제해 버렸다. 이경우 작업자 B는 .png들을 저장된 주소를 가리키는 포인터를 내려 받게되고, 해당 파일을 LFS통해 다운 받게되는데.. 웬걸 해당 파일이 존재하지 않는 것이다. (이미 해당 파일은 LFS가 해제되었기 때문)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 이경우, 작업자 A는 해당 파일들을 다시 업로드 해줄 필요가 있다.&lt;/p&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; git add --renormalize .&lt;/b&gt; 이다.&amp;nbsp; 뒤에 .을 붙이면 모든 파일,&amp;nbsp; *.png를 붙이면 해당 확장자를 대상으로 gitattributes를 읽고 규칙을 새롭게 적용해준다. 이후 찾은 대상들을 &lt;b&gt;git status &lt;/b&gt;명령어를 통해 올려서 Commit 해주면 해당 문제를 해결할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;문제 해결방법 순서&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;379&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dokWDj/dJMcagxyb2x/86z3IVJ6bhXYEsEa7uAKLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dokWDj/dJMcagxyb2x/86z3IVJ6bhXYEsEa7uAKLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dokWDj/dJMcagxyb2x/86z3IVJ6bhXYEsEa7uAKLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdokWDj%2FdJMcagxyb2x%2F86z3IVJ6bhXYEsEa7uAKLK%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;447&quot; height=&quot;379&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;379&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 문제가 된 프로젝트에서 Git Bash here를 클릭.&lt;/p&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;311&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsY7Cy/dJMcag5pwGK/jV9NcKO2coD8QFxyQrhqzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsY7Cy/dJMcag5pwGK/jV9NcKO2coD8QFxyQrhqzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsY7Cy/dJMcag5pwGK/jV9NcKO2coD8QFxyQrhqzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsY7Cy%2FdJMcag5pwGK%2FjV9NcKO2coD8QFxyQrhqzK%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;578&quot; height=&quot;311&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;311&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 생성된 터미널에 &lt;b&gt;git add --renormalize .&lt;/b&gt; 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;577&quot; data-origin-height=&quot;307&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Oie3z/dJMcaaD6ZiJ/c4Vd3VrvljnbcNEIKgwU90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Oie3z/dJMcaaD6ZiJ/c4Vd3VrvljnbcNEIKgwU90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Oie3z/dJMcaaD6ZiJ/c4Vd3VrvljnbcNEIKgwU90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOie3z%2FdJMcaaD6ZiJ%2Fc4Vd3VrvljnbcNEIKgwU90%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;577&quot; height=&quot;307&quot; data-origin-width=&quot;577&quot; data-origin-height=&quot;307&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. renormalize 작업이 완료되면 &lt;b&gt;git status&lt;/b&gt; 입력.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Git에 새롭게 발견된 변경점들 Commit 후 Push.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Unity</category>
      <author>하길</author>
      <guid isPermaLink="true">https://hagil.tistory.com/167</guid>
      <comments>https://hagil.tistory.com/167#entry167comment</comments>
      <pubDate>Wed, 28 Jan 2026 14:27:03 +0900</pubDate>
    </item>
    <item>
      <title>[유니티] 구글 플레이스토어 앱 업데이트 띄우는 법</title>
      <link>https://hagil.tistory.com/166</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;몰랐던 사실인데, 플레이스토어에 등록된 앱을 버전만 업데이트해서 올려도 사용자에 폰에 업데이트 하라는 알림이 안뜬다. 그동안 해왔던 게임들에서 버전이 달라지면 자동으로 마켓으로 이동시킨 뒤에 업데이트 하도록 유도하는 기능이 있었는데, 구글에서 알아서 해주는게 아니였던 모양이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;구글 플레이 버전 업데이트 알림 추가하는 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/google/play-unity-plugins/releases&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/google/play-unity-plugins/releases&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1769354006960&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;Releases &amp;middot; google/play-unity-plugins&quot; data-og-description=&quot;The Google Play Plugins for Unity provide C# APIs for accessing various Play services - google/play-unity-plugins&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/google/play-unity-plugins/releases&quot; data-og-url=&quot;https://github.com/google/play-unity-plugins/releases&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b7Rdj4/dJMb9bvWGLo/h19jLVkMK9EbaluE6LNBYK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/CqAPz/dJMb9c9sjq1/Y2UyYDuzWiDj8ElQT9MHS1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/google/play-unity-plugins/releases&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/google/play-unity-plugins/releases&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b7Rdj4/dJMb9bvWGLo/h19jLVkMK9EbaluE6LNBYK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/CqAPz/dJMb9c9sjq1/Y2UyYDuzWiDj8ElQT9MHS1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;Releases &amp;middot; google/play-unity-plugins&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The Google Play Plugins for Unity provide C# APIs for accessing various Play services - google/play-unity-plugins&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1015&quot; data-origin-height=&quot;533&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfV7Ym/dJMcadguRd3/Nwfzt1fdaWnghV2M22xdF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfV7Ym/dJMcadguRd3/Nwfzt1fdaWnghV2M22xdF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfV7Ym/dJMcadguRd3/Nwfzt1fdaWnghV2M22xdF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfV7Ym%2FdJMcadguRd3%2FNwfzt1fdaWnghV2M22xdF1%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;1015&quot; height=&quot;533&quot; data-origin-width=&quot;1015&quot; data-origin-height=&quot;533&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;먼저 위 사이트에 접속해서 com.google.play.appupdate를 찾아 해당 Pakage를 다운 받아준다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;353&quot; data-origin-height=&quot;401&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DHVV9/dJMcabXiXQV/zk5VsfDERnZQqNAFmPtp20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DHVV9/dJMcabXiXQV/zk5VsfDERnZQqNAFmPtp20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DHVV9/dJMcabXiXQV/zk5VsfDERnZQqNAFmPtp20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDHVV9%2FdJMcabXiXQV%2Fzk5VsfDERnZQqNAFmPtp20%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;353&quot; height=&quot;401&quot; data-origin-width=&quot;353&quot; data-origin-height=&quot;401&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후&lt;b&gt; Edit - Project Setting - publlishing Settings&lt;/b&gt;에서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Custom Main Gradle Template 설정을 체크해주고, Minify에 Release, Debug, Split 옵션등을 체크 해제해준다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 &lt;b&gt;유니티 프로젝트 폴더내에 Assets - Plugins - Android 경로내에 mainTemplate.gradle이라는 파일이 생성되었을 것이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백업 파일용으로 여러개가 있을 수도 있는데, 이름에 backup이 안붙은게 원본이다.&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1310&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uHTaI/dJMcabCZGD4/g3kDLhDv0Zc0Kqw8ylmWk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uHTaI/dJMcabCZGD4/g3kDLhDv0Zc0Kqw8ylmWk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uHTaI/dJMcabCZGD4/g3kDLhDv0Zc0Kqw8ylmWk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuHTaI%2FdJMcabCZGD4%2Fg3kDLhDv0Zc0Kqw8ylmWk1%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;1310&quot; height=&quot;345&quot; data-origin-width=&quot;1310&quot; data-origin-height=&quot;345&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div style=&quot;background-color: #191a1c; color: #d0d0d0;&quot;&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;implementation 'androidx.activity:activity:1.6.0' 
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.play:app-update:2.1.0'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;mainTemplate.gradle 파일 내에 위와 같은 부분을 찾아서, 위 코드 3줄을 추가해준다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아마 com.google.android.play:app-update:2.1.0은 위에서 패키지를 받는 순간 아마 2.0.0으로 이미 추가 되어있을 수도 있는데, 필자의 경우 2.0.0 버전 사용시 오류가 발생할 수 있다고, 앱 번들을 추가하는 도중에 구글 콘솔 쪽에서 반려를 당했었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 만약 안되시는 분들은 중간의 버전을 2.1.0으로 수정해주면 똑같이 해결 될 것이라고 생각한다.&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;864&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PW1ez/dJMcadguRqb/pvIw503JD8i2nWOiEXl9f0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PW1ez/dJMcadguRqb/pvIw503JD8i2nWOiEXl9f0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PW1ez/dJMcadguRqb/pvIw503JD8i2nWOiEXl9f0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPW1ez%2FdJMcadguRqb%2FpvIw503JD8i2nWOiEXl9f0%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;864&quot; height=&quot;702&quot; data-origin-width=&quot;864&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후, 아까 받은 Updater라던가 안드로이드 관련 패키지들이 세팅이 안되어 있을 수도 있기 때문에, &lt;b&gt;Assets - External Dependency Manage - Android Esolver - Resolve 버튼을 눌러줍시다&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마지막으로 프로젝트에 아무 빈 오브젝트나 생성해서, 아래 스크립트를 작성해서 붙여주고나면,&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모바일 상에서 신규 업데이트가 생겼을 때, 알림 메세지와 동시에 플레이스토어 앱 링크로 이동시켜주는 팝업이 생성된다.&lt;/p&gt;
&lt;div style=&quot;background-color: #191a1c; color: #d0d0d0;&quot;&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;using System.Collections;
using Google.Play.AppUpdate;
using Google.Play.Common;
using UnityEngine;

public class VersionManager : MonoBehaviour
{
    private AppUpdateManager _appUpdateManager;

    private void Start()
    {
        // 에디터에서는 동작하지 않으므로 로그만 찍고 종료
#if UNITY_EDITOR
        Debug.Log(&quot;[VersionManager] In-app update works on Android devices only.&quot;);
        return;
#endif
        
        // 안드로이드 기기일 경우 업데이트 체크 시작
        StartCoroutine(CheckForUpdate());
    }

    private IEnumerator CheckForUpdate()
    {
        // AppUpdateManager 인스턴스 생성
        _appUpdateManager = new AppUpdateManager();

        // 업데이트 정보 요청 (현재 설치된 버전 vs 스토어 버전 비교)
        PlayAsyncOperation&amp;lt;AppUpdateInfo, AppUpdateErrorCode&amp;gt; appUpdateInfoOperation = _appUpdateManager.GetAppUpdateInfo();

        // 요청이 완료될 때까지 대기
        yield return appUpdateInfoOperation;

        // 요청 성공 여부 확인
        if (appUpdateInfoOperation.IsSuccessful)
        {
            var appUpdateInfoResult = appUpdateInfoOperation.GetResult();

            // Case A: 업데이트가 사용 가능함 (UpdateAvailable)
            if (appUpdateInfoResult.UpdateAvailability == UpdateAvailability.UpdateAvailable)
            {
                Debug.Log(&quot;[VersionManager] New version found! Starting update.&quot;);
                
                // 즉시 업데이트(Immediate) 요청
                var appUpdateOptions = AppUpdateOptions.ImmediateAppUpdateOptions();
                yield return _appUpdateManager.StartUpdate(appUpdateInfoResult, appUpdateOptions);
            }
            // Case B: 이전에 업데이트가 시작되었으나 중단된 경우 (DeveloperTriggeredUpdateInProgress)
            else if (appUpdateInfoResult.UpdateAvailability == UpdateAvailability.DeveloperTriggeredUpdateInProgress)
            {
                Debug.Log(&quot;[VersionManager] Resuming interrupted update.&quot;);
                
                var appUpdateOptions = AppUpdateOptions.ImmediateAppUpdateOptions();
                yield return _appUpdateManager.StartUpdate(appUpdateInfoResult, appUpdateOptions);
            }
            else
            {
                Debug.Log(&quot;[VersionManager] App is up to date. No update required.&quot;);
            }
        }
        else
        {
            // 오류 처리 (네트워크 문제, 스토어 연결 실패 등)
            Debug.LogError($&quot;[VersionManager] Failed to get update info. Error: {appUpdateInfoOperation.Error}&quot;);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드는 새로운 업데이트가 생기면 인앱에서 오버레이 형태로 스토어를 열어주는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 싫다면 &quot;업데이트를 하시겠습니까?&quot;와 같은 UI를 띄우고 아래 코드를 통해 플레이스토어 앱 링크로 이동 시키는 방법을 사용해도 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #191a1c; color: #d0d0d0;&quot;&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;Application.OpenURL($&quot;market://details?id={Application.identifier}&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Unity</category>
      <author>하길</author>
      <guid isPermaLink="true">https://hagil.tistory.com/166</guid>
      <comments>https://hagil.tistory.com/166#entry166comment</comments>
      <pubDate>Mon, 26 Jan 2026 00:45:51 +0900</pubDate>
    </item>
    <item>
      <title>플레이스토어 앱 출시 개인정보 처리방침</title>
      <link>https://hagil.tistory.com/165</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;구글 콘솔로 개발자 계정을 생성하고, 앱을 등록하려고 하는데 개인정보 처리방침을 첨부하라는 부분에서 막혔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 출시하려는 게임은 유저의 개인정보를 활용하는 게임은 아니지만, 구글 플레이스토어 정책상,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;13세 미만도 플레이할 수 있거나, 앱에 광고가 포함되어있다면, 그것과 관련된 개인정보 처리방침을 반드시 작성해서 웹에 계시해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에는 개인정보종합포털에서 개인정보와 관련된 내용들을 자동으로 만들어주는 시스템이 있었던 것 같은데, 정책의 변화로 더 이상 이용하지는 못하는 것 같다..대신 firebase에서 생성해주는 개인정보 처리방침을 활용했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인정보 처리방침은 아래 firebase에서 생성해주니 활용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://app-privacy-policy-generator.firebaseapp.com/&quot;&gt;https://app-privacy-policy-generator.firebaseapp.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1751801517513&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;App Privacy Policy Generator&quot; data-og-description=&quot;A web app that is free, open-source, and perfect for generating a generic or GDPR-compliant privacy policy and terms of use for your mobile apps.  ✨&quot; data-og-host=&quot;app-privacy-policy-generator.nisrulz.com&quot; data-og-source-url=&quot;https://app-privacy-policy-generator.firebaseapp.com/&quot; data-og-url=&quot;https://app-privacy-policy-generator.nisrulz.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/buvfsz/hyZfZA7367/MENdeDVP9xAoSvmlTeTsU1/img.jpg?width=1440&amp;amp;height=824&amp;amp;face=0_0_1440_824,https://scrap.kakaocdn.net/dn/GoH7S/hyZgaCFDn8/QLCdgJAlKaBlkWLyNbIy81/img.jpg?width=1440&amp;amp;height=824&amp;amp;face=0_0_1440_824&quot;&gt;&lt;a href=&quot;https://app-privacy-policy-generator.firebaseapp.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://app-privacy-policy-generator.firebaseapp.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/buvfsz/hyZfZA7367/MENdeDVP9xAoSvmlTeTsU1/img.jpg?width=1440&amp;amp;height=824&amp;amp;face=0_0_1440_824,https://scrap.kakaocdn.net/dn/GoH7S/hyZgaCFDn8/QLCdgJAlKaBlkWLyNbIy81/img.jpg?width=1440&amp;amp;height=824&amp;amp;face=0_0_1440_824');&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;App Privacy Policy Generator&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A web app that is free, open-source, and perfect for generating a generic or GDPR-compliant privacy policy and terms of use for your mobile apps.  ✨&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;app-privacy-policy-generator.nisrulz.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 생성된 개인정보 처리방침을 Gogle Site를 활용해서, 웹에 계시하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://sites.google.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://sites.google.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1751801587781&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Google Drive: 로그인&quot; data-og-description=&quot;이메일 또는 휴대전화&quot; data-og-host=&quot;accounts.google.com&quot; data-og-source-url=&quot;https://sites.google.com/&quot; data-og-url=&quot;https://accounts.google.com/v3/signin/identifier?continue=https%3A%2F%2Fsites.google.com%2F&amp;amp;followup=https%3A%2F%2Fsites.google.com%2F&amp;amp;ifkv=AdBytiNKRLm-HTUSNk2HDV8WX-1ueHnp2_EazHZUb_emXJ1ftl4pZHgtvwzWqhBJ5toJzHXbWn7Xbg&amp;amp;osid=1&amp;amp;passive=1209600&amp;amp;service=wise&amp;amp;flowName=WebLiteSignIn&amp;amp;flowEntry=ServiceLogin&amp;amp;dsh=S1442908830%3A1751801587832428&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://sites.google.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://sites.google.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Google Drive: 로그인&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이메일 또는 휴대전화&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;accounts.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <author>하길</author>
      <guid isPermaLink="true">https://hagil.tistory.com/165</guid>
      <comments>https://hagil.tistory.com/165#entry165comment</comments>
      <pubDate>Sun, 6 Jul 2025 20:34:56 +0900</pubDate>
    </item>
    <item>
      <title>[Unity] 모바일 Admob 추가 후 빌드 안됨 해결</title>
      <link>https://hagil.tistory.com/164</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 APK 빌드 및 실행이 잘되던 프로젝트가 있었는데, Admob으로 광고 기능을 추가한 뒤로 빌드는 물론 모바일에서 실행도 안돼서 몇일간 고생했다. 내가 겪은 오류 및 해결 방법은 아래와 같다.&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;b&gt;Case 1. 빌드 자체가 안됨&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;894&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1jWoU/btsNE4nY1FS/xvSx5lCGZnRog8zfP7Uvc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1jWoU/btsNE4nY1FS/xvSx5lCGZnRog8zfP7Uvc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1jWoU/btsNE4nY1FS/xvSx5lCGZnRog8zfP7Uvc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1jWoU%2FbtsNE4nY1FS%2FxvSx5lCGZnRog8zfP7Uvc0%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;894&quot; height=&quot;419&quot; data-origin-width=&quot;894&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위처럼 배너형 광고를 삽입하고 빌드를 진행을 했는데, 콘솔 창에 &quot;warning:we recommend using a newer android gradle plugin to use compilesdk = 36&quot; 라는 오류 로그가 찍히면서, APK 빌드 실패했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 오류 메세지를 직역하자면, 안드로이드 빌드를 하려면 최신 Gradle plugin을 사용하라는 의미이다. 유니티는 안드로이드 빌드 시, Gradle plugin을 통해 APK를 만드는 과정을 처리하는데, Admob을 적용한 APK를 뽑으려면, 최소 compilesdk = 36 이상의 Gradle Plugin을 사용해야한다는 의미이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 문제는, 내가 해당 프로젝트에 사용한 유니티 에디터의 버전은 2022.3.2f1을 사용했다는 점이다. 해당 버전은 최대 32까지의 compilesdk가 테스트 되었기 때문에 더 높은 버전은 사용할 수 없는데, 내가 적용한 Admob 최신 버전에서는 36을 권장하고 있기 때문에, 이러한 이유로&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;찾아본 결과, 해결 방법은 크게 2가지가 있는 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. compilesdk 36 이상의 gradle plugin을 다운 받아서 해당 빌드에 적용한다. 이후 custom gradle 파일을 수정해서, 에디터에서 더 높은 버전의 compilesdk를 사용해서 빌드 할 수 있도록 예외 처리하는 방법이 있다. 이 방법은 시도해보았지만, 복잡하기도 하고 안정성도 좋지않다고 판단해서 사용하지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 최신 버전 Unity 사용해서 해결하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최신 버전의 Unity를 사용하면, 기본적으로 더 높은 버전의 Gradle plugin이 설치 되어있기 때문에 문제 없이 빌드가 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;46&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfHVFI/btsNFp6f0Oq/yadjTOL2DbfPWnntKzo6l1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfHVFI/btsNFp6f0Oq/yadjTOL2DbfPWnntKzo6l1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfHVFI/btsNFp6f0Oq/yadjTOL2DbfPWnntKzo6l1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfHVFI%2FbtsNFp6f0Oq%2FyadjTOL2DbfPWnntKzo6l1%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;740&quot; height=&quot;46&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;46&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 기존에 사용하던 유니티 버전을 2022.3.2f1에서 유니티 6로 업그레이드 해서 빌드 실패 문제를 해결했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Case 2. 빌드 후 APK 파일 실행 시 팅김&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드 완료 후 APK 파일을 실행하면 앱이 바로 팅기는 오류가 발생했다. 컴퓨터로 Bulid And Run으로 실행해도 똑같은 현상이 발견되었다. 분명 유니티 에디터 상에서는 문제가 없는데 왜 그런걸까? 이유는 Admob ID에 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUjtlW/btsNHf8RZpc/MGkKH40NoEqJRCgjJrGzqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUjtlW/btsNHf8RZpc/MGkKH40NoEqJRCgjJrGzqk/img.png&quot; data-alt=&quot;테스트용 광고 ID&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUjtlW/btsNHf8RZpc/MGkKH40NoEqJRCgjJrGzqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUjtlW%2FbtsNHf8RZpc%2FMGkKH40NoEqJRCgjJrGzqk%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;857&quot; height=&quot;313&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;313&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;테스트용 광고 ID&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유니티 에디터에서 각각 광고 형태에 맞는 테스트용 ID를 적용하고 있었을 텐데 이는 에디터 상에서는 문제가 없지만, 빌드 후에는 문제가 될 가능성이 있다. Admob에서 기본적으로 앱에 부여하는 광고 ID랑, 위에 적혀있는 테스트용 광고 ID는 서로 호환되지 않기 때문에 내부에서 크래시가 일어나 앱이 강제 종료되는 현상이 일어날 수 있는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 기존 ID값을 Gogle Admob에서 부여 받은 ID로 변경을 해줄 필요가 있는데 방법은 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1012&quot; data-origin-height=&quot;783&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dYo1Sp/btsNG0c72jL/RGB8onr9WQWuBUiNBvmKu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dYo1Sp/btsNG0c72jL/RGB8onr9WQWuBUiNBvmKu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dYo1Sp/btsNG0c72jL/RGB8onr9WQWuBUiNBvmKu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdYo1Sp%2FbtsNG0c72jL%2FRGB8onr9WQWuBUiNBvmKu0%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;572&quot; height=&quot;443&quot; data-origin-width=&quot;1012&quot; data-origin-height=&quot;783&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;592&quot; data-origin-height=&quot;525&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bt3krc/btsNFVjA893/L8THwWz8c6RIZ7wIWWJgdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bt3krc/btsNFVjA893/L8THwWz8c6RIZ7wIWWJgdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bt3krc/btsNFVjA893/L8THwWz8c6RIZ7wIWWJgdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbt3krc%2FbtsNFVjA893%2FL8THwWz8c6RIZ7wIWWJgdk%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;505&quot; height=&quot;448&quot; data-origin-width=&quot;592&quot; data-origin-height=&quot;525&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Assets &amp;gt; Goggle Moblie Ads &amp;gt; Setting 클릭하면, Inspector에 Gogle Mobile Ads App ID 부분이 보일텐데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Android와 IOS를 Gogle AdMob에서 부여 받은 ID로 변경해주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ID값은 AdMob 공식 사이트에서 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://admob.google.com/intl/ko/home/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://admob.google.com/intl/ko/home/&lt;/a&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;배너, 전면, 리워드와 같은 광고의 ID도 아래에 나와있는 값으로 세팅해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;676&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RuCF6/btsNHJ9KWLK/zJXDvoh4BUjAgqkfrw0Ly1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RuCF6/btsNHJ9KWLK/zJXDvoh4BUjAgqkfrw0Ly1/img.png&quot; data-alt=&quot;Gogle Mobile Ads App ID&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RuCF6/btsNHJ9KWLK/zJXDvoh4BUjAgqkfrw0Ly1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRuCF6%2FbtsNHJ9KWLK%2FzJXDvoh4BUjAgqkfrw0Ly1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;627&quot; height=&quot;437&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;676&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Gogle Mobile Ads App ID&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7Q7eA/btsNFjrOsnj/QwOVvnXeGRy8gAdO7nq94K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7Q7eA/btsNFjrOsnj/QwOVvnXeGRy8gAdO7nq94K/img.png&quot; data-alt=&quot;전면, 배너, 리워드 광고의 ID&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7Q7eA/btsNFjrOsnj/QwOVvnXeGRy8gAdO7nq94K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7Q7eA%2FbtsNFjrOsnj%2FQwOVvnXeGRy8gAdO7nq94K%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;609&quot; height=&quot;272&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;420&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;전면, 배너, 리워드 광고의 ID&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;여기까지 진행했다면, 빌드 후 앱 실행도 정상적으로 될텐데 한가지 중요한 문제가 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;여기서 사용된 ID로 APK 실행시, 수익 창출 및 트래픽이 잡히기 때문에, Google AdMob 정책에 위배되어 앱 등록 제한, 수익 창출 불가 등, 강한 제재를 받을 수 있다. 따라서, 반드시 휴대전화를 Test용 기기로 설정해주는 작업이 필요하다. 절대로 테스트 기기 설정을 안하고 앱을 실행하는 일은 발생하지 않도록 주의해야한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트용 기기 설정을 위해서는 휴대전화의 광고 ID를 알아내야 하는데, 방법은 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;1306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xeRuS/btsNFZl6prp/ZeJeqq8kwtdOKlr841xeF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xeRuS/btsNFZl6prp/ZeJeqq8kwtdOKlr841xeF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xeRuS/btsNFZl6prp/ZeJeqq8kwtdOKlr841xeF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxeRuS%2FbtsNFZl6prp%2FZeJeqq8kwtdOKlr841xeF0%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;264&quot; height=&quot;493&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;1306&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;1549&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfdh79/btsNGTeeHpx/JroPTusXO31o0T2bQFFZZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfdh79/btsNGTeeHpx/JroPTusXO31o0T2bQFFZZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfdh79/btsNGTeeHpx/JroPTusXO31o0T2bQFFZZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcfdh79%2FbtsNGTeeHpx%2FJroPTusXO31o0T2bQFFZZ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;258&quot; height=&quot;559&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;1549&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정 &amp;gt; Google &amp;gt; 계정 선택 &amp;gt; 모든 서비스 &amp;gt; 광고를 클릭하면 최하단에 휴대전화의 광고 ID를 확인할 수 있다.&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;이후, 아래와 같이 Gogle AdMob 사이트에서 설정 &amp;gt; 기기테스트 &amp;gt; 테스트 기기 추가를 클릭한 뒤, 내용을 입력해주면 휴대전화를 테스트기기로 설정할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1652&quot; data-origin-height=&quot;662&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbE2W4/btsNGDbLB9X/BhfYgXhXX6PrkuZjfpQk2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbE2W4/btsNGDbLB9X/BhfYgXhXX6PrkuZjfpQk2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbE2W4/btsNGDbLB9X/BhfYgXhXX6PrkuZjfpQk2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbE2W4%2FbtsNGDbLB9X%2FBhfYgXhXX6PrkuZjfpQk2K%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;708&quot; height=&quot;284&quot; data-origin-width=&quot;1652&quot; data-origin-height=&quot;662&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;711&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9N5oh/btsNGAzlEPm/OwXUPdYChUZkIosapP705k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9N5oh/btsNGAzlEPm/OwXUPdYChUZkIosapP705k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9N5oh/btsNGAzlEPm/OwXUPdYChUZkIosapP705k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9N5oh%2FbtsNGAzlEPm%2FOwXUPdYChUZkIosapP705k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;721&quot; height=&quot;490&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;711&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지 완료했다면, 모바일에서 해당 APK 파일 실행시, 테스트 광고라는 텍스트와 함께, 광고가 정상적으로 적용될 것이다.&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20250430_172658716.jpg&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5xert/btsNGEV0tbQ/fypha1yBNchuRSxr4KNkZk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5xert/btsNGEV0tbQ/fypha1yBNchuRSxr4KNkZk/img.jpg&quot; data-alt=&quot;모바일에서도 정상적으로 동작하는 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5xert/btsNGEV0tbQ/fypha1yBNchuRSxr4KNkZk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5xert%2FbtsNGEV0tbQ%2Ffypha1yBNchuRSxr4KNkZk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;474&quot; height=&quot;213&quot; data-filename=&quot;KakaoTalk_20250430_172658716.jpg&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;720&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Unity/2D</category>
      <author>하길</author>
      <guid isPermaLink="true">https://hagil.tistory.com/164</guid>
      <comments>https://hagil.tistory.com/164#entry164comment</comments>
      <pubDate>Wed, 30 Apr 2025 17:31:50 +0900</pubDate>
    </item>
    <item>
      <title>LeetCode in C# 4. Median of Two Sorted Arrays</title>
      <link>https://hagil.tistory.com/162</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;759&quot; data-origin-height=&quot;727&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KLMRM/btsM0wkQ2e0/GDmbyZqhvCKY1hdWtQi0KK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KLMRM/btsM0wkQ2e0/GDmbyZqhvCKY1hdWtQi0KK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KLMRM/btsM0wkQ2e0/GDmbyZqhvCKY1hdWtQi0KK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKLMRM%2FbtsM0wkQ2e0%2FGDmbyZqhvCKY1hdWtQi0KK%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;759&quot; height=&quot;727&quot; data-origin-width=&quot;759&quot; data-origin-height=&quot;727&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;문제 요약&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;두 배열의 중간 값을 반환해라. 단, 시간 복잡도는 O(log(m+n))안으로 해결해야한다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 핵심 (주관적)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 두 배열을 더한 뒤에, 중간 값을 찾으면 간단하지만 그럴경우 시간 복잡도 조건을 충족 시킬 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 두 배열을 더하지 않고 중간 값을 찾을 수 있는 방법을 모색해야한다. &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;b&gt;풀이방법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열 두개를 합치지 않고, 중간 값을 찾을 수 있는 방법이 떠오르지 않아, 여러가지 참고 자료를 보면서 해결법을 찾았습니다. 바이너리 탐색을 활용해야하며, 핵심은 아래와 같습니다. &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;풀이 핵심&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 배열을 합쳤을 때, 절반이 어떻게 나뉠지를 생각하면서 배열을 각각 좌측 부분과 우측부분으로 나눠야합니다.&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/q6IEA26hvXc?si=xJ6eEXvJ8zPdSMn7&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/q6IEA26hvXc?si=xJ6eEXvJ8zPdSMn7&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=q6IEA26hvXc&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/dnGNVk/hyYvo9TMmk/OOsc113yehtJQtbFH9upI0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/bGnFA5/hyYvuWsOfj/Nxg5eH9zGyMZvqUN19GBz0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;Median of Two Sorted Arrays - Binary Search - Leetcode 4&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/q6IEA26hvXc&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&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;시간복잡도 : O(log(m+n))&lt;/p&gt;
&lt;pre id=&quot;code_1743315940723&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Solution {
    public double FindMedianSortedArrays(int[] nums1, int[] nums2) {
        // nums1이 무조건 더 짧도록 보장
        if (nums1.Length &amp;gt; nums2.Length) {
            var temp = nums1;
            nums1 = nums2;
            nums2 = temp;
        }

        int m = nums1.Length;
        int n = nums2.Length;
        int left = 0, right = m;

        while (left &amp;lt;= right) {
            int i = (left + right) / 2; // num1의 중간 포인터
            int j = (m + n + 1) / 2 - i; // num2의 중간 포인터

            // 인덱스가 범위 예외처리
            int maxLeftA = (i == 0) ? int.MinValue : nums1[i - 1];
            int minRightA = (i == m) ? int.MaxValue : nums1[i];

            int maxLeftB = (j == 0) ? int.MinValue : nums2[j - 1];
            int minRightB = (j == n) ? int.MaxValue : nums2[j];

            // 좌측과 우측이 잘 나뉘어졌다면
            if (maxLeftA &amp;lt;= minRightB &amp;amp;&amp;amp; maxLeftB &amp;lt;= minRightA) {
                //짝수인 경우
                if ((m + n) % 2 == 0) 
                    return (Math.Max(maxLeftA, maxLeftB) + Math.Min(minRightA, minRightB)) / 2f;

                //홀수인 경우
                else return Math.Max(maxLeftA, maxLeftB);
            } 
            
            //잘못나뉜 경우 포인터 이동
            else if (maxLeftA &amp;gt; minRightB)  
                right = i - 1; 
            
            else left = i + 1;
        }

        return 0; //실행 될일 없음
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>알고리즘</category>
      <author>하길</author>
      <guid isPermaLink="true">https://hagil.tistory.com/162</guid>
      <comments>https://hagil.tistory.com/162#entry162comment</comments>
      <pubDate>Sun, 30 Mar 2025 15:30:53 +0900</pubDate>
    </item>
    <item>
      <title>LeetCode in C# 3. Longest Substring Without Repeating Characters</title>
      <link>https://hagil.tistory.com/161</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;655&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dI7XQg/btsMWv6GgIs/W4tDKOtO4ChpHQjkhqKm70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dI7XQg/btsMWv6GgIs/W4tDKOtO4ChpHQjkhqKm70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dI7XQg/btsMWv6GgIs/W4tDKOtO4ChpHQjkhqKm70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdI7XQg%2FbtsMWv6GgIs%2FW4tDKOtO4ChpHQjkhqKm70%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;917&quot; height=&quot;655&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;655&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;문제 요약&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;같은 문자가 반복되지 않는 가장 긴 문자열의 길이를 구해라&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 핵심 (주관적)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 반복문으로 문자끼리 전부 비교하는게 가장 쉬운 해결책이겠지만, 조금 더 시간 복잡도를 낮출 수 있는 방법 모색하기.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 공백 예외처리, 공백문자가 나와도 문자가 이어짐으로 판단해야함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 순차적이 아니라, 전체적으로 봤을 때, 가장 긴 숫자를 선정해야함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;풀이방법 (1차)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복문을 사용하는 방법이 가장 먼저 떠올라서 구현해봤습니다. 탐색 알고리즘을 만들어서 해결하면, 분명 시간 복잡도를 낮출 수 있을 것 같다는 생각이 들었지만, 방법이 떠오르지 않아서 문제 해결에 포커스를 맞췄습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;풀이 핵심은 리스트를 활용해서 중복되지 않은 문자들을 추가하고, 만약 중복된 문자가 있다면 전부 비우고 다시 추가하는 구조로 문제를 해결했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간 복잡도 : O(n^2)&lt;/p&gt;
&lt;pre id=&quot;code_1743163672131&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Solution {
    public int LengthOfLongestSubstring(string s) {
        int max = 0; //최장 길이
        List&amp;lt;char&amp;gt; checkList = new List&amp;lt;char&amp;gt;(); //문자 확인용

        for(int i =0; i&amp;lt; s.Length; i++)
        {
            int curLen = 0; //현재 길이
            for(int j = i; j&amp;lt; s.Length; j++)
            {
                //중복된 값이 존재할 경우
                if(checkList.Contains(s[j]))
                {
                    checkList.Clear(); //리스트 비우기
                    break;
                }
                
                curLen++;
                checkList.Add(s[j]);
            }

            max = max &amp;gt; curLen ? max : curLen; //이전 값과 길이 비교
            checkList.Clear();
        }
        return max;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;풀이방법 (2차)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;풀이의 핵심은 HashSet을 사용해 요소 탐색에 걸리는 시간을 줄이는 것과, 좌우로 포인터를 위치시켜, 반복하지 않아도 해당 포인터로 문자에 접근하여 문장의 길이를 판단할 수 있게 하는 구조를 만드는 것이였습니다.&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;223&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GACnF/btsM2nzW0m6/zaAxr3LAh7Bfr9EUkvoKQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GACnF/btsM2nzW0m6/zaAxr3LAh7Bfr9EUkvoKQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GACnF/btsM2nzW0m6/zaAxr3LAh7Bfr9EUkvoKQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGACnF%2FbtsM2nzW0m6%2FzaAxr3LAh7Bfr9EUkvoKQ1%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;432&quot; height=&quot;223&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;223&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 반복이 될때마다, 중복값을 확인함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 중복된 값이 아니라면, HashSet에 추가, R포인터 우측으로 한칸 이동, max값 갱신&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 중복된 값이라면, HashSet의 L포인터의 문자 제거, L포인터 한칸 옮김&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간 복잡도 : O(n)&lt;/p&gt;
&lt;pre id=&quot;code_1743213137006&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Solution {
    public int LengthOfLongestSubstring(string s) {
        int left = 0; //왼쪽 포인터
        int right = 0; //오른쪽 포인터
        int maxLength = 0; //문자열의 최장 길이
        HashSet&amp;lt;char&amp;gt; charSet = new();

        while(right &amp;lt; s.Length) 
        {
            //중복된 값이 있는지
            if(!charSet.Contains(s[right]))
            {
                 charSet.Add(s[right]);
                 right++;
                 maxLength = Math.Max(maxLength,right - left);
            }
            else
            {
                charSet.Remove(s[left]);
                left++;
            }
        }
        return maxLength;
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>알고리즘</category>
      <author>하길</author>
      <guid isPermaLink="true">https://hagil.tistory.com/161</guid>
      <comments>https://hagil.tistory.com/161#entry161comment</comments>
      <pubDate>Fri, 28 Mar 2025 21:10:07 +0900</pubDate>
    </item>
    <item>
      <title>LeetCode in C# 2. Add Two Numbers</title>
      <link>https://hagil.tistory.com/160</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;926&quot; data-origin-height=&quot;695&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dAYCWG/btsMUqXTkqO/lErQYyukdIgH7M7Tb3h4kK/tfile.dat&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dAYCWG/btsMUqXTkqO/lErQYyukdIgH7M7Tb3h4kK/tfile.dat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dAYCWG/btsMUqXTkqO/lErQYyukdIgH7M7Tb3h4kK/tfile.dat&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdAYCWG%2FbtsMUqXTkqO%2FlErQYyukdIgH7M7Tb3h4kK%2Ftfile.dat&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;926&quot; height=&quot;695&quot; data-origin-width=&quot;926&quot; data-origin-height=&quot;695&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;size18&quot;&gt;&lt;b&gt;문제 요약&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단일 연결 리스트 두개가 주어지고, 숫자는 역순으로 저장되어있으며, 각 노드에는 한 자리 숫자가 포함되어있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 숫자를 더한 합계를 연결 리스트로 반환해라.&lt;/p&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;b&gt;문제 핵심&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 단일 연결 리스트에 대한 이해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 계산중에 발생하는 받아올림 처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 길이가 다른 리스트에 대한 예외처리&lt;/p&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;b&gt;풀이방법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제를 풀기 위해선 단일 연결 리스트에 대한 이해가 없으면 도저히 풀수 없는데, 개념은 알고 있어도 실제로 사용해본 적이 없어서 문제에 어떤식으로 적용해야할지 몰랐다. 따라서 연결리스트에 대한 공부를 다시하고, 문제를 해결했다. 이 문제는 반복해서 풀어봐야할 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소요 시간 : 36분&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간 복잡도 : O(n)&lt;/p&gt;
&lt;pre id=&quot;code_1742706411553&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Solution {
    public ListNode AddTwoNumbers(ListNode l1, ListNode l2) {
    
    ListNode result = new();
    ListNode head = result; // result의 Head
    int sum = 0; //두 연결 리스트의 합

    //l1,l2가 Null 이면, ListNode의 끝을 의미
    while(l1 != null || l2 != null || sum &amp;gt; 0)
    {
        if(l1 != null)
        {
            sum += l1.val;
            l1 = l1.next; //다음
        }

        if(l2 != null)
        {
            sum += l2.val;
            l2 = l2.next; //다음
        }

        result.next = new ListNode(sum % 10); //다음 Node생성과 동시에 초기화
        sum /= 10; //받아올림 역할, 결과값은 다음 덧셈에 더해짐
        result = result.next; //다음
    }

    return head.next; //시작 부분을 반환
    }
}&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;코테 시작한지 2일차인데, 느낀점은 문제를 풀면서 기본기와 내실을 다질 수 있어서 좋은 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 2번 문제인데 막히는게 현타가 오지만, 모르는 문제를 풀어냈을 때, 기분은 좋다. 지식의 공백이 채워지는 느낌&lt;/p&gt;</description>
      <category>알고리즘</category>
      <author>하길</author>
      <guid isPermaLink="true">https://hagil.tistory.com/160</guid>
      <comments>https://hagil.tistory.com/160#entry160comment</comments>
      <pubDate>Sun, 23 Mar 2025 14:11:32 +0900</pubDate>
    </item>
    <item>
      <title>LeetCode in C# 1. Two Sum</title>
      <link>https://hagil.tistory.com/158</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;756&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/but5Zr/btsMTliKqTD/Qed0FCi6OQYpKpmlFzv0tk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/but5Zr/btsMTliKqTD/Qed0FCi6OQYpKpmlFzv0tk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/but5Zr/btsMTliKqTD/Qed0FCi6OQYpKpmlFzv0tk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbut5Zr%2FbtsMTliKqTD%2FQed0FCi6OQYpKpmlFzv0tk%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;935&quot; height=&quot;756&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;756&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;size18&quot;&gt;&lt;b&gt;문제 요약&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정수 숫자들이 담긴 배열과 목표 값이 주어졌을 때, 두 수를 더해서 목표 값이 되는 인덱스의 배열을 반환해라.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) [2, 7, 11, 15] , target = 9 라면, 2와 7을 더했을 때 9가 되므로 반환 값은 [0,1]&lt;/p&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;b&gt;문제 핵심 (주관적인 생각)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 경우의 수를 다 더하는 것이 가장 쉬운 해결책이겠지만, 시간 복잡도를 더 줄일 수 있는 효율적인 탐색 알고리즘을 구현해야하는 것이 핵심이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;풀이 방법 (1차)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뇌가 굳어서 방법이 떠오르지 않아, 그냥 모든 경우의 수를 전부 더해서 해결했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복문을 통해, 두 수의 더한 값이 target이 될 때까지 앞에 자리 숫자부터 맨 뒤 숫자까지 반복적으로 더했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간 복잡도 : O(n^2)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;풀이 시간 : 19분 13초&lt;/p&gt;
&lt;pre id=&quot;code_1742650799425&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Solution {
    public int[] TwoSum(int[] nums, int target) {
        
        //모든 경우의 수를 전부 계산해서 해결함.
        //최대값이 넘어가면 안되니까 -1
        for(int i = 0; i &amp;lt; nums.Length -1; i++)
        {
            for(int j = i + 1; j &amp;lt; nums.Length; j++)
            {
                int sum = nums[i] + nums[j]; 

                if(sum == target)
                {
                    return new int[2]{i, j};
                }
            }
        }

        return new int[0];
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;풀이 방법 (2차)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해시 테이블 구조를 활용할 줄 아는것이 문제의 핵심이였다. 해시 테이블 자료형을 사용하면, 모든 요소를 순환하지 않아도 원하는 값에 접근할 수 있으므로 이 문제와 적합한 자료형이었던 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;숫자를 key로 인덱스를 value로 1대1로 저장하여 문제를 해결하면 쉽고 효율적으로 문제 풀이가 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) [2,7,11,15] 라면, Key : 2 이고 value : 0 으로 매칭을 시켜놓으면, 숫자값을 입력하면 인덱스를 반환하는 구조가 완성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간복잡도 : O(n)&lt;/p&gt;
&lt;pre id=&quot;code_1742694498130&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Solution {
    public int[] TwoSum(int[] nums, int target) {
        //해시 테이블을 활용한 풀이
        Dictionary&amp;lt;int, int&amp;gt; map = new Dictionary&amp;lt;int, int&amp;gt;();

        for(int i = 0; i&amp;lt; nums.Length; i++)
        {
            int complement = target - nums[i]; //찾아야하는 값
            if(map.ContainsKey(complement)) //찾는 값이 존재하는지
            {
                return new int[] {map[complement], i};
            }
            map[nums[i]] = i;
        }
        
        return new int[]{};
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해시 테이블 자료형을 그동안 많이 사용해왔지만, 이 문제에 적용해볼 생각은 전혀하지 못했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 complement를 이끌어내는 공식인 target - nums[i]를 활용해볼 생각 또한 하지 못했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조금 더 넓은 시야를 가져야한다는 교훈을 얻게 해준 문제였다.&lt;/p&gt;</description>
      <category>알고리즘</category>
      <author>하길</author>
      <guid isPermaLink="true">https://hagil.tistory.com/158</guid>
      <comments>https://hagil.tistory.com/158#entry158comment</comments>
      <pubDate>Sat, 22 Mar 2025 22:40:19 +0900</pubDate>
    </item>
    <item>
      <title>알고리즘 공부에 대하여</title>
      <link>https://hagil.tistory.com/157</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;그동안 알고리즘 공부와 코딩테스트에 대해 너무 안일하게 생각했었던 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게임 개발자면 그냥 게임만 만들줄 알면 되는거 아닌가? 라고 생각하며 알고리즘 공부와 코딩테스트 풀이를 멀리 했었는데 문득 이런 생각이 들었다. 현재 IT업계는 GPT와 IDE같이 개발을 보조해주는 도구들이 엄청나게 발전해나가는 과도기인데 미래의 내가 본격적으로 활동하는 시기에는 개발 도구에 굉장히 많은 변화와 혁신이 일어난 시기일 것이라고 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러다 보면 기업에서도 AI관련 보안에 민감해서, 사용 금지 시킬수도 있고, 개발자의 실력을 판가름하려면 더욱더 확실한 방법인 코딩테스트의 중요도가 올라갈 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;알고리즘 공부(코테)를 해야하는 이유&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변화하는 개발 도구들을 잘 활용하려면, 개발 지식이 넓을 수록 유리하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPT와 같은 생성형 AI들은 어떠한 로직을 구현해달라고 하면 코드를 작성해주지만 그것이 실제 개발에 효율적인 코드는 아닌 경우가 많다. 간단히 구현가능한 코드도 빙빙 돌려서 비효율적으로 작성이 될때가 있는데, 그럴때 단순한 프롬포트를 작성하는 것이 아니라. 개발 지식을 더해서 명령하면 더 좋은 결과를 불러 올 수도 있다. 예를 들어 &quot;플레이어의 인벤토리를 구현해줘&quot; 보단, &quot;아이템의 ID값을 Key, 아이템을 Value로 해서 Key값을 입력하면 해당 아이템에 접근할 수 있는 Dictionary 구조로 만들어줘&quot;라는 식으로도 작성하면 더 효율적이고 빠른 개발을 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사에서 프로그래머의 실력을 가늠하는 가장 쉬운 방법이 뭘까? 당연히 코딩테스트라고 생각한다. 개발자의 포트폴리오는 사실 남이 만들거나 도와줬을 수도 있고, 자기가 짠 코드가 아닐 수도 있기 때문에 100% 신뢰할 수 없다. 그반면에 코딩테스트는 개발을 도와주는 IDE 툴이나 GPT 같은 생성형 AI도 없고 심지어 구글로 서칭도 불가능하기에 오로지 개발자의 코딩 실력을 확인할 수 있다는 장점이 있다. 앞으로 기술이 발전하면 발전할 수록 이러한 코딩테스트의 중요성은 나날이 상승할 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;생성형 AI에 절여지는 뇌를 환기시키는 목적도 있다. 개발자라면 GPT나 Google이 없이 코드 한줄도 작성 못하는 것을 부끄럽게 여겨야한다. 예를 들어 플레이어가 몬스터를 공격하는 간단한 처리를 구현하지 못해 GPT에 도움을 받거나, 관련된 자료를 매번 찾아보게 될 수 있다. 물론 초반에 방법을 모른다면, 당연히 구현방법을 찾아보고 GPT를 사용해 지식을 습득해서 문제를 해결하는 것이 당연하다고 생각한다. 하지만, 중요한 것은 GPT와 Google은 결국 도구일 뿐이고 의존하게 되면 안된다는 점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성형 AI에 익숙해지면 익숙해 질수록 모든 역할을 AI에게 떠넘기게 된다.&amp;nbsp; 초반에는 그냥 단순히 &quot;몬스터와 플레이어가 전투하는 로직 구현해줘&quot;라고 해서 GPT의 도움을 받아 기능을 구현하다가 나중에는 &quot;몬스터와 플레이어가 전투하는 로직에서 데미지 계산이 이상한데 수정해줘&quot;라고 수정도 부탁하게 되고 그렇게 서서히 모든 업무를 GPT에게 의존하게 될 수 있다. 당장 눈앞에 간단한 로직도 GPT에게 도움받는 습관을 들이면, 나중에 어려운 로직은 물론이고 프로젝트의 핵심 기능 또한 GPT에게 도움받아 해결하는 의존형 개발자가 되버린다. 그렇게 되면 개발자로써 높은 곳까지 도달할 수 없다고 생각한다. AI의 의존도를 낮추는데 코딩 테스트가 도움이 될 수 있다고 생각한다, 코딩테스트는 AI는 물론 IDE까지 사용하지 않고 오로지 개발자의 지식에 의존하여 문제를 해결해야한다. 코테를 통해 개발자의 순수 피지컬을 높인다면, AI의 활용성도 높이고 의존도도 낮출 수 있다고 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;말이 길었지만 알고리즘 공부가 중요한 이유를 요약하자면 아래와 같다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 앞으로 발전하는 개발툴을 더 효율적으로 사용하기 위해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 기술이 발전할 수록 IT 기업들은 코딩테스트를 통해 개발자를 채용할 수 밖에 없음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. GPT 없으면 코드 한줄 적지 못하는 개발자가 되지않기 위해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;코딩테스트 준비 방법&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코딩 테스트 준비 방법 또한 굉장히 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방법을 잘 알고 코딩 테스트 문제를 푼다면, 다른 사람보다 더 효율적이고 빠르게 실력을 늘릴 수 있다. 사실 나는 어떻게 풀어야할지 방법조차 모르는 문제를 혼자서 오랜 시간 고민하는걸 별로 좋아하지 않는다. 개발자라면, 어려운 문제에 끈질기게 집착해서 해결해나가는 능력도 중요하지만, 세상에는 다양한 천재 개발자들이 수많은 고민으로 쌓아올린 데이터들이 널려있는데, 그 지식을 모른채하고 스스로 고민하는건 혼자서 원시시대로 돌아가는 거랑 다를바없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코딩테스트 문제 풀이의 핵심은 이 두가지의 적절한 조화라고 생각한다. 전혀 모르는 문제라면, 모름을 인정하고 배워서 나만의 방법으로 문제를 풀고, 방법은 아는데 구현이 오래걸린다면 여유를 가지고 문제에 끈질기게 도전하는 것이 중요하다. 단, 방법을 알아도 2시간 내로 풀지 못하면 그건 그냥 모르는 거라고 인정하자.&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;b&gt;코딩테스트 공부 방법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.코딩 테스트 사이트를 선정한다 (백준, 프로그래머스,LeetCode 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 백준은 테스트 문제가 많고, 프로그래머스는 기업 맞춤형 문제가 많고, LeetCode는 영어로된 알고리즘 공부에 좋음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.문제를 보자마자 무작정 풀기보다, 문제 분석을 하며 풀이 전략 세우기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 문제마다 요구하는 자료구조나 알고리즘이 분명 존재한다. 그 핵심을 이해하고, 전략을 세운뒤에 코딩을 시작하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.상수 조건을 보고 시간 복잡도를 가늠하기&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;4.코드를 한줄 씩 적을 때마다, 그 이유를 같이 설명하거나 주석으로 적는 습관을 들이자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 실제 온라인 코딩테스트나, 코테를 보게되면 내가 짠 코드를 설명할 줄 알아야한다. 코드를 한줄씩 적어가면서 그 이유를 설명하는 습관을 들이면 분명 실전에서도 효과를 볼 수 있을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 무작정 제출하지말고, 제출 전에 샘플케이스를 통해 코드를 점검하자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 제출을 통해 오답인 것을 확인하고 수정하는게 습관이 되면, 실제 코테에서 신뢰도도 떨어져 보이고 불이익이 있을 수 있다. 제출 하기전에 샘플케이스를 통해 시뮬레이션을 돌리는 습관을 반드시 들이자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 시간 복잡도와 공간 복잡도까지 점검이 완료된 후에 제출하기.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 제출전에 내가 짠 코드를 다시한번 점검하면서, 비효율적인 부분이 존재하는지 확인해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7.다른 사람의 코드를 보고 점검하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 코드를 제출했다면, 다른 사람들의 풀이방법을 보면서 더 좋은 방법이 있었는지 확인해보는 시간을 가지자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. 30분 ~ 1시간 고민했는데 풀이 방법이 떠오르지 않으면, 그냥 그문제는 모르는거다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 그러니 자존심 상하더라도 풀이방법을 모색해보는 시간을 가지고, 다시 도전해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. 방법을 알더라도 2시간내로 문제를 풀지 못한다면, 그것 또한 풀줄 모르는거다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이 경우에도 자존심 상하더라도 다른사람의 코드를 참고해서 코드를 완성하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10. 풀었던 문제라도 40분 이상 걸린다면, 다음날 혹은 일정 시간이 지난뒤에 다시 풀자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 내가 완벽히 이 문제를 안다는 기준은, 문제를 보자마자 20분내로 코드를 작성할 줄 알아야 완벽히 아는 것이다.&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘</category>
      <author>하길</author>
      <guid isPermaLink="true">https://hagil.tistory.com/157</guid>
      <comments>https://hagil.tistory.com/157#entry157comment</comments>
      <pubDate>Sat, 22 Mar 2025 22:14:25 +0900</pubDate>
    </item>
    <item>
      <title>유니티 Light Bake시 머티리얼이 이상하게 보이는 오류</title>
      <link>https://hagil.tistory.com/156</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;유니티에서 실시간으로 적용되는 빛 효과들은 많은 드로우콜을 유발하기 때문에, CPU와 GPU에 많은 부담을 주게 된다. 따라서 빛에 의해 오브젝트에 적용되는 그림자는 Lighting Bake를 통해 Lightmap을 만들어 텍스쳐 형태로 관리하여 부담을 줄일 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 라이트맵을 사용하다보면 아래와 같이 모델링의 텍스쳐가 이상하게 보이는 경우가 존재한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1064&quot; data-origin-height=&quot;455&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eaSUR4/btsMcYOAO9q/RLyB7VERUyDZo3BPmhJfd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eaSUR4/btsMcYOAO9q/RLyB7VERUyDZo3BPmhJfd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eaSUR4/btsMcYOAO9q/RLyB7VERUyDZo3BPmhJfd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeaSUR4%2FbtsMcYOAO9q%2FRLyB7VERUyDZo3BPmhJfd0%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;1064&quot; height=&quot;455&quot; data-origin-width=&quot;1064&quot; data-origin-height=&quot;455&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6wk5Z/btsMa8SQ7xd/d1TdZ6dh1kYPkjuk9Wzbpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6wk5Z/btsMa8SQ7xd/d1TdZ6dh1kYPkjuk9Wzbpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6wk5Z/btsMa8SQ7xd/d1TdZ6dh1kYPkjuk9Wzbpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6wk5Z%2FbtsMa8SQ7xd%2Fd1TdZ6dh1kYPkjuk9Wzbpk%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;458&quot; height=&quot;412&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;412&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제가 되는 오브젝트를 클릭하면, This GameObject has overlapping UVs라는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에러 메세지가 동반되어 있을텐데, 한마디로 겹치는 UV가 존재한다는 의미다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UV는 3D모델링을 2D로 표현할때 사용되는 좌표 값이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;셰이더를 만져본 적이 있으면 조금 더 이해가 빠를 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.unity3d.com/kr/2018.4/Manual/ProgressiveLightmapper-UVOverlap.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.unity3d.com/kr/2018.4/Manual/ProgressiveLightmapper-UVOverlap.html&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생각보다 자주 발생하는 문제인지 유니티에서도 공식으로 문제와 관련된 솔루션을 정리해두었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 링크에 접속하면 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;해결방법&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1912&quot; data-origin-height=&quot;969&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wcoMA/btsMbrLumkw/PKAfHRbNIHJ82sxcUbMrW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wcoMA/btsMbrLumkw/PKAfHRbNIHJ82sxcUbMrW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wcoMA/btsMbrLumkw/PKAfHRbNIHJ82sxcUbMrW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwcoMA%2FbtsMbrLumkw%2FPKAfHRbNIHJ82sxcUbMrW1%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;1912&quot; height=&quot;969&quot; data-origin-width=&quot;1912&quot; data-origin-height=&quot;969&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;577&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cx3Ww5/btsMcgI6r3h/KBNr7rjcBJDVs6RnTeZfL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cx3Ww5/btsMcgI6r3h/KBNr7rjcBJDVs6RnTeZfL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cx3Ww5/btsMcgI6r3h/KBNr7rjcBJDVs6RnTeZfL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcx3Ww5%2FbtsMcgI6r3h%2FKBNr7rjcBJDVs6RnTeZfL1%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;576&quot; height=&quot;577&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;577&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;346&quot; data-origin-height=&quot;523&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/48dGh/btsMcRa0ttD/k6lwWUv00XyK1utN5gbYZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/48dGh/btsMcRa0ttD/k6lwWUv00XyK1utN5gbYZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/48dGh/btsMcRa0ttD/k6lwWUv00XyK1utN5gbYZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F48dGh%2FbtsMcRa0ttD%2Fk6lwWUv00XyK1utN5gbYZ0%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;346&quot; height=&quot;523&quot; data-origin-width=&quot;346&quot; data-origin-height=&quot;523&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;문제 발생 원인&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제되는 오브젝트를 클릭 후 해당 오브젝트의 Lightingmap Preview를 열면, 보고 있는 오브젝트에 적용된 텍스쳐를 노란색으로 표시해준다. Preview에서 Baked UV Overlap을 선택하면, &lt;b&gt;차트가 인접해 있는 부분은 빨간색으로 표&lt;/b&gt;시가 되어있는 모습을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유니티에서는 차트에 조명 데이터를 넣어놓고, 면에 매핑하여 최종형상을 계산하는데, 차트끼리 너무 인접해 있으면, 차트의 데이터가 다른 차트로 흘러가게 된다. 그러면 결과적으로 광원 블리딩 현상이 일어나, 모델의 형상이 이상해지는 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;size18&quot;&gt;&lt;b&gt;문제 해결 방안&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UV 오버랩은 매우 많은 요소로 인해 발생하므로 완전한 해결책은 존재하지 않지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 사용되는 몇가지 해결책이 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Generate Lightingmap Uvs 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Pack Margin 늘리기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 문제가 되는 모델의 Generate Lightingmap Uvs를 설정하는 방법이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1907&quot; data-origin-height=&quot;973&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBsklo/btsMcX3hcau/dqScdi0FKGoKrIWwMAO2R1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBsklo/btsMcX3hcau/dqScdi0FKGoKrIWwMAO2R1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBsklo/btsMcX3hcau/dqScdi0FKGoKrIWwMAO2R1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBsklo%2FbtsMcX3hcau%2FdqScdi0FKGoKrIWwMAO2R1%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;1907&quot; height=&quot;973&quot; data-origin-width=&quot;1907&quot; data-origin-height=&quot;973&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;979&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccitL6/btsMbITDwjt/iExbd5MXzCUko2gVb22fj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccitL6/btsMbITDwjt/iExbd5MXzCUko2gVb22fj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccitL6/btsMbITDwjt/iExbd5MXzCUko2gVb22fj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccitL6%2FbtsMbITDwjt%2FiExbd5MXzCUko2gVb22fj0%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;749&quot; height=&quot;979&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;979&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 옵션을 체크하게 되면 Lightmap을 위한 Uvs를 만들게되어 경우에 따라 문제가 해결될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼에도 완전히 해결되지 않을 경우에는 PackMargin을 늘려야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 PackMargin을 늘리는 방법이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1909&quot; data-origin-height=&quot;889&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4ZaYu/btsMdKvBINQ/5qebg7OdBZaaZrzN9KOJI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4ZaYu/btsMdKvBINQ/5qebg7OdBZaaZrzN9KOJI0/img.png&quot; data-alt=&quot;해결되지 않은 부분이 보이는 모습.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4ZaYu/btsMdKvBINQ/5qebg7OdBZaaZrzN9KOJI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4ZaYu%2FbtsMdKvBINQ%2F5qebg7OdBZaaZrzN9KOJI0%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;1909&quot; height=&quot;889&quot; data-origin-width=&quot;1909&quot; data-origin-height=&quot;889&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;해결되지 않은 부분이 보이는 모습.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;749&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7ouJ1/btsMbUGppBE/rJPln9z4fkswXTSVE5dep0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7ouJ1/btsMbUGppBE/rJPln9z4fkswXTSVE5dep0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7ouJ1/btsMbUGppBE/rJPln9z4fkswXTSVE5dep0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7ouJ1%2FbtsMbUGppBE%2FrJPln9z4fkswXTSVE5dep0%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;458&quot; height=&quot;749&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;749&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;137&quot; data-origin-height=&quot;149&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brACEv/btsMcZfHxX3/nFQlIGgZjBUzCdIrIUABM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brACEv/btsMcZfHxX3/nFQlIGgZjBUzCdIrIUABM1/img.png&quot; data-alt=&quot;늘리기 전&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brACEv/btsMcZfHxX3/nFQlIGgZjBUzCdIrIUABM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrACEv%2FbtsMcZfHxX3%2FnFQlIGgZjBUzCdIrIUABM1%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;137&quot; height=&quot;149&quot; data-origin-width=&quot;137&quot; data-origin-height=&quot;149&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;늘리기 전&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;134&quot; data-origin-height=&quot;148&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9ngYZ/btsMdmPoXKH/CwpT1BkpoWkhgUYilhfu2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9ngYZ/btsMdmPoXKH/CwpT1BkpoWkhgUYilhfu2k/img.png&quot; data-alt=&quot;늘린 후&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9ngYZ/btsMdmPoXKH/CwpT1BkpoWkhgUYilhfu2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9ngYZ%2FbtsMdmPoXKH%2FCwpT1BkpoWkhgUYilhfu2k%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;134&quot; height=&quot;148&quot; data-origin-width=&quot;134&quot; data-origin-height=&quot;148&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Lightmap Uvs 세팅에서 Margin Method를 Manual로 변경하고 Pack Margin을 조정하면, 차트간의 거리가 증가하여 오버랩이 발생할 확률이 줄어들게된다. 하지만 너무 무분별하게 늘리면 라이트 맵이 커지거나, 또 다른 차트와 인접해버릴 수 있기 때문에 &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;문제가 해결되는 지점까지만 &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;늘리는 것을 권장한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;238&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LYuMp/btsMceLt17c/qOKu6pqtXEClt8fPjTpkbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LYuMp/btsMceLt17c/qOKu6pqtXEClt8fPjTpkbK/img.png&quot; data-alt=&quot;Pack Margin을 조정해 해결된 모습1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LYuMp/btsMceLt17c/qOKu6pqtXEClt8fPjTpkbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLYuMp%2FbtsMceLt17c%2FqOKu6pqtXEClt8fPjTpkbK%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;497&quot; height=&quot;238&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;238&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Pack Margin을 조정해 해결된 모습1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;483&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5jGi4/btsMbXXsYLK/R1wnDt0qre7PSMwwJVQEXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5jGi4/btsMbXXsYLK/R1wnDt0qre7PSMwwJVQEXK/img.png&quot; data-alt=&quot;Pack Margin을 조정해 해결된 모습2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5jGi4/btsMbXXsYLK/R1wnDt0qre7PSMwwJVQEXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5jGi4%2FbtsMbXXsYLK%2FR1wnDt0qre7PSMwwJVQEXK%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;483&quot; height=&quot;392&quot; data-origin-width=&quot;483&quot; data-origin-height=&quot;392&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Pack Margin을 조정해 해결된 모습2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Unity/3D</category>
      <author>하길</author>
      <guid isPermaLink="true">https://hagil.tistory.com/156</guid>
      <comments>https://hagil.tistory.com/156#entry156comment</comments>
      <pubDate>Mon, 10 Feb 2025 12:34:06 +0900</pubDate>
    </item>
  </channel>
</rss>