<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Game Development</title>
    <link>https://game-dev.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sun, 10 May 2026 00:40:43 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Dev Owen</managingEditor>
    <item>
      <title>LeetCode 4번 Median of Two Sorted Arrays</title>
      <link>https://game-dev.tistory.com/40</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;leetcode.jpeg&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;583&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cx54D3/btsvjfG92hM/yaHE8fdbtVd6uX0EkkpsZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cx54D3/btsvjfG92hM/yaHE8fdbtVd6uX0EkkpsZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cx54D3/btsvjfG92hM/yaHE8fdbtVd6uX0EkkpsZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcx54D3%2FbtsvjfG92hM%2FyaHE8fdbtVd6uX0EkkpsZk%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;875&quot; height=&quot;583&quot; data-filename=&quot;leetcode.jpeg&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;583&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f3c000; font-family: 'Nanum Gothic';&quot;&gt;문제 링크&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;smali&quot; style=&quot;background-color: #f0f0f0; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;Input: nums1 = [1,3], nums2 = [2]
Output: 2.00000
Explanation: merged array = [1,2,3] and median is 2.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #f0f0f0; color: #262626; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #f0f0f0; color: #000000; text-align: start;&quot;&gt;&lt;code&gt;Input: nums1 = [1,2], nums2 = [3,4]
Output: 2.50000
Explanation: merged array = [1,2,3,4] and median is (2 + 3) / 2 = 2.5.&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f3c000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&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;여기서 배열의 크기가 짝수일 경우에는 중간의 2개 값을 더하고 절반의 값을 출력해주면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1695454721656&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
public:
    double findMedianSortedArrays(vector&amp;lt;int&amp;gt;&amp;amp; nums1, vector&amp;lt;int&amp;gt;&amp;amp; nums2) 
    {
        nums1.insert(nums1.end(), nums2.begin(), nums2.end());
        sort(nums1.begin(), nums1.end());
        
        int arraySize = nums1.size();
        int hlafSize = arraySize / 2;

        double res = nums1[hlafSize];

        if (arraySize % 2 == 0)
        {
            res += nums1[hlafSize - 1];
            res /= 2;
        }

        return res;
    }
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100.233%; height: 79px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;text-align: center; height: 19px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Time Submitted&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 19px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Status&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 19px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;RunTime&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 19px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Memory&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot; data-row-key=&quot;527908735&quot;&gt;
&lt;td style=&quot;text-align: center; height: 20px;&quot;&gt;&lt;span style=&quot;color: #424242; font-family: 'Nanum Gothic';&quot;&gt;07/25/2021 19:21&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 20px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://leetcode.com/submissions/detail/527908735/&quot; data-submission-id=&quot;527908735&quot;&gt;Accepted&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 20px;&quot;&gt;&lt;span style=&quot;background-color: #f0f0f0; color: #262626; text-align: start;&quot;&gt;19&lt;/span&gt;&lt;span style=&quot;background-color: #f0f0f0; color: #000000; text-align: start;&quot;&gt;ms&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 20px;&quot;&gt;&lt;span style=&quot;background-color: #f0f0f0; color: #262626; text-align: start;&quot;&gt;89.91&lt;/span&gt;&lt;span style=&quot;background-color: #f0f0f0; color: #000000; text-align: start;&quot;&gt;MB&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Algorithms/Leet Code</category>
      <category>4번</category>
      <category>LeetCode</category>
      <category>Median of Two Sorted Arrays</category>
      <author>Dev Owen</author>
      <guid isPermaLink="true">https://game-dev.tistory.com/40</guid>
      <comments>https://game-dev.tistory.com/40#entry40comment</comments>
      <pubDate>Sat, 23 Sep 2023 16:40:59 +0900</pubDate>
    </item>
    <item>
      <title>C# Generic Enum Type을 효율적으로 Int로 변환시켜보자</title>
      <link>https://game-dev.tistory.com/39</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;해당 글은 &lt;a href=&quot;https://www.slideshare.net/devcatpublications/enum-boxing-enum-ndc2019&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.slideshare.net/devcatpublications/enum-boxing-enum-ndc2019&lt;/a&gt;&amp;nbsp;의 내용을 바탕으로 제작되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자세한 설명은 해당 링크를 통해서 확인하시면 됩니다!&lt;/p&gt;
&lt;figure id=&quot;og_1664904429949&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;slideshare:presentation&quot; data-og-title=&quot;이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019&quot; data-og-description=&quot;Nexon Korea 이무림 편리하고 성능좋게 Enum 사용하기 Enum의 Boxing을 어찌할꼬?&quot; data-og-host=&quot;www.slideshare.net&quot; data-og-source-url=&quot;https://www.slideshare.net/devcatpublications/enum-boxing-enum-ndc2019&quot; data-og-url=&quot;https://www.slideshare.net/devcatpublications/enum-boxing-enum-ndc2019&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/GESuu/hyP0xAqT46/8kcKaGkT2xNoYEVfXnGVeK/img.jpg?width=768&amp;amp;height=432&amp;amp;face=0_0_768_432,https://scrap.kakaocdn.net/dn/26mFB/hyP0Jnki85/lg16317Ezx5xS5kixCcjdK/img.jpg?width=768&amp;amp;height=432&amp;amp;face=0_0_768_432&quot;&gt;&lt;a href=&quot;https://www.slideshare.net/devcatpublications/enum-boxing-enum-ndc2019&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.slideshare.net/devcatpublications/enum-boxing-enum-ndc2019&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/GESuu/hyP0xAqT46/8kcKaGkT2xNoYEVfXnGVeK/img.jpg?width=768&amp;amp;height=432&amp;amp;face=0_0_768_432,https://scrap.kakaocdn.net/dn/26mFB/hyP0Jnki85/lg16317Ezx5xS5kixCcjdK/img.jpg?width=768&amp;amp;height=432&amp;amp;face=0_0_768_432');&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;이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Nexon Korea 이무림 편리하고 성능좋게 Enum 사용하기 Enum의 Boxing을 어찌할꼬?&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.slideshare.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Enum Type 을 Generic으로 받아 Int로 변환하는 경우 Boxing이 일어나게된다.&lt;/p&gt;
&lt;pre id=&quot;code_1664903908536&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static int Enum32ToInt&amp;lt;T&amp;gt;(T e) where T : Enum
{
	return (int)(object)e;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리는 Boxing이 일어나게 되면 게임 성능에 좋지 못하다는걸 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 어떻게 해야 Boxing이 일어나지 않고 간단하게 처리할 수 있을까?&lt;/p&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;일단 기본적으로 Enum은의 value 는 int이라는 점을 기억하자&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;UnSafe Pointer를 사용해보자&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UnSAfe Pointer란&amp;nbsp; c# 에서 Pointer를 사용할 수 있게 하는 것 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C++에서 Pointer를 배운사람이라면 아래의 코드를 이해하기 쉬울 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1664904167101&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static class EnumConvertUtils
{
    private struct Shell&amp;lt;T&amp;gt; where T : Enum
    {
        public int IntValue;
        public T Enum;
    }

    public static int Enum32ToInt&amp;lt;T&amp;gt;(T e) where T : Enum
    {
        Shell&amp;lt;T&amp;gt; s;
        s.Enum = e;

        unsafe
        {
            int* pi = &amp;amp;s.IntValue;
            pi += 1;
            return *pi;
        }
    }

    public static T IntToEnums32&amp;lt;T&amp;gt;(int value) where T : Enum
    {
        var s = new Shell&amp;lt;T&amp;gt;();

        unsafe
        {
            int* pi = &amp;amp;s.IntValue;
            pi += 1;
            *pi = value;
        }

        return s.Enum;
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Unity/Performance</category>
      <category>boxing</category>
      <category>CONVERT</category>
      <category>Enum</category>
      <category>Generic</category>
      <category>int</category>
      <category>non</category>
      <author>Dev Owen</author>
      <guid isPermaLink="true">https://game-dev.tistory.com/39</guid>
      <comments>https://game-dev.tistory.com/39#entry39comment</comments>
      <pubDate>Wed, 5 Oct 2022 02:28:25 +0900</pubDate>
    </item>
    <item>
      <title>LeetCode 6번  ZigZag Conversion</title>
      <link>https://game-dev.tistory.com/18</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4Jf2K%2Fbtrax63zPBJ%2FKTDSmGmPMWIvS9vr6NtkF0%2Fimg.png&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;583&quot; data-filename=&quot;leetcode.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgKLka/btrbbTQLqs6/Eacoo1cuKWjAQa4oYKaMv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgKLka/btrbbTQLqs6/Eacoo1cuKWjAQa4oYKaMv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgKLka/btrbbTQLqs6/Eacoo1cuKWjAQa4oYKaMv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4Jf2K%2Fbtrax63zPBJ%2FKTDSmGmPMWIvS9vr6NtkF0%2Fimg.png&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;583&quot; data-filename=&quot;leetcode.jpeg&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;문제 링크&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1628002729557&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;ZigZag Conversion - LeetCode&quot; data-og-description=&quot;Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/zigzag-conversion/&quot; data-og-url=&quot;https://leetcode.com/problems/zigzag-conversion/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/AiJnc/hyK6i2oO5a/r58Mi23PJ79vglqeEjcyTk/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/zigzag-conversion/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/zigzag-conversion/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/AiJnc/hyK6i2oO5a/r58Mi23PJ79vglqeEjcyTk/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260');&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;ZigZag Conversion - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;문제&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The string&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;PAYPALISHIRING&quot;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1628002700152&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;P   A   H   N
A P L S I I G
Y   I   R&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;And then read line by line:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;PAHNAPLSIIGYIR&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Write the code that will take a string and make this conversion given a number of rows:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;string convert(string s, int numRows);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;Example 1:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1628002562426&quot; class=&quot;c++ arduino&quot; style=&quot;overflow: auto; margin: 10px auto; padding: 0px; color: #555555; background-color: #f6f7f8; overflow-wrap: break-word; font-family: Menlo, Consolas, Monaco, monospace; font-size: 14px; line-height: 20px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: s = &quot;PAYPALISHIRING&quot;, numRows = 3
Output: &quot;PAHNAPLSIIGYIR&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1628002562426&quot; class=&quot;c++ arduino&quot; style=&quot;overflow: auto; margin: 10px auto; padding: 0px; color: #555555; background-color: #f6f7f8; overflow-wrap: break-word; font-family: Menlo, Consolas, Monaco, monospace; font-size: 14px; line-height: 20px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: s = &quot;PAYPALISHIRING&quot;, numRows = 4
Output: &quot;PINALSIGYAHRPI&quot;
Explanation:
P     I    N
A   L S  I G
Y A   H R
P     I&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;Example 3:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1628002562426&quot; class=&quot;c++ arduino&quot; style=&quot;overflow: auto; margin: 10px auto; padding: 0px; color: #555555; background-color: #f6f7f8; overflow-wrap: break-word; font-family: Menlo, Consolas, Monaco, monospace; font-size: 14px; line-height: 20px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: s = &quot;A&quot;, numRows = 1
Output: &quot;A&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 문제는 주여진 문자열을 지그재리로 배열한 후 출력하시면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1628002670555&quot; class=&quot;c++ arduino&quot; style=&quot;overflow: auto; margin: 10px auto; padding: 0px; color: #555555; background-color: #f6f7f8; overflow-wrap: break-word; font-family: Menlo, Consolas, Monaco, monospace; font-size: 14px; line-height: 20px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: s = &quot;ac&quot;
Output: &quot;a&quot;&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;pre id=&quot;code_1628002562426&quot; class=&quot;c++ arduino&quot; style=&quot;overflow: auto; margin: 10px auto; padding: 0px; color: #555555; background-color: #f6f7f8; overflow-wrap: break-word; font-family: Menlo, Consolas, Monaco, monospace; font-size: 14px; line-height: 20px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
public:
	string convert(string s, int numRows)
	{
		vector&amp;lt;string&amp;gt; zigzag(numRows);
		string answer = &quot;&quot;;
		bool isDown = true;
		for (int i = 0, j = 0; i &amp;lt; s.size(); i++)
		{
			zigzag[j] += s[i];
			
			if (numRows &amp;gt; 1)
			{
				if (i != 0 &amp;amp;&amp;amp; i % (numRows - 1) == 0)
				{
					isDown = !isDown;
				}

				j += (isDown == true ? 1 : -1);
			}
		}

		for (int i = 0; i &amp;lt; numRows; i++)
		{
			answer += zigzag[i];
		}
		return answer;
	}
};&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 79px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span&gt;Time Submitted&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span&gt;Status&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span&gt;RunTime&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span&gt;Memory&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-row-key=&quot;527908735&quot;&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #424242;&quot;&gt;08/03/2021 23:14&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://leetcode.com/submissions/detail/527908735/&quot; data-submission-id=&quot;527908735&quot;&gt;Accepted&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #424242;&quot;&gt;4 ms&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span&gt;10.8&amp;nbsp; MB&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;시간 복잡도 : O(N^2)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;577&quot; data-origin-height=&quot;181&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwEJZM/btra4W8ihi8/osSBofZmbhf85W940Pa1M1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwEJZM/btra4W8ihi8/osSBofZmbhf85W940Pa1M1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwEJZM/btra4W8ihi8/osSBofZmbhf85W940Pa1M1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwEJZM%2Fbtra4W8ihi8%2FosSBofZmbhf85W940Pa1M1%2Fimg.png&quot; data-origin-width=&quot;577&quot; data-origin-height=&quot;181&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;</description>
      <category>Algorithms/Leet Code</category>
      <category>6번</category>
      <category>Algorithm</category>
      <category>LeetCode</category>
      <category>string</category>
      <category>zigzag</category>
      <category>알고리즘</category>
      <author>Dev Owen</author>
      <guid isPermaLink="true">https://game-dev.tistory.com/18</guid>
      <comments>https://game-dev.tistory.com/18#entry18comment</comments>
      <pubDate>Wed, 4 Aug 2021 00:00:13 +0900</pubDate>
    </item>
    <item>
      <title>LeetCode 5번 Longest Palindromic Substring</title>
      <link>https://game-dev.tistory.com/17</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbp1iVm%2FbtrasuRBn1A%2FW7Z1xgnvdHj94lpi3v0Ok0%2Fimg.png&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;583&quot; data-filename=&quot;leetcode.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4Jf2K/btrax63zPBJ/KTDSmGmPMWIvS9vr6NtkF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4Jf2K/btrax63zPBJ/KTDSmGmPMWIvS9vr6NtkF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4Jf2K/btrax63zPBJ/KTDSmGmPMWIvS9vr6NtkF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbp1iVm%2FbtrasuRBn1A%2FW7Z1xgnvdHj94lpi3v0Ok0%2Fimg.png&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;583&quot; data-filename=&quot;leetcode.jpeg&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;문제 링크&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1627219476471&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;Longest Palindromic Substring - LeetCode&quot; data-og-description=&quot;Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/longest-palindromic-substring/submissions/&quot; data-og-url=&quot;https://leetcode.com/problems/longest-palindromic-substring/submissions/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ciCoWL/hyKZZBusJ5/f6fKKkxQjkXutLadKFmWCK/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/longest-palindromic-substring/submissions/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/longest-palindromic-substring/submissions/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ciCoWL/hyKZZBusJ5/f6fKKkxQjkXutLadKFmWCK/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260');&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;Longest Palindromic Substring - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;문제&lt;/span&gt;&lt;/b&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;b&gt;Example 1:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1627219446343&quot; class=&quot;c++ arduino&quot; style=&quot;overflow: auto; margin: 10px auto; padding: 0px; color: #555555; background-color: #f6f7f8; overflow-wrap: break-word; font-family: Menlo, Consolas, Monaco, monospace; font-size: 14px; line-height: 20px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: s = &quot;babad&quot;
Output: &quot;bab&quot;
Note: &quot;aba&quot; is also a valid answer.&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;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1627219446343&quot; class=&quot;c++ arduino&quot; style=&quot;overflow: auto; margin: 10px auto; padding: 0px; color: #555555; background-color: #f6f7f8; overflow-wrap: break-word; font-family: Menlo, Consolas, Monaco, monospace; font-size: 14px; line-height: 20px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: s = &quot;cbbd&quot;
Output: &quot;bb&quot;&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;&lt;b&gt;Example 3:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1627219446343&quot; class=&quot;c++ arduino&quot; style=&quot;overflow: auto; margin: 10px auto; padding: 0px; color: #555555; background-color: #f6f7f8; overflow-wrap: break-word; font-family: Menlo, Consolas, Monaco, monospace; font-size: 14px; line-height: 20px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: s = &quot;a&quot;
Output: &quot;a&quot;&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;&lt;b&gt;Example 4:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1627219500114&quot; class=&quot;c++ arduino&quot; style=&quot;overflow: auto; margin: 10px auto; padding: 0px; color: #555555; background-color: #f6f7f8; overflow-wrap: break-word; font-family: Menlo, Consolas, Monaco, monospace; font-size: 14px; line-height: 20px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: s = &quot;ac&quot;
Output: &quot;a&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f3c000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;풀이&lt;/b&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&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1627219446343&quot; class=&quot;c++ arduino&quot; style=&quot;overflow: auto; margin: 10px auto; padding: 0px; color: #555555; background-color: #f6f7f8; overflow-wrap: break-word; font-family: Menlo, Consolas, Monaco, monospace; font-size: 14px; line-height: 20px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
private:

	string answer;
public:
	void Palindrome(int _left, int _right, string&amp;amp; _s)
	{
		//cout &amp;lt;&amp;lt; _left &amp;lt;&amp;lt; &quot; &quot; &amp;lt;&amp;lt; _right &amp;lt;&amp;lt; endl;
		while (true)
		{
			if (_left &amp;lt; 0 || _right &amp;gt;= _s.size())
			{
				break;
			}
			else if (_s[_left] != _s[_right])
			{
				break;
			}
			else
			{
				--_left;
				++_right;
			}
		}
		
		int len = _right - _left - 1;

		if (answer.size() &amp;lt; len)
		{
			answer = _s.substr(_left + 1, len);
		}
	}

	string longestPalindrome(string s)
	{
		for (int i = 0; i &amp;lt; s.size(); i++)
		{
			Palindrome(i - 1, i + 1, s);
			Palindrome(i, i + 1, s);	// abba 같은 경우
		}
		return answer;
	}
};&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100.233%; height: 82px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Time Submitted&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Status&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;RunTime&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Memory&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-row-key=&quot;527908735&quot;&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #424242; font-family: 'Nanum Gothic';&quot;&gt;07/25/2021 22:22&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://leetcode.com/submissions/detail/527908735/&quot; data-submission-id=&quot;527908735&quot;&gt;Accepted&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #424242; font-family: 'Nanum Gothic';&quot;&gt;28 ms&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;14.4 MB&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;시간 복잡도 : O(N^2)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;172&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVbtxq/btrax8G5uo6/oOOBlaEBYpM6Aq97ek43K0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVbtxq/btrax8G5uo6/oOOBlaEBYpM6Aq97ek43K0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVbtxq/btrax8G5uo6/oOOBlaEBYpM6Aq97ek43K0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVbtxq%2Fbtrax8G5uo6%2FoOOBlaEBYpM6Aq97ek43K0%2Fimg.png&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;172&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Algorithms/Leet Code</category>
      <category>5번</category>
      <category>C++</category>
      <category>code</category>
      <category>LEET</category>
      <category>Longest Palindromic Substring</category>
      <author>Dev Owen</author>
      <guid isPermaLink="true">https://game-dev.tistory.com/17</guid>
      <comments>https://game-dev.tistory.com/17#entry17comment</comments>
      <pubDate>Sun, 25 Jul 2021 22:28:54 +0900</pubDate>
    </item>
    <item>
      <title>LeetCode 3번 Longest Substring Without Repeating Characters</title>
      <link>https://game-dev.tistory.com/16</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiFE38%2FbtranzfIjX1%2FYEH5GYluty4bWqU1OyNKRK%2Fimg.png&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;583&quot; data-filename=&quot;leetcode.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bp1iVm/btrasuRBn1A/W7Z1xgnvdHj94lpi3v0Ok0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bp1iVm/btrasuRBn1A/W7Z1xgnvdHj94lpi3v0Ok0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bp1iVm/btrasuRBn1A/W7Z1xgnvdHj94lpi3v0Ok0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiFE38%2FbtranzfIjX1%2FYEH5GYluty4bWqU1OyNKRK%2Fimg.png&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;583&quot; data-filename=&quot;leetcode.jpeg&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f3c000; font-family: 'Nanum Gothic';&quot;&gt;문제 링크&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1627208870245&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;Longest Substring Without Repeating Characters - LeetCode&quot; data-og-description=&quot;Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/longest-substring-without-repeating-characters/&quot; data-og-url=&quot;https://leetcode.com/problems/longest-substring-without-repeating-characters/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/8yYV8/hyKZXcpofI/z3TrvbgmiltzoyFLZyDJg1/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/longest-substring-without-repeating-characters/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/longest-substring-without-repeating-characters/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/8yYV8/hyKZXcpofI/z3TrvbgmiltzoyFLZyDJg1/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260');&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;Longest Substring Without Repeating Characters - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;문제&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Example 1:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1627208688880&quot; class=&quot;c++ arduino&quot; style=&quot;overflow: auto; margin: 10px auto; padding: 0px; color: #555555; background-color: #f6f7f8; overflow-wrap: break-word; font-family: Menlo, Consolas, Monaco, monospace; font-size: 14px; line-height: 20px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: s = &quot;abcabcbb&quot;
Output: 3
Explanation: The answer is &quot;abc&quot;, with the length of 3.&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1627208688880&quot; class=&quot;c++ arduino&quot; style=&quot;overflow: auto; margin: 10px auto; padding: 0px; color: #555555; background-color: #f6f7f8; overflow-wrap: break-word; font-family: Menlo, Consolas, Monaco, monospace; font-size: 14px; line-height: 20px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: s = &quot;bbbbb&quot;
Output: 1
Explanation: The answer is &quot;b&quot;, with the length of 1.
Example 3:&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Example 3:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1627208688881&quot; class=&quot;c++ arduino&quot; style=&quot;overflow: auto; margin: 10px auto; padding: 0px; color: #555555; background-color: #f6f7f8; overflow-wrap: break-word; font-family: Menlo, Consolas, Monaco, monospace; font-size: 14px; line-height: 20px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: s = &quot;pwwkew&quot;
Output: 3
Explanation: The answer is &quot;wke&quot;, with the length of 3.
Notice that the answer must be a substring, &quot;pwke&quot; is a subsequence and not a substring.&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f3c000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이 문제는 주어진 문자열에서 문자를 중복하여 사용하지 않고 가장 긴 문자열의 길이를 리턴하는 문제입니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1627208688881&quot; class=&quot;c++ arduino&quot; style=&quot;overflow: auto; margin: 10px auto; padding: 0px; color: #555555; background-color: #f6f7f8; overflow-wrap: break-word; font-family: Menlo, Consolas, Monaco, monospace; font-size: 14px; line-height: 20px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
public:
	int lengthOfLongestSubstring(string s)
	{
		map&amp;lt;char, int&amp;gt; dict;
		int maxLen = 0, begin = 0;
		char key;

		for (int i = 0; i &amp;lt; s.size(); i++)
		{
			key = s[i];

			// 현재 노드 안에 있고, 시작 지점이 현재 중복되는 노드보다 앞에 있을 경우
			if (dict.find(key) != dict.end() &amp;amp;&amp;amp; dict[key] &amp;gt;= begin)
			{
				maxLen = max(maxLen, i - begin);
				begin = dict[key] + 1;
			}

			dict[key] = i;
		}
		return max(maxLen, (int)s.size() - begin);
	}
};&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100.233%; height: 79px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;text-align: center; height: 19px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Time Submitted&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 19px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Status&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 19px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;RunTime&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 19px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Memory&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot; data-row-key=&quot;527908735&quot;&gt;
&lt;td style=&quot;text-align: center; height: 20px;&quot;&gt;&lt;span style=&quot;color: #424242; font-family: 'Nanum Gothic';&quot;&gt;07/25/2021 19:21&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 20px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://leetcode.com/submissions/detail/527908735/&quot; data-submission-id=&quot;527908735&quot;&gt;Accepted&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 20px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;16 ms&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 20px;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;8.5 MB&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;시간 복잡도 : O(N)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;169&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blBk58/btrao7CQFsg/kvV7l2OoxDZBifEgB4RGBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blBk58/btrao7CQFsg/kvV7l2OoxDZBifEgB4RGBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blBk58/btrao7CQFsg/kvV7l2OoxDZBifEgB4RGBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblBk58%2Fbtrao7CQFsg%2FkvV7l2OoxDZBifEgB4RGBk%2Fimg.png&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;169&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;</description>
      <category>Algorithms/Leet Code</category>
      <category>3</category>
      <category>C++</category>
      <category>LeetCode</category>
      <category>Longest Substring Without Repeating Characters</category>
      <author>Dev Owen</author>
      <guid isPermaLink="true">https://game-dev.tistory.com/16</guid>
      <comments>https://game-dev.tistory.com/16#entry16comment</comments>
      <pubDate>Sun, 25 Jul 2021 19:30:59 +0900</pubDate>
    </item>
    <item>
      <title>LeetCode 2번  Add Two Numbers</title>
      <link>https://game-dev.tistory.com/15</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;583&quot; data-filename=&quot;leetcode.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biFE38/btranzfIjX1/YEH5GYluty4bWqU1OyNKRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biFE38/btranzfIjX1/YEH5GYluty4bWqU1OyNKRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biFE38/btranzfIjX1/YEH5GYluty4bWqU1OyNKRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiFE38%2FbtranzfIjX1%2FYEH5GYluty4bWqU1OyNKRK%2Fimg.png&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;583&quot; data-filename=&quot;leetcode.jpeg&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;문제 링크&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1627196749436&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;Add Two Numbers - LeetCode&quot; data-og-description=&quot;Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/add-two-numbers/&quot; data-og-url=&quot;https://leetcode.com/problems/add-two-numbers/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/d3MtYE/hyKZ34w0KQ/SkkAFF54KD9tfs3ZAQhMZK/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/sYlXd/hyKZVel5PV/mUMPMBzBRWMHFgGK7Ao3L0/img.jpg?width=483&amp;amp;height=342&amp;amp;face=0_0_483_342&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/add-two-numbers/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/add-two-numbers/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/d3MtYE/hyKZ34w0KQ/SkkAFF54KD9tfs3ZAQhMZK/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/sYlXd/hyKZVel5PV/mUMPMBzBRWMHFgGK7Ao3L0/img.jpg?width=483&amp;amp;height=342&amp;amp;face=0_0_483_342');&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;Add Two Numbers - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;문제&lt;/span&gt;&lt;/b&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;b&gt;Example 1:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;483&quot; data-origin-height=&quot;342&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zd23D/btranEtY4kt/Jv9blMLyhkOTXF6siJIW41/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zd23D/btranEtY4kt/Jv9blMLyhkOTXF6siJIW41/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zd23D/btranEtY4kt/Jv9blMLyhkOTXF6siJIW41/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzd23D%2FbtranEtY4kt%2FJv9blMLyhkOTXF6siJIW41%2Fimg.jpg&quot; data-origin-width=&quot;483&quot; data-origin-height=&quot;342&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;pre id=&quot;code_1627196918630&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: l1 = [2,4,3], l2 = [5,6,4]
Output: [7,0,8]
Explanation: 342 + 465 = 807.&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;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1627196913329&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: l1 = [0], l2 = [0]
Output: [0]&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;&lt;b&gt;Example 3:&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1627196907691&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
Output: [8,9,9,9,0,0,0,1]&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f3c000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;풀이&lt;/b&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;이 문제는 주어진 단일 연결 리스트에 값들을 더하고 올림이 발생할 경우 다음 위치에 노드에 1을 더해줘야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1627198826757&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
public:
	ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
	{
		ListNode* answer = new ListNode();
		ListNode* answerBegin = answer;

		answerBegin = answer;
		int val;
		while (l1 != nullptr || l2 != nullptr)
		{
			val = 0;
			if (l1 != nullptr)
			{
				val += l1-&amp;gt;val;
				l1 = l1-&amp;gt;next;
			}
			if (l2 != nullptr)
			{
				val += l2-&amp;gt;val;
				l2 = l2-&amp;gt;next;
			}

			val += answer-&amp;gt;val;
			answer-&amp;gt;val = val % 10;

			if (l1 != nullptr || l2 != nullptr || val &amp;gt;= 10)
			{
				answer-&amp;gt;next = new ListNode(val / 10);
				answer = answer-&amp;gt;next;
			}
		}
		return answerBegin;
	}
};&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100.349%; height: 91px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Time Submitted&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Status&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;RunTime&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Memory&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot; data-row-key=&quot;527908735&quot;&gt;
&lt;td style=&quot;height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;07/25/2021 15:05&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://leetcode.com/submissions/detail/527908735/&quot; data-submission-id=&quot;527908735&quot;&gt;Accepted&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;16 ms&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;71.3 MB&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;시간 복잡도 : O(N)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;241&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPUqZr/btrat2tFYyn/hNQxzlUR6hBGPNaLf36961/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPUqZr/btrat2tFYyn/hNQxzlUR6hBGPNaLf36961/img.png&quot; data-alt=&quot;ㅁ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPUqZr/btrat2tFYyn/hNQxzlUR6hBGPNaLf36961/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPUqZr%2Fbtrat2tFYyn%2FhNQxzlUR6hBGPNaLf36961%2Fimg.png&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;241&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;</description>
      <category>Algorithms/Leet Code</category>
      <category>2번</category>
      <category>C++</category>
      <category>LeetCode</category>
      <category>문제풀이</category>
      <category>알고리즘</category>
      <author>Dev Owen</author>
      <guid isPermaLink="true">https://game-dev.tistory.com/15</guid>
      <comments>https://game-dev.tistory.com/15#entry15comment</comments>
      <pubDate>Sun, 25 Jul 2021 17:21:03 +0900</pubDate>
    </item>
    <item>
      <title>LeetCode 1번 Two Sum</title>
      <link>https://game-dev.tistory.com/14</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;583&quot; data-filename=&quot;leetcode.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cV48iw/btranWBF9qo/VCxtkUu8StonQXhEaHxD30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cV48iw/btranWBF9qo/VCxtkUu8StonQXhEaHxD30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cV48iw/btranWBF9qo/VCxtkUu8StonQXhEaHxD30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcV48iw%2FbtranWBF9qo%2FVCxtkUu8StonQXhEaHxD30%2Fimg.png&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;583&quot; data-filename=&quot;leetcode.jpeg&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;문제 링크&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1627190317997&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;Two Sum - LeetCode&quot; data-og-description=&quot;Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/two-sum/submissions/&quot; data-og-url=&quot;https://leetcode.com/problems/two-sum/submissions/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cAVL6l/hyKZ1etVN6/cQkCYKsD9xaOP1fHX2Zt41/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/two-sum/submissions/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/two-sum/submissions/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cAVL6l/hyKZ1etVN6/cQkCYKsD9xaOP1fHX2Zt41/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260');&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;Two Sum - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f3c000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;문제&lt;/b&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;Given an array of integers&amp;nbsp;nums&amp;nbsp;and an integer&amp;nbsp;target, return&amp;nbsp;indices of the two numbers such that they add up to&amp;nbsp;target.&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;You may assume that each input would have&amp;nbsp;&lt;b&gt;exactly&amp;nbsp;one solution&lt;/b&gt;, and you may not use the&amp;nbsp;same&amp;nbsp;element twice.&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;You can return the answer in any order.&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;Example 1:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1627190458168&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: nums = [2,7,11,15], target = 9
Output: [0,1]
Output: Because nums[0] + nums[1] == 9, we return [0, 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;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1627190473278&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: nums = [3,2,4], target = 6 
Output: [1,2]&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;&lt;b&gt;Example 3:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1627190499315&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: nums = [3,3], target = 6 
Output: [0,1]&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f3c000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;풀이&lt;/b&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;이 문제는 주어진 배열에서 두 개의 원소를 더하여 Target이 되는 값을 찾으면 되는 문제입니다.&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;해당 문제의 풀이 과정은 크게 2가지로 되어 있습니다.&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;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #8cb3be;&quot;&gt;1. 브루트 포스 ( 느림 )&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1627190766994&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution
{
public:
    vector&amp;lt;int&amp;gt; twoSum(vector&amp;lt;int&amp;gt;&amp;amp; nums, int target)
    {

        for (int i = 0; i &amp;lt; nums.size(); i++)
        {
            for ( int j = i + 1; j &amp;lt; nums.size(); j++ )
            {
                if ( nums[i] + nums[j] == target )
                {
                    return {i, j};
                }
            }
        }
        return {};
    }
};&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100.349%; height: 85px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 26px;&quot;&gt;
&lt;td style=&quot;height: 26px; width: 35.3488%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Time Submitted&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 26px; width: 20.9302%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Status&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 26px; width: 19.8837%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;RunTime&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 26px; width: 19.186%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Memory&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot; data-row-key=&quot;527908735&quot;&gt;
&lt;td style=&quot;height: 20px; width: 35.3488%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;07/25/2021 14:25&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px; width: 20.9302%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://leetcode.com/submissions/detail/527908735/&quot; data-submission-id=&quot;527908735&quot;&gt;Accepted&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px; width: 19.8837%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;312 ms&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px; width: 19.186%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;10.1 MB&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;시간 복잡도 : O(N^2)&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;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #8cb3be; font-family: 'Nanum Gothic';&quot;&gt;2. 해시를 이용 ( 빠름 )&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1627190658933&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution
{
public:
    vector&amp;lt;int&amp;gt; twoSum(vector&amp;lt;int&amp;gt;&amp;amp; nums, int target)
    {
        map&amp;lt;int, int&amp;gt; dict;

        for (int i = 0; i &amp;lt; nums.size(); i++)
        {
            if (dict.find(target - nums[i]) == dict.end())
            {
                dict[nums[i]] = i;
            }
            else
            {
                return { i, dict[target - nums[i]] };
            }
        }
        return {};
    }
};&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 82px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 34.0698%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Time Submitted&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20.1163%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Status&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6279%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;RunTime&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 18.2558%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Memory&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot; data-row-key=&quot;527908735&quot;&gt;
&lt;td style=&quot;width: 34.0698%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;07/25/2021 14:25&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20.1163%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://leetcode.com/submissions/detail/527908735/&quot; data-submission-id=&quot;527908735&quot;&gt;Accepted&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.6279%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;8ms&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 18.2558%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;10.1ms&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;시간 복잡도 : O(N)&lt;/span&gt;&lt;/p&gt;</description>
      <category>Algorithms/Leet Code</category>
      <category>2번</category>
      <category>C++</category>
      <category>LeetCode</category>
      <category>문제풀이</category>
      <category>알고리즘</category>
      <category>컴맹에서개발자까지</category>
      <author>Dev Owen</author>
      <guid isPermaLink="true">https://game-dev.tistory.com/14</guid>
      <comments>https://game-dev.tistory.com/14#entry14comment</comments>
      <pubDate>Sun, 25 Jul 2021 14:32:44 +0900</pubDate>
    </item>
    <item>
      <title>Jump Point Search 알고리즘 ( C# 소스코드 )</title>
      <link>https://game-dev.tistory.com/13</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;853&quot; data-filename=&quot;Algorithm.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dBUG5S/btq9OHxyhcY/nEdMBhyaAiFiNygFpwhU60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dBUG5S/btq9OHxyhcY/nEdMBhyaAiFiNygFpwhU60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dBUG5S/btq9OHxyhcY/nEdMBhyaAiFiNygFpwhU60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdBUG5S%2Fbtq9OHxyhcY%2FnEdMBhyaAiFiNygFpwhU60%2Fimg.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;853&quot; data-filename=&quot;Algorithm.png&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f3c000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Jump Point Search(JPS)를 이용하여 최단 거리를 찾아 봅시다.&lt;/b&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;실제로 큰 맵을 가진 게임에서 사용되는 JPS 알고리즘에 대해서 알아보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;469&quot; data-filename=&quot;녹화_2021_07_18_17_53_29_936.gif&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Yuv4u/btq9VkIh0XO/S7n4KmRha6BbR3aK8HiM61/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Yuv4u/btq9VkIh0XO/S7n4KmRha6BbR3aK8HiM61/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Yuv4u/btq9VkIh0XO/S7n4KmRha6BbR3aK8HiM61/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/Yuv4u/btq9VkIh0XO/S7n4KmRha6BbR3aK8HiM61/img.gif&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;469&quot; data-filename=&quot;녹화_2021_07_18_17_53_29_936.gif&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;[ 참고 ]&lt;/span&gt;&lt;/b&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;해당 포스팅에는 JPS 알고리즘을 C#으로 구현한것이 제공됩니다.&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;JPS알고리즘 말고, JSP(b) 알고리즘, JPS(+) 알고리즘에 대해서도 조금이나마 내용이 나옵니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f3c000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;JPS 알고리즘 이란&lt;/b&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;A* 알고리즘을 기반으로 한 알고리즘 중 하나인 &lt;b&gt;&lt;span style=&quot;color: #8cb3be;&quot;&gt;JPS 알고리즘&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;JPS 알고리즘은 A*의 문제점인 갈 수 있는 &lt;b&gt;&lt;span style=&quot;color: #8cb3be;&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;b&gt;&lt;span style=&quot;color: #8cb3be;&quot;&gt;Jump Point Search 즉 내가 어디로 점프 해야할 지를 구하여&lt;/span&gt;&lt;/b&gt; 해당 노드에서만 연산한다는 점으로 A* 알고리즘의 문제점을 해결할 수 있게 되었습니다.&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;Jump Point를 생성하는 규칙은 코너의 여부입니다.&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;코너의 규칙은 2가지로 직직할 떄와, 대각선으로 이동할때로 나뉩니다.&lt;/span&gt;&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;1. 직진 일때 코너를 구하는 방식 ( Ex 오른쪽 방향 )&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&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;color: #8cb3be;&quot;&gt;&amp;nbsp; 1. 현재 방향으로 쭉 직진합니다.&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;b&gt;&lt;span style=&quot;color: #8cb3be;&quot;&gt;&amp;nbsp; 2. 현재 위치에서 아래가 막혀있고 오른쪽 아래가 막혀있지 않은 경우.&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;b&gt;&lt;span style=&quot;color: #8cb3be;&quot;&gt;&amp;nbsp; 3. 현재 위치에서 위가 막혀있고 오른쪽 위가 막혀있지 않은 경우.&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #8cb3be;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;469&quot; data-filename=&quot;녹화_2021_07_18_18_10_02_840.gif&quot; width=&quot;169&quot; height=&quot;316&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/deKWQ8/btq9JNy0XYj/t37o7lOSLaXW0dJLd6H9rK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/deKWQ8/btq9JNy0XYj/t37o7lOSLaXW0dJLd6H9rK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/deKWQ8/btq9JNy0XYj/t37o7lOSLaXW0dJLd6H9rK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/deKWQ8/btq9JNy0XYj/t37o7lOSLaXW0dJLd6H9rK/img.gif&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;469&quot; data-filename=&quot;녹화_2021_07_18_18_10_02_840.gif&quot; width=&quot;169&quot; height=&quot;316&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;2. 대각선 일때 코너를 구하는 방식 (Ex 오른쪽 위)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&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;color: #8cb3be;&quot;&gt;&amp;nbsp; 1. 현재 방향으로 쭉 직진합니다.&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;b&gt;&lt;span style=&quot;color: #8cb3be;&quot;&gt;&amp;nbsp; 2. 현재 위치에서 아래가 막혀있고 오른쪽 아래가 막혀있지 않은 경우.&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;b&gt;&lt;span style=&quot;color: #8cb3be;&quot;&gt;&amp;nbsp; 3. 현재 위치에서 왼쪽이 막혀있고 왼쪽 위가 막혀있지 않은 경우.&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;b&gt;&lt;span style=&quot;color: #8cb3be;&quot;&gt;&amp;nbsp; 4. 현재 위치에서 오른쪽 방향과 위쪽 방향을 &lt;span style=&quot;color: #f3c000;&quot;&gt;1번 규칙&lt;/span&gt;으로 검사 후 코너가 나왔을 경우 해당 위치에 코너를 생성하지&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;않고 해당 작업을 진행한 위치에서 노드를 생성.&lt;/span&gt;&lt;/b&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;251&quot; data-origin-height=&quot;469&quot; data-filename=&quot;녹화_2021_07_18_18_12_49_966.gif&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwOrkk/btq9RfnrRvY/tE6MyJszENIv0KQrA97xy1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwOrkk/btq9RfnrRvY/tE6MyJszENIv0KQrA97xy1/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwOrkk/btq9RfnrRvY/tE6MyJszENIv0KQrA97xy1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/dwOrkk/btq9RfnrRvY/tE6MyJszENIv0KQrA97xy1/img.gif&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;469&quot; data-filename=&quot;녹화_2021_07_18_18_12_49_966.gif&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;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;color: #8cb3be;&quot;&gt;4. 현재 위치에서 오른쪽 방향과 위쪽 방향을&amp;nbsp;&lt;span style=&quot;color: #f3c000;&quot;&gt;1번 규칙&lt;/span&gt;으로 검사 후 코너가 나왔을 경우 해당 위치에 코너를 생성하지&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;않고 해당 작업을 진행한 위치에서 노드를 생성.&lt;/span&gt;&lt;/b&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;236&quot; data-origin-height=&quot;348&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bp1CGp/btq9Ns9opxX/n4h4IKSp69ufz7pVfLhP9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bp1CGp/btq9Ns9opxX/n4h4IKSp69ufz7pVfLhP9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bp1CGp/btq9Ns9opxX/n4h4IKSp69ufz7pVfLhP9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbp1CGp%2Fbtq9Ns9opxX%2Fn4h4IKSp69ufz7pVfLhP9K%2Fimg.png&quot; data-origin-width=&quot;236&quot; data-origin-height=&quot;348&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;휴리스틱은 무엇을 사용했을까?&lt;/b&gt;&lt;/span&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;JPS에서 사용하는 휴리스틱은 A*에서 사용된 휴리스틱과 동일합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1626599972214&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private int Heuristic(Vector2Int _currPosition, Vector2Int _endPosition)
{
    int x = Mathf.Abs(_currPosition.x - _endPosition.x);
    int y = Mathf.Abs(_currPosition.y - _endPosition.y);
    int reming = Mathf.Abs(x - y);

    return MOVE_DIAGONAL_COST * Mathf.Min(x, y) + MOVE_STRAIGHT_COST * reming;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f3c000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;전체적인 소스코드&lt;/b&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;소스코드의 길이가 1000줄이 넘어 깃 허브를 통하여 A*와 JPS가 구현되어있는 프로젝트를 올리도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1626600476869&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;Dev-Owen-Git/Unity_AStar_JPS_Algorithm&quot; data-og-description=&quot;Contribute to Dev-Owen-Git/Unity_AStar_JPS_Algorithm development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/Dev-Owen-Git/Unity_AStar_JPS_Algorithm&quot; data-og-url=&quot;https://github.com/Dev-Owen-Git/Unity_AStar_JPS_Algorithm&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/s5bdA/hyKU8yujtK/pUxYrpXi5jggR91k9kRTtK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/Dev-Owen-Git/Unity_AStar_JPS_Algorithm&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/Dev-Owen-Git/Unity_AStar_JPS_Algorithm&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/s5bdA/hyKU8yujtK/pUxYrpXi5jggR91k9kRTtK/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;Dev-Owen-Git/Unity_AStar_JPS_Algorithm&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Contribute to Dev-Owen-Git/Unity_AStar_JPS_Algorithm development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Algorithms/Shortest Path Algorithm</category>
      <category>A*</category>
      <category>Algorithm</category>
      <category>JPS</category>
      <category>Unity</category>
      <category>길 찾기</category>
      <category>알고리즘</category>
      <category>유니티</category>
      <category>최단거리</category>
      <author>Dev Owen</author>
      <guid isPermaLink="true">https://game-dev.tistory.com/13</guid>
      <comments>https://game-dev.tistory.com/13#entry13comment</comments>
      <pubDate>Sun, 18 Jul 2021 18:28:43 +0900</pubDate>
    </item>
    <item>
      <title>A* 알고리즘</title>
      <link>https://game-dev.tistory.com/12</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1280&quot; data-filename=&quot;developer-3461405_1920.png&quot; width=&quot;1030&quot; height=&quot;686&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dzCqq3/btq9I3G98Jt/XxOTbuoDzMe5sbPLKU5x10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dzCqq3/btq9I3G98Jt/XxOTbuoDzMe5sbPLKU5x10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dzCqq3/btq9I3G98Jt/XxOTbuoDzMe5sbPLKU5x10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdzCqq3%2Fbtq9I3G98Jt%2FXxOTbuoDzMe5sbPLKU5x10%2Fimg.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1280&quot; data-filename=&quot;developer-3461405_1920.png&quot; width=&quot;1030&quot; height=&quot;686&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f3c000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f3c000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;A&lt;/b&gt;&lt;/span&gt;*를 이용하여 길을 찾아 보자&lt;/b&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;게임에서 사용되되는 알고리즘 중 기초적인 알고리즘 중 하나인 A*를 알아보도록 하겠습니다.&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 alignLeft&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;296&quot; data-filename=&quot;녹화_2021_07_15_23_22_03_287.gif&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWQri9/btq9HKH59Nx/jHxxKyOjI3GZtDR300iIG0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWQri9/btq9HKH59Nx/jHxxKyOjI3GZtDR300iIG0/img.gif&quot; data-alt=&quot;A* 작동하는 법&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWQri9/btq9HKH59Nx/jHxxKyOjI3GZtDR300iIG0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bWQri9/btq9HKH59Nx/jHxxKyOjI3GZtDR300iIG0/img.gif&quot; data-origin-width=&quot;251&quot; data-origin-height=&quot;296&quot; data-filename=&quot;녹화_2021_07_15_23_22_03_287.gif&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;A* 작동하는 법&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;[ 참고 ]&amp;nbsp;&lt;/span&gt;&lt;/b&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;이번 포스팅에서는 A*를 구현하는 방식에 대해서 알려드립니다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;A* 알고리즘 이란&lt;/span&gt;&lt;/b&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;b&gt;&lt;/b&gt;그래서 A*가 어떤 알고리즘 이냐면 현재의 위치에서 목적지 까지의 최단 경로를 구하는 알고리즘 입니다.&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;A*에서는 크게 3가지로 구성 되어 있다고 보시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #8cb3be;&quot;&gt;&amp;nbsp; 1. 현재 노드까지 오는데 필요했던 비용 ( g Cost )&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #8cb3be;&quot;&gt;&amp;nbsp; 2. 현재 노드에서 목적지 까지 가는데 필요한 비용 ( h Cost )&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #8cb3be;&quot;&gt;&amp;nbsp; 3. 현재 노드에까지 온 비용과 목적지 까지 비용을 합친 비용 ( f Cost )&lt;/span&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;위에 있는 3가지의 비용을 알아보기 위해서는&amp;nbsp; &lt;/span&gt;A* 알고리즘에서 제일 중요한 역할을 하는 함수 중 하나인 휴리스틱( Heuristic )을 이용해 보도록 하겠습니다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;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;&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;b&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;휴리스틱이란?&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;/span&gt;&lt;/b&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&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;pre id=&quot;code_1626357321757&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const int MOVE_STRAIGHT_COST = 10;
const int MOVE_DIAGONAL_COST = 14;

public int Heuristics(Vector2Int _currPosition, Vector2Int _endPosition)
{
    int xDistance = Mathf.Abs(_currPosition.x - endPosition.x);
    int yDistnace = Mathf.Abs(_currPosition.y - _endPosition.y);
    int reming = Mathf.Abs(xDistance - yDistnace);
    return MOVE_DIAGONAL_COST * Mathf.Min(xDistance, yDistnace) + MOVE_STRAIGHT_COST * reming;
}&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;직선 거리의 값은 10, 대각선의 거리의 값은 14입니다. 이유는 피타고라스 법칙 때문에 대각선은 &amp;radic;2 이기 때문에 14가 되게 됩니다.&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;color: #8cb3be; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; 1. x, y 중 가장 짧은 값은 대각선으로 이동하는 거리가 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8cb3be; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; 2. x. y 의 값을 뺀 후 나온값의 절대값은 직선으로 이동해야하는 거리가 되게 됩니다.&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;그래서 A*는 어떻게 만드는 건가요?&lt;/b&gt;&lt;/span&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;기본적인 내용은 알아보았으니 A*를 직접 구해보도록 합시다. &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;A*는 전체적으로 아래의 일을 반복합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8cb3be; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; 1. 현재 지점에서 갈 수 있는 모든 노드들의 휴리스틱 값을 구한 후 리스트에 넣어줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8cb3be; font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; 2. 리스트에 들어간 값중 fCost가 가장 작은 노드를 꺼내 해당 노드에서 갈 수 있는 모든 노드를 리스트에 넣습니다.&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;아래의 코드는 위에 2가지를 반복하는 코드입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1626357940419&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;while (nextPaths.Count &amp;gt; 0)
{
    PathNode currentNode = GetLowestFCostNode(nextPaths);
    currentNode.obj.GetComponent&amp;lt;Image&amp;gt;().color = Color.green;

    if (currentNode == endNode)
    {
        lastNode = currentNode;
        FindPath(lastNode);
        yield break;
    }

    AddClosePath(currentNode.position);
    nextPaths.Remove(currentNode);

    neighbours = GetNeighbourList(currentNode);

    for (int i = 0; i &amp;lt; neighbours.Count; i++)
    {
        neighbour = neighbours[i];
        if (GetClosePath(neighbour.position) == true) continue;
        int nextGCost = currentNode.gCost + Heuristics(currentNode.position, neighbour.position);
        if (nextGCost &amp;lt; neighbour.gCost)
        {

            neighbour.prevNode = currentNode;
            neighbour.gCost = nextGCost;
            neighbour.hCost = Heuristics(neighbour.position, endPosition);

            if (nextPaths.Contains(neighbour) == false)
            {
                nextPaths.Add(neighbour);
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #f3c000; font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;A*의 단점&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;많은 사람들이 사용하는 A*에도 단점이 존재합니다. 그건은 &lt;b&gt;&lt;span style=&quot;color: #8cb3be;&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;b&gt;&lt;span style=&quot;color: #8cb3be;&quot;&gt;각각의 노드의 휴리스틱의 값&lt;/span&gt;&lt;/b&gt;을 구해야 하고, 그 값을 큐나 리스트에 넣은 뒤 다시 &lt;b&gt;&lt;span style=&quot;color: #8cb3be;&quot;&gt;fCost가 제일 작은 값을 꺼내 탐색&lt;/span&gt;&lt;/b&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 style=&quot;color: #8cb3be;&quot;&gt;&lt;b&gt;JPS 알고리즘&lt;/b&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;간단하게 JPS에 대해 알려드리자면 갈 수 있는 모든 노드를 리스트에 넣는 것이 아닌 현재 노드에서 갈 수 있는 &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;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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;JPS 알고리즘 알아보러 가기&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1626600624333&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Jump Point Search 알고리즘 ( C# 소스코드 )&quot; data-og-description=&quot;Jump Point Search(JPS)를 이용하여 최단 거리를 찾아 봅시다. 실제로 큰 맵을 가진 게임에서 사용되는 JPS 알고리즘에 대해서 알아보도록 하겠습니다. [ 참고 ] 해당 포스팅에는 JPS 알고리즘을 C#으로 &quot; data-og-host=&quot;game-dev.tistory.com&quot; data-og-source-url=&quot;https://game-dev.tistory.com/13?category=1213250&quot; data-og-url=&quot;https://game-dev.tistory.com/13&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bIP6la/hyKU8kYa9o/VaLzKetkuv8Hbl1DyRWhsk/img.png?width=800&amp;amp;height=533&amp;amp;face=0_0_800_533,https://scrap.kakaocdn.net/dn/ONQlu/hyKVlYV91K/kibI0ZEP1ZtlQe4iYgnII1/img.png?width=800&amp;amp;height=533&amp;amp;face=0_0_800_533,https://scrap.kakaocdn.net/dn/bBDi9H/hyKVhCd9Tl/b1bxvPjlxxfBFixEBa7O2K/img.png?width=1280&amp;amp;height=853&amp;amp;face=0_0_1280_853&quot;&gt;&lt;a href=&quot;https://game-dev.tistory.com/13?category=1213250&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://game-dev.tistory.com/13?category=1213250&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bIP6la/hyKU8kYa9o/VaLzKetkuv8Hbl1DyRWhsk/img.png?width=800&amp;amp;height=533&amp;amp;face=0_0_800_533,https://scrap.kakaocdn.net/dn/ONQlu/hyKVlYV91K/kibI0ZEP1ZtlQe4iYgnII1/img.png?width=800&amp;amp;height=533&amp;amp;face=0_0_800_533,https://scrap.kakaocdn.net/dn/bBDi9H/hyKVhCd9Tl/b1bxvPjlxxfBFixEBa7O2K/img.png?width=1280&amp;amp;height=853&amp;amp;face=0_0_1280_853');&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;Jump Point Search 알고리즘 ( C# 소스코드 )&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Jump Point Search(JPS)를 이용하여 최단 거리를 찾아 봅시다. 실제로 큰 맵을 가진 게임에서 사용되는 JPS 알고리즘에 대해서 알아보도록 하겠습니다. [ 참고 ] 해당 포스팅에는 JPS 알고리즘을 C#으로&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;game-dev.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Algorithms/Shortest Path Algorithm</category>
      <category>A*</category>
      <category>Algorithm</category>
      <category>JPS</category>
      <category>Unity</category>
      <category>길 찾기</category>
      <category>알고리즘</category>
      <category>유니티</category>
      <category>최단 거리 탐색</category>
      <category>휴리스틱</category>
      <author>Dev Owen</author>
      <guid isPermaLink="true">https://game-dev.tistory.com/12</guid>
      <comments>https://game-dev.tistory.com/12#entry12comment</comments>
      <pubDate>Thu, 15 Jul 2021 23:18:47 +0900</pubDate>
    </item>
    <item>
      <title>Unity Ml Agent Ray Perception Sensor를 이용해 보자</title>
      <link>https://game-dev.tistory.com/11</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;362&quot; data-filename=&quot;New Unity.jpg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NPdgS/btq8DdRo9kg/6Khc87kNKqhoKqQcAzDLGk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NPdgS/btq8DdRo9kg/6Khc87kNKqhoKqQcAzDLGk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NPdgS/btq8DdRo9kg/6Khc87kNKqhoKqQcAzDLGk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNPdgS%2Fbtq8DdRo9kg%2F6Khc87kNKqhoKqQcAzDLGk%2Fimg.jpg&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;362&quot; data-filename=&quot;New Unity.jpg&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;유니티 ML Agent에 Ray Perception Sensor를 이용해 보자&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 ML Agent에서 제공해주는 Ray Perception Sensor를 이용하여 인공지능을 학습시켜 보도록 하겠습니다.&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;color: #f3c000;&quot;&gt;&lt;b&gt;[ 관련 자료 ]&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ML Agent가 처음이신 분들은 저의 포스팅 중 기본 강의를 보고 오시기 바랍니다&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://game-dev.tistory.com/6&quot;&gt;[ 바로 가기 ]&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;해당 ML-Agent 버전은&lt;span style=&quot;color: #8cb3be;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;2.1.0-exp-1&lt;/span&gt;을 사용하고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;[&amp;nbsp; Sensor를 사용하자 ]&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저희는 이떄까지 인공지능이 학습을 하기 위해 필요한 정보값을 넘겨주기 위해 아래와 같은 함수를 사용했습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1625158133106&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public override void CollectObservations(VectorSensor sensor) { }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 함수를 통하여 각각의 정보를 보내며 인공지능이 학습을 하는데 있어 필요한 정보들을 계속 보내주었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 Sensor를 사용하면 인공지능이 직접 판단하며 정보를 가지게 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 인공지능에 센서를 달아 직접 움직이게 해보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;384&quot; data-origin-height=&quot;363&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEAGhM/btq8A84NLux/n1JetyklWBykkaw12vVTf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEAGhM/btq8A84NLux/n1JetyklWBykkaw12vVTf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEAGhM/btq8A84NLux/n1JetyklWBykkaw12vVTf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEAGhM%2Fbtq8A84NLux%2Fn1JetyklWBykkaw12vVTf1%2Fimg.png&quot; data-origin-width=&quot;384&quot; data-origin-height=&quot;363&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;해당 컨퍼넌트를 추가 시켜줍니다. 그리고 Ray에 인식시킬 Tag를 넣어주시기만 하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나머지는 스크립트에서 보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 스크립트는 간단한 스크립트 입니다. 값으로 이동 시키고 가장 최단거리로 이동시킬 수 있게 움직일떄 마다 값을 Reward를 - 해줬습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1625160207124&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public override void OnActionReceived(ActionBuffers actions)
{
    Vector3 velocity = new Vector3( actions.ContinuousActions[0], 0, actions.ContinuousActions[1]);
    rb.AddForce( velocity, ForceMode.VelocityChange );

    SetReward(-1 / MaxStep);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 적에게 부딧힐 경우 점수 1점을 주게하였습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1625160262971&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private void OnCollisionEnter(Collision other) 
{
    if ( other.gameObject.CompareTag(&quot;Enemy&quot;) ) 
    {
        SetReward( +1 );
        EndEpisode();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 전체 소스코드 입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1625160291251&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.MLAgents;
using Unity.MLAgents.Sensors;
using Unity.MLAgents.Actuators;
public class BlueAgnet : Agent
{
    [ SerializeField ] Rigidbody rb;
    [SerializeField] Transform target;

    public override void OnEpisodeBegin()
    {
        transform.localPosition = new Vector3(0, 1, 0);
        target.localPosition = new Vector3( Random.Range(-6, 6) , 1, Random.Range(-6, 6));

        rb.velocity = Vector3.zero;
    }


public override void OnActionReceived(ActionBuffers actions)
{
    Vector3 velocity = new Vector3( actions.ContinuousActions[0], 0, actions.ContinuousActions[1]);
    rb.AddForce( velocity, ForceMode.VelocityChange );

    SetReward(-1 / MaxStep);
}

private void OnCollisionEnter(Collision other) 
{
    if ( other.gameObject.CompareTag(&quot;Enemy&quot;) ) 
    {
        SetReward( +1 );
        EndEpisode();
    }
}
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 스크립트를 넣어주고 학습을 한 결과 아래와 같은 결과물이 나오게 되었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;490&quot; data-filename=&quot;녹화_2021_07_02_02_20_28_268.gif&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uNOP4/btq8CLt29E4/MdnZQG6nvKZ3PyUe2I7RIk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uNOP4/btq8CLt29E4/MdnZQG6nvKZ3PyUe2I7RIk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uNOP4/btq8CLt29E4/MdnZQG6nvKZ3PyUe2I7RIk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/uNOP4/btq8CLt29E4/MdnZQG6nvKZ3PyUe2I7RIk/img.gif&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;490&quot; data-filename=&quot;녹화_2021_07_02_02_20_28_268.gif&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Sensor라는 컨퍼넌트에 대해서 알게 되었기에 이제 이것을 으용해서 새로운 인공지능을 한 번 만들어 봐야 할 거 같습니다. 간단한것은 Sensor로 어느정도 다 처리가 되기 떄문에 유용하게 사용할 수 있을꺼 같습니다.&lt;/p&gt;</description>
      <category>Unity/ML Agent( AI )</category>
      <category>AI</category>
      <category>MlAgent</category>
      <category>Perception</category>
      <category>ray</category>
      <category>sensor</category>
      <category>Unity</category>
      <category>강의</category>
      <category>센서</category>
      <category>유니티</category>
      <category>인공지능</category>
      <author>Dev Owen</author>
      <guid isPermaLink="true">https://game-dev.tistory.com/11</guid>
      <comments>https://game-dev.tistory.com/11#entry11comment</comments>
      <pubDate>Fri, 2 Jul 2021 02:28:22 +0900</pubDate>
    </item>
  </channel>
</rss>