<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>꼰대 개발자~</title>
    <link>https://dooli98.tistory.com/</link>
    <description>고대 개발자들과 신세대 개발자들 사이의 교량이 되는 글들을 적어 봅니다. (반어법입니다. 꼰대가 아니기 위해노력합니다)</description>
    <language>ko</language>
    <pubDate>Wed, 24 Jun 2026 04:15:37 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Jack4u</managingEditor>
    <image>
      <title>꼰대 개발자~</title>
      <url>https://tistory1.daumcdn.net/tistory/5637279/attach/a6c65a72cc8e487eb11f805505942aa1</url>
      <link>https://dooli98.tistory.com</link>
    </image>
    <item>
      <title>Privacy Policy for Solution4U RemoCon</title>
      <link>https://dooli98.tistory.com/pages/Privacy-Policy-for-Solution4U-RemoCon</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Last updated: January 13, 2026&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;This Privacy Policy describes how Solution4U RemoCon (&quot;we&quot;, &quot;us&quot;, or &quot;our&quot;) collects, uses, and discloses your information when you use our mobile application (the &quot;App&quot;).&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Information Collection and Use&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;We do not collect or store any personal data on external servers.&lt;/b&gt; All data processed by the App is stored locally on your device or transmitted directly to your target devices (TVs) within your local network.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Types of Data Collected&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The App may access and use the following information solely for the purpose of functionality:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Local Network Information&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Wi-Fi Connection Information&lt;/b&gt;: Used to detect if your device is connected to a Wi-Fi network and to identify the local gateway for device discovery.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Device Discovery Data&lt;/b&gt;: We use multicast protocols (SSDP) to find compatible TVs on your local network.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Device Identifiers&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;MAC Address&lt;/b&gt;: The App may request you to manually enter or automatically detect the MAC address of your TV. This information is stored locally on your device to enable the &quot;Wake-on-LAN&quot; (Power On) feature.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;IP Address&lt;/b&gt;: Used to establish a direct connection between your phone and your TV.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Permissions&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The App requires specific permissions to function correctly:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Internet Access (&lt;code&gt;android.permission.INTERNET&lt;/code&gt;)&lt;/b&gt;: Required to communicate with your TV over the local network.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Wi-Fi Multicast (&lt;code&gt;android.permission.CHANGE_WIFI_MULTICAST_STATE&lt;/code&gt;)&lt;/b&gt;: Required to discover devices on your local network.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Nearby Devices (&lt;code&gt;android.permission.NEARBY_WIFI_DEVICES&lt;/code&gt;)&lt;/b&gt;: (Android 13+) Required to discover devices on the local network without needing precise location permission.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Note:&lt;/b&gt; We do &lt;b&gt;not&lt;/b&gt; use these permissions to track your location or collect browsing history.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Data Storage&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;All user preferences and device information (e.g., paired TV IP address, MAC address) are stored strictly on your device using &lt;code&gt;SharedPreferences&lt;/code&gt;. We do not have access to this data, and it is not shared with any third parties.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. Third-Party Services&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The App does not use any third-party analytics or advertising services that collect user data.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. Children's Privacy&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Our App does not address anyone under the age of 13. We do not knowingly collect personally identifiable information from children under 13.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. Changes to This Privacy Policy&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;We may update our Privacy Policy from time to time. Thus, you are advised to review this page periodically for any changes. We will notify you of any changes by posting the new Privacy Policy on this page.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. Contact Us&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;If you have any questions or suggestions about our Privacy Policy, do not hesitate to contact us at:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Email: &lt;a href=&quot;mailto:jack.kim95@gmail.com&quot;&gt;jack.kim95@gmail.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>Jack4u</author>
      <guid isPermaLink="true">https://dooli98.tistory.com/pages/Privacy-Policy-for-Solution4U-RemoCon</guid>
      <pubDate>Tue, 13 Jan 2026 01:03:13 +0900</pubDate>
    </item>
    <item>
      <title>[Algorithm] n번째 완전 거듭제곱수 구하기</title>
      <link>https://dooli98.tistory.com/59</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;[문제] 1, 4, 8, 9, 16, 25, 27, 32, 36, 49, 64...와 같은 어떤수의 거듭제곱으로 만들어진 수들이 정렬되어 있을때 n번째 거듭제곱수를 구하시오&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; 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;table style=&quot;color: #666666; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #9b9b9b; color: #ffffff;&quot;&gt;n&lt;/td&gt;
&lt;td style=&quot;background-color: #9b9b9b; color: #ffffff;&quot;&gt;answer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #dcdddd;&quot;&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #dcdddd;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;background-color: #f0f0f0;&quot;&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #dcdddd;&quot;&gt;5&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #dcdddd;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;background-color: #f0f0f0;&quot;&gt;25&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;완전 거듭제곱수는 m^k으로 이루어진 수이다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1730662427248&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1 = 1^k
4 = 2^2
8 = 2^3
9 = 3^2
16= 4^2
25 = 5^2
27 = 3^3
...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이문제는 특별한 규칙이 없으므로 모든수를 구하고 순서를 정하자.&lt;/p&gt;
&lt;pre id=&quot;code_1730664791391&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;long long nth_perfect_power(int n){
    if(n == 1) return 1;
    
    auto limit = 1e10;
    
    set&amp;lt;long long&amp;gt; powers;
    for(long long m = 2; m * m &amp;lt; limit; m++){
        long long power = m * m;
        while(power &amp;lt; limit){
            powers.insert(power);
            power *= m;
        }
    }
        
    auto it = powers.begin();
    std::advance(it, n-2);
    return *it;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 소스는 퍼포먼스에 문제가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;set은 고성능으로 sorting된 형태로 저장하지만 위와 같은 소스에서는 set으로 인하여 탐색과 삽입을 수십만번 반복함으로써 성능상의 문제가 발생합니다.하여 저장시에는 저장만하고 마지막에 한번 sorting하는 방식으로 바꿔봅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1730665535785&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;long long nth_perfect_power2(int n){
    if(n == 1) return 1;
    
    auto limit = 1e10;
    
    vector&amp;lt;long long&amp;gt; powers;
    for(long long m = 2; m * m &amp;lt; limit; m++){
        long long power = m * m;
        while(power &amp;lt; limit){
            powers.push_back(power);
            power *= m;
        }
    }
    
    std::sort(powers.begin(), powers.end());
    return powers[n-2];
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>programming</category>
      <category>algorithm</category>
      <category>perfect power</category>
      <category>완전거듭제곱수</category>
      <category>완전제곱수</category>
      <author>Jack4u</author>
      <guid isPermaLink="true">https://dooli98.tistory.com/59</guid>
      <comments>https://dooli98.tistory.com/59#entry59comment</comments>
      <pubDate>Mon, 4 Nov 2024 05:25:41 +0900</pubDate>
    </item>
    <item>
      <title>[Algorithm] n개의 박스에서 k개를 골라 n명에서 공평하게 나눠주기</title>
      <link>https://dooli98.tistory.com/58</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;[문제] n개의 박스가 있고 각각 1,2,3,4,...n개의 사과가 들어 있다. 이때 k개의 박스를 골라서 n명에서 공평하게 나눠줄있는 k개의 박스 목록을 출력하세요.&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;답변 예시&lt;/p&gt;
&lt;table style=&quot;color: #666666; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #9b9b9b; color: #ffffff; width: 9.30233%;&quot;&gt;(n,k)&lt;/td&gt;
&lt;td style=&quot;background-color: #9b9b9b; color: #ffffff; width: 22.3257%;&quot;&gt;apple box&lt;/td&gt;
&lt;td style=&quot;background-color: #9b9b9b; color: #ffffff; width: 18.1977%;&quot;&gt;answer&lt;/td&gt;
&lt;td style=&quot;background-color: #9b9b9b; color: #ffffff; width: 50.0581%;&quot;&gt;note&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #dcdddd; width: 9.30233%;&quot;&gt;(3,3)&lt;/td&gt;
&lt;td style=&quot;width: 22.3257%;&quot;&gt;[1,2,3]&lt;/td&gt;
&lt;td style=&quot;width: 18.1977%;&quot;&gt;[1,2,3]&lt;/td&gt;
&lt;td style=&quot;width: 50.0581%;&quot;&gt;sum = 6 / 3 = 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #dcdddd; width: 9.30233%;&quot;&gt;&lt;span style=&quot;background-color: #dcdddd; color: #666666; text-align: start;&quot;&gt;(3,1)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f0f0f0; width: 22.3257%;&quot;&gt;[1,2,3]&lt;/td&gt;
&lt;td style=&quot;background-color: #f0f0f0; width: 18.1977%;&quot;&gt;[3]&lt;/td&gt;
&lt;td style=&quot;background-color: #f0f0f0; width: 50.0581%;&quot;&gt;sum = 3 / 3 = 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #dcdddd; width: 9.30233%;&quot;&gt;&lt;span style=&quot;background-color: #dcdddd; color: #666666; text-align: start;&quot;&gt;(3,2)&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 22.3257%;&quot;&gt;&lt;span style=&quot;background-color: #f0f0f0; color: #666666; text-align: start;&quot;&gt;[1,2,3]&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 18.1977%;&quot;&gt;[1,2]&lt;/td&gt;
&lt;td style=&quot;width: 50.0581%;&quot;&gt;&lt;span style=&quot;background-color: #f0f0f0; color: #666666; text-align: start;&quot;&gt;sum = 3 / 3 = 1&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #dcdddd; width: 9.30233%;&quot;&gt;(11,2)&lt;/td&gt;
&lt;td style=&quot;background-color: #f0f0f0; width: 22.3257%;&quot;&gt;&lt;span style=&quot;background-color: #f0f0f0; color: #666666; text-align: start;&quot;&gt;[1,2,3,4,5,6,7,8,9,10,11]&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f0f0f0; width: 18.1977%;&quot;&gt;[1,10]&lt;/td&gt;
&lt;td style=&quot;background-color: #f0f0f0; width: 50.0581%;&quot;&gt;sum = 11 / 11 = 1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이문제 지난 포스트에 있는 &lt;a href=&quot;https://dooli98.tistory.com/33&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;C++ 미로찾기(graph traversal)&lt;/a&gt; 을 참조하면 조금더 쉽다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;미로찾기와 같이 2차원 그래프가 아니고 단방향 1차원이므로 tree 탐색의 문제다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 중복없는 4개의 상자를 중복없는 조합으로 골라보자&lt;/p&gt;
&lt;pre id=&quot;code_1730660285116&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void find_boxes(int n, int start, vector&amp;lt;int&amp;gt; &amp;amp; selected){
    cout &amp;lt;&amp;lt; join_str(selected) &amp;lt;&amp;lt; endl;

    for(int i=start;i&amp;lt;n;i++){
        selected.push_back(i+1);
        find_boxes(n, i+1, selected);
        selected.pop_back();
    }
}

void select_boxes(int n){
    vector&amp;lt;int&amp;gt; selected;
    find_boxes(n,0,selected);
}

void apple_box(){
    select_boxes(4);
}

// result
{}
{1}
{1,2}
{1,2,3}
{1,2,3,4}
{1,2,4}
{1,3}
{1,3,4}
{1,4}
{2}
{2,3}
{2,3,4}
{2,4}
{3}
{3,4}
{4}
{2}
{2,3}
{3}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오른쪽으로 상자하나씩 열어보고 마지막상자를 열어봤으면 이전 상자로 돌아가서 다음상자를 열어본다. 이름 트리로 그려보다 다음과 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1730661185374&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;&amp;gt;--------------|-------|---|
1-------|---|   2---|   3   4
2---|   3   4   3   4   4
3   4   4       4
4&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;결국은 깊이가 k이고 apple의 총합이 나머지가 남지 않으면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;최종소스는&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1730661647387&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool find_boxes(int n, int k, int start, int sum, vector&amp;lt;int&amp;gt; &amp;amp; selected){
    if(selected.size() == k){
        if(sum % n == 0){
            return true;
        }
        return false;
    }

    for(int i=start;i&amp;lt;n;i++){
        selected.push_back(i+1);
        if(find_boxes(n, k, i+1, sum + (i+1), selected))
            return true;
        selected.pop_back();
    }
    return false;
}

void select_boxes(int n, int k){
    vector&amp;lt;int&amp;gt; selected;
    find_boxes(n, k, 0, 0, selected);
    cout &amp;lt;&amp;lt; &quot;result = &quot; &amp;lt;&amp;lt; join_str(selected) &amp;lt;&amp;lt; endl;
}

int main(int argc, char * argv[]){
    select_boxes(4, 2);
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>programming</category>
      <category>algorithm</category>
      <category>Tree Search</category>
      <author>Jack4u</author>
      <guid isPermaLink="true">https://dooli98.tistory.com/58</guid>
      <comments>https://dooli98.tistory.com/58#entry58comment</comments>
      <pubDate>Mon, 4 Nov 2024 02:15:31 +0900</pubDate>
    </item>
    <item>
      <title>[Algorithm] 연속된 숫자열에서 n번째 문자 알아내기</title>
      <link>https://dooli98.tistory.com/57</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;[문제] 1부터 숫자가 연속된 문자열(12345678910111213...)이 있을때 n번째 숫자는 뭘까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;답변 예시&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 26.8605%; height: 94px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;n&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;answer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;9&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;10&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;11&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. 단순무식한 효율무시 알고리즘&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아주 단순히 생각해 보면 연속된 문제열을 만드는것은 쉽고 문자열을 만든후 n번 문자를 찾는 알고리즘을 구현해 보겠다.&lt;/p&gt;
&lt;pre id=&quot;code_1730626662584&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int num_of_pos_1(int n){
    string str;
    for(auto i=1;i&amp;lt;=n;i++){
        str += std::to_string(i);
        if(str.length() &amp;gt; n){
            break;
        }
    }
    return str[n-1] - '0';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n이 늘어 나면 늘어 날수록 memory와 cpu비용이 함께 증가하는 아주 안좋은 알고리즘 되겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;int to string역시 O(n)이므로 사실상의 시간 복잡도는 O(n^n)이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;그러나&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 아키텍처 적으로 플어본다면 문자열 str은 상수와가 가능하고 상수화하고 n번째 문자를 찾는다면 결국은 O(1)의 완벽한 알고리즘이된다. 상황과 시스템에 따라서 이런 알고리즘도 상당한 퍼포먼스를 발휘할수도 있다. 만약 str을 생성하는 문제가 복잡하고 수식으로 계산하기 힘든경우에는 웜업시간에 str을 생성하고 매 요청때마다 결과를 도출하는것도 사실상 더 많이 쓰이는 방법되겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 알고리즘만 연구하시는 분들은 최적의 공간/시간 복잡도를 추구하므로 최적의 공간/시간 복잡도를 가지는 알고리즘을 연구해보자!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 수치해석적 알고리즘&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 일단 문제를 해결하기 위해서 규칙을 찾아내야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 문자열을 만드는 숫자를 &quot;k&quot;라고 하고 요구하는 위치값을 &quot;n&quot;이라하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- k의 자릿수를 digit이라하자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 각 digit별 자리수 count(digit) = 9 * 10 ^ (digit-1) 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 정의에 의해서 n의 변위 N을 구해보면 아래와 같다&lt;/p&gt;
&lt;pre id=&quot;code_1730647615787&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;k(digit, k범위) = N(digit, n의 범위)

k(1, {1...9}) = N(1, {1, 2, 3...9})
k(2, {10..99}) = N(2, {10,11,12,13,...,188,189})
k(3, {100...999}) = N(3, {190,191,192,...,2887, 2888, 2889})&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;digit 구하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 분석에 의거하여 digit은 N(digit)안에 있다이다.&lt;/p&gt;
&lt;pre id=&quot;code_1730647778736&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;시작 N(digit) &amp;lt;= n &amp;lt;= 종료 N(digit)&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;이 규칙에 의거하여 digit값을 구해보자&lt;/p&gt;
&lt;pre id=&quot;code_1730647920399&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int digit(int n){
    int digit = 1;
    int count = 9;
    int end = 9;
    while(n &amp;gt; end){
        digit++;
        count *= 10;
        end += count * digit;
    }
    return digit;
}&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;각 digit별 count(digit)는 9 * 10 ^ (digit-1)이라는점에 착안하여 구지 end라는 변수가 필요할까 고민해 본다.&lt;/p&gt;
&lt;pre id=&quot;code_1730648535346&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int digit2(int n){
    int digit = 1;
    int count = 9;
    while(n &amp;gt; digit * count){
        n -= digit * count;
        digit++;
        count *= 10;
    }
    return digit;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;k 구하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;k의 digit별 시작값 Ks(digit) = 10 ^ (digit-1) 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시작값을 구했는데 변화량은 어떻게 구할까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;약간 정규화 해보자. &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;각 구간별로 시작값으로 n값을 빼면 모두 0부터 시작한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1730650147913&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;n: (1, 2, 3...9) - 1 = N(0, 1, 2,...,8) 
n: (10, 11, 12, 13,...,188,189) - 10 = N(0, 1 ,2, 3,...,178, 179)
n: (190, 191, 192,...,2887, 2888, 2889) - 190 = N(0, 1 ,2,...,2697, 2698, 2699)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국은 n - Ks(digit)이 변화량이다. 이를 digit으로 나누면 k의 변화량이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 Ns(digit) = Ns(1) + ... + Ns(digit)을 구해보자&lt;/p&gt;
&lt;pre id=&quot;code_1730649848548&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int nstart(int digit){
    int ns = 1;
    int count = 9;
    for(int i=0;i&amp;lt;digit-1;i++){
        ns += count * (i + 1);
        count *= 10;
    }
    return ns;
}&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;이를 이용해서 k값을 구하면&lt;/p&gt;
&lt;pre id=&quot;code_1730652176029&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int cal_k(int n){
    int digit = digit2(n);
    return (int)pow(10, digit-1) + (int)(n - nstart(digit))/digit;
}&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;결국 위와 같이 필요한 변수값들을 구해봤는데 각각의 알고리즘은 digit으로 묶여 있기 때문에 결국은 하나로 합쳐진다.&lt;/p&gt;
&lt;pre id=&quot;code_1730652883559&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int cal_k2(int n){
    int digit = 1;
    int count = 9;
    int ks = 1;
    while(n &amp;gt; digit * count){
        n -= digit * count;
        digit++;
        count *= 10;    // 9 * 10 ^ (digit - 1)
        ks *= 10;       // 10 ^ (digit - 1)
    }
    
    // n이 결국은 ns로 부터의 변화량값임 ( 0부터 시작하도록 -1을 해준다 )
    return ks + (n - 1)/digit;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;n번째 숫자구하기 (결론)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 위와 같이 필요한 변수값들을 구해봤는데 각각의 알고리즘을 구성해 봤는데 이를 하나로 합쳐보겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1730652388100&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int num_of_pos_2(int n){
    int digit = 1;
    int count = 9;
    int ks = 1;
    while(n &amp;gt; digit * count){
        n -= digit * count;
        digit++;
        count *= 10;    // 9 * 10 ^ (digit - 1)
        ks *= 10;       // 10 ^ (digit - 1)
    }
    
    // n이 결국은 ns로 부터의 변화량값임 ( 0부터 시작하도록 -1을 해준다 )
    int k = ks + (n - 1)/digit;
    return std::to_string(k)[(n-1)%digit] - '0';
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>programming</category>
      <category>algorithm</category>
      <author>Jack4u</author>
      <guid isPermaLink="true">https://dooli98.tistory.com/57</guid>
      <comments>https://dooli98.tistory.com/57#entry57comment</comments>
      <pubDate>Mon, 4 Nov 2024 02:10:21 +0900</pubDate>
    </item>
    <item>
      <title>[Essay] 꼰대 개발자의 리더쉽</title>
      <link>https://dooli98.tistory.com/54</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 꼰대 개발자들은 &quot;하라는데로 해&quot;와 &quot;나만이 할 수 있어&quot;, &quot;니가 하는것 보다는 내가 빨라&quot;, &quot;내가 하는것이 낮지&quot;, &quot;주니어들은 쓸데가 없어&quot;, &quot;요즘 쓸만한 개발자들이 없어&quot;라는 말속에서 팀원들의 역량 향상을 통한 팀의 역량 향상 나아가 회사의 팀의 역량 강화로인한 비즈니스의 성공에는 관심이 없는듯하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨텍스트 공유와 기술적 업무지시 보다는 &quot;내가 하고 말지&quot;라는 자세가 많아지는듯하다. 사실상 요즘은 업무지시나 업무지시 불이행에 대한 쪼족한 방법도 없는것도 사실이긴 하다. 꼰대 개발자 입장에서는 컨텍스트 독점을 통한 생명력 확장은 짧게 나마 업계에서 살아남는 하나의 전략인것 같기도 하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;과거에는 경력과 리더쉽은 비례하던 시기가 있었다. 상명하복의 문화와 단정된 공유속에서 경험은 무엇보다도 우선시 되었으며 컨텍스트 독점은 긴 호봉상승과 경제적 안정감을 주던 시기가 있었다. 문제는 아직도 이 꼰대 문화와 관습에서 벗어나지 못한 꼰대들이 많이 있다는것이 문제다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요즘은 상명하복의 시대도 아니며 수 많은 오픈소스들과 블로그들은 오히려 꼰대들보다 더 많은 정보와 지식을 공유해주고 있다 또한 비즈니스는 시시각각 변하고 순식간에 흥망성쇠하고 있다. 이 상황에서 컨텍스트 독점 또한 직장내 안정감을 줄 수 없는 상황이 되었다. 또한 요즘은 정확히 &quot;중간&quot;지점의 &quot;업무지시&quot;, &quot;코칭&quot;, &quot;업무평가&quot;등이 아니면 생계를 위협 할 만큼 큰 문제를 만들어 내기도 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 문제들은 현재의 &quot;리더쉽 부족&quot;의 문제를 야기시켰고 &quot;꼰대 개발자&quot;들을 찾는 계기가 되었지만 &quot;꼰대 개발자&quot;들은 현대의 리더쉽에 대해 준비가 되어 있지 않다. 그나마 살아남는 꼰대들은 팀원들에게는 허드렛일 시키고 자기가 밤을세워서 혼자 다 처리하는 행태를 보이고 있다. 이때문에 작금의 스타트업들은 시니어 보충에도 불구하고 캐파부족에 시달리고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;427&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Bn1mj/btsKl6gE9nR/WQZjKdwg6nFcboHYTsqoK1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Bn1mj/btsKl6gE9nR/WQZjKdwg6nFcboHYTsqoK1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Bn1mj/btsKl6gE9nR/WQZjKdwg6nFcboHYTsqoK1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBn1mj%2FbtsKl6gE9nR%2FWQZjKdwg6nFcboHYTsqoK1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;550&quot; height=&quot;427&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;427&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;우리 꼰대 개발자들이 살아 남는 방법은 &lt;b&gt;&quot;부족한 리더쉽&quot;&lt;/b&gt;에 도전하는길 뿐이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 위해 아래의 행동지침에 대해 제안해 볼까한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 문제의 해결책은 시니어인 내가 중심이 되어야한다는 생각을 버려라
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위에도 얘기 했지만 요즘은 인터넷과 유튜브, 인강등을 통한 충분한 공유가 이루워 지고 있다. 나 한사람의 검색보다는 팀원 전체의 지식 검색이 더 효육적이며 아직은 고정되지 않는 주니어 / 중니어들의 아이디어가 빛날때가 더 많다는것을 인정해라&lt;/li&gt;
&lt;li&gt;끝까지 문제 해결에 대해 독려하고 지지해라. 업무와 기술에 대해 이해시키려는 노력은 부족해서는 안된다.&lt;/li&gt;
&lt;li&gt;문제에 대해 경험을 공유하고 방향성을 스스로 찾도록 해라. 그들이 부족한것은 경험뿐이다. 부족한것을 채워주는것이 리더의 역할이다.&lt;/li&gt;
&lt;li&gt;자신이 틀린것을 부끄러워하지 마라 - 자신이 틀린것을 리더쉽이 도전받는다고 생각하는 꼰대들이 많은듯하다. 다시한번 얘기하지만 지금은 MZ들이 검색과 지식 수용이 당신들 보다 100배는 빠르다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;컨텍스트를 수시로 공유하고 코칭해라
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;팀내 일어나고 있는 모든것들은 팀원들과 공유하는것을 게을리 하지 마라 - 팀웍의 최대 걸림돌인 컨텍스트 독점의 문제를 막을 수있다.&lt;/li&gt;
&lt;li&gt;각 팀원들이 하고 있는 일에 대해 철저히 공유받고 파악하는 일은 선택이 아니라 필수다 - 매일매일 대화를 해도 서로의 생각은 계속해서 달라지고 얼라인이 틀어지게 된다. 얼라인을 계속해서 맞추고 방향성을 잡아나가는것이 리더쉽의 기초다.&lt;/li&gt;
&lt;li&gt;팀원들의 컨텍스트 파악은 그들의 경험부족을 매꿔줄 수 있는 기회를 제공한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;일주일 단위의 스프린트회의로는 부족하다 매일 매일해라.&lt;/li&gt;
&lt;li&gt;주기적으로 1:1 대화를 해라.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;가지고 있는 모든것을 전수해라
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;이건 나만이 가진 기술인데&quot;라는 생각이 당신을 꼰대로 만드는 지름길이다.&lt;/li&gt;
&lt;li&gt;비워야 새로운것을 배울 수 있다. 새로운것을 배우고 새로운 트렌트를 따라잡는 노력을 게을리 하지마라.&lt;/li&gt;
&lt;li&gt;나만의 기술이라도 나누면 더욱 발전한다. 나누고 공유하고 토론해라.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;마음을 나누는것은 가족과 친구와 해라
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리더쉽은 &quot;공감&quot; 보다는 &quot;일관성&quot;에서 나온다.&lt;/li&gt;
&lt;li&gt;편애는 팀웍에 심각한 상처를 입힌다.&lt;/li&gt;
&lt;li&gt;마음을 나누더라도 업무에 있어서 &quot;일관성&quot;은 어떻게든 지켜라 - 그래서 친해지만 일관성을 잃을 수 있다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;&quot;팔로워쉽&quot;&lt;/b&gt;에 대해 얘기해 볼까한다.&lt;/p&gt;</description>
      <category>essay</category>
      <category>리더쉽</category>
      <category>팔로워쉽</category>
      <author>Jack4u</author>
      <guid isPermaLink="true">https://dooli98.tistory.com/54</guid>
      <comments>https://dooli98.tistory.com/54#entry54comment</comments>
      <pubDate>Fri, 25 Oct 2024 18:14:04 +0900</pubDate>
    </item>
    <item>
      <title>[AI] Image-To-Image AI Model (옷갈이 입히기) 소개</title>
      <link>https://dooli98.tistory.com/53</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;아주 깔끔하게 옷갈아 입히는 AI Model입니다. 이제 쇼핑몰에서도 자기 자신의 이미지에 옷을 입혀보고 구입하는 시대가 오겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://huggingface.co/spaces/levihsu/OOTDiffusion&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://huggingface.co/spaces/levihsu/OOTDiffusion&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-24 오후 5.57.32.png&quot; data-origin-width=&quot;2530&quot; data-origin-height=&quot;1364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfmgAR/btsH84NJaTf/9IqpnCPkZSBIx0dhBiohvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfmgAR/btsH84NJaTf/9IqpnCPkZSBIx0dhBiohvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfmgAR/btsH84NJaTf/9IqpnCPkZSBIx0dhBiohvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfmgAR%2FbtsH84NJaTf%2F9IqpnCPkZSBIx0dhBiohvK%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;2530&quot; height=&quot;1364&quot; data-filename=&quot;스크린샷 2024-06-24 오후 5.57.32.png&quot; data-origin-width=&quot;2530&quot; data-origin-height=&quot;1364&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ai</category>
      <category>Ai</category>
      <category>Image-to-Image</category>
      <category>itoi</category>
      <author>Jack4u</author>
      <guid isPermaLink="true">https://dooli98.tistory.com/53</guid>
      <comments>https://dooli98.tistory.com/53#entry53comment</comments>
      <pubDate>Mon, 24 Jun 2024 18:00:46 +0900</pubDate>
    </item>
    <item>
      <title>[AI] Text To Image AI Model 소개</title>
      <link>https://dooli98.tistory.com/52</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Hugging Face에 상당히 좋은 품질고 성능의 AI Model이 있어서 소개합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://huggingface.co/ByteDance/SDXL-Lightning&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://huggingface.co/ByteDance/SDXL-Lightning&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1719218816368&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;ByteDance/SDXL-Lightning &amp;middot; Hugging Face&quot; data-og-description=&quot;SDXL-Lightning SDXL-Lightning is a lightning-fast text-to-image generation model. It can generate high-quality 1024px images in a few steps. For more information, please refer to our research paper: SDXL-Lightning: Progressive Adversarial Diffusion Distill&quot; data-og-host=&quot;huggingface.co&quot; data-og-source-url=&quot;https://huggingface.co/ByteDance/SDXL-Lightning&quot; data-og-url=&quot;https://huggingface.co/ByteDance/SDXL-Lightning&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/llYDJ/hyWoHXL9nx/BZ9IWKgkaKU70ABCu75be0/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/MdG2R/hyWrOgE3K1/mZUnOpWpfUs7fkJlDcmNq1/img.jpg?width=3324&amp;amp;height=1454&amp;amp;face=2976_571_3137_742,https://scrap.kakaocdn.net/dn/bOdQTs/hyWoCa6Cmy/ecqEiERWg4dOcLw8NMya31/img.jpg?width=3328&amp;amp;height=1438&amp;amp;face=2995_546_3109_670&quot;&gt;&lt;a href=&quot;https://huggingface.co/ByteDance/SDXL-Lightning&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://huggingface.co/ByteDance/SDXL-Lightning&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/llYDJ/hyWoHXL9nx/BZ9IWKgkaKU70ABCu75be0/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648,https://scrap.kakaocdn.net/dn/MdG2R/hyWrOgE3K1/mZUnOpWpfUs7fkJlDcmNq1/img.jpg?width=3324&amp;amp;height=1454&amp;amp;face=2976_571_3137_742,https://scrap.kakaocdn.net/dn/bOdQTs/hyWoCa6Cmy/ecqEiERWg4dOcLw8NMya31/img.jpg?width=3328&amp;amp;height=1438&amp;amp;face=2995_546_3109_670');&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;ByteDance/SDXL-Lightning &amp;middot; Hugging Face&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;SDXL-Lightning SDXL-Lightning is a lightning-fast text-to-image generation model. It can generate high-quality 1024px images in a few steps. For more information, please refer to our research paper: SDXL-Lightning: Progressive Adversarial Diffusion Distill&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;huggingface.co&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;demo : &lt;a href=&quot;https://huggingface.co/spaces/ByteDance/SDXL-Lightning&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://huggingfac&lt;/a&gt;&lt;a href=&quot;https://huggingface.co/spaces/ByteDance/SDXL-Lightning&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;e.co/spaces/ByteDance/SDXL-Lightning&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1719218838626&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;SDXL-Lightning - a Hugging Face Space by ByteDance&quot; data-og-description=&quot;Running on Zero&quot; data-og-host=&quot;huggingface.co&quot; data-og-source-url=&quot;https://huggingface.co/spaces/ByteDance/SDXL-Lightning&quot; data-og-url=&quot;https://huggingface.co/spaces/ByteDance/SDXL-Lightning&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ruQmn/hyWoJacH7j/A7SrVDzma7Spf1LnkuMrf0/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648&quot;&gt;&lt;a href=&quot;https://huggingface.co/spaces/ByteDance/SDXL-Lightning&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://huggingface.co/spaces/ByteDance/SDXL-Lightning&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ruQmn/hyWoJacH7j/A7SrVDzma7Spf1LnkuMrf0/img.png?width=1200&amp;amp;height=648&amp;amp;face=0_0_1200_648');&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;SDXL-Lightning - a Hugging Face Space by ByteDance&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Running on Zero&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;huggingface.co&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;demo site에서 text만으로 image를 생성하는 경험을 해보세요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-24 오후 5.51.29.png&quot; data-origin-width=&quot;1354&quot; data-origin-height=&quot;1384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XYYFb/btsIa30Ta2d/JN5ltkmZrDYDOUhSUTC0q0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XYYFb/btsIa30Ta2d/JN5ltkmZrDYDOUhSUTC0q0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XYYFb/btsIa30Ta2d/JN5ltkmZrDYDOUhSUTC0q0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXYYFb%2FbtsIa30Ta2d%2FJN5ltkmZrDYDOUhSUTC0q0%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;1354&quot; height=&quot;1384&quot; data-filename=&quot;스크린샷 2024-06-24 오후 5.51.29.png&quot; data-origin-width=&quot;1354&quot; data-origin-height=&quot;1384&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>ai</category>
      <category>Ai</category>
      <category>ai generation</category>
      <category>text-to-image</category>
      <category>TTI</category>
      <author>Jack4u</author>
      <guid isPermaLink="true">https://dooli98.tistory.com/52</guid>
      <comments>https://dooli98.tistory.com/52#entry52comment</comments>
      <pubDate>Mon, 24 Jun 2024 17:52:24 +0900</pubDate>
    </item>
    <item>
      <title>[Algorithm] C++ 뒤집어도 같은 숫자(palindrome) 판별하기</title>
      <link>https://dooli98.tistory.com/48</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;123454321, 46864와 같이 뒤집어도 같은 것을 palindrome이라 합니다. 이런 palindrome을 판별하기 위한 최적의 알고리즘에 대해 고찰해 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4qsgC/btsjWsdjmFk/1z3N9Wx0KA56Ti8WRNhJCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4qsgC/btsjWsdjmFk/1z3N9Wx0KA56Ti8WRNhJCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4qsgC/btsjWsdjmFk/1z3N9Wx0KA56Ti8WRNhJCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4qsgC%2FbtsjWsdjmFk%2F1z3N9Wx0KA56Ti8WRNhJCk%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;600&quot; height=&quot;300&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단히 바로 생각나는 알고리즘은&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;숫자를 문자열로 바꾼다.&lt;/li&gt;
&lt;li&gt;문자열을 뒤집는다.&lt;/li&gt;
&lt;li&gt;두 문자열을 비교한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1686746174983&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool is_palindrome(const string &amp;amp; str){
    auto copy = str;
    std::reverse(copy.begin(), copy.end());
    return copy == str;
}

bool is_palindrome_str(int data){
    return is_palindrome(std::to_string(data));
}

int main(int argc, const char * argv[]) {
    vector&amp;lt;int&amp;gt; data = { 987654, 1234321, 456789, 102979201 };
    for(int i=0;i&amp;lt;data.size();i++){
        cout &amp;lt;&amp;lt; data[i];
        if(is_palindrome_str(data[i])){
            cout &amp;lt;&amp;lt; &quot; is palindrome&quot;;
        } else {
            cout &amp;lt;&amp;lt; &quot; is NOT palindrome&quot;;
        }
        cout &amp;lt;&amp;lt; endl;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;OUTPUT:&lt;br /&gt;987654 is NOT palindrome&lt;br /&gt;1234321 is palindrome&lt;br /&gt;456789 is NOT palindrome&lt;br /&gt;102979201 is palindrome&lt;br /&gt;&lt;br /&gt;PEFORMANCE (1,000 times for 1234321) :&amp;nbsp; 113 milliseconds&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드의 문제점은 무거운 memory allocation과 swap이 일어난다는것이고 1만번만 반복해도 1초라는 어마어마한 퍼포먼스를 사용하는 아주 안좋은 알고리즘 되겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;memory access를 최대한 줄이고 시간복잡도도 1/2로 줄여보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알고리즘&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;왼쪽부터 1씩 증가하는 i번째 문자와 오른쪽 부터 1씩 감소하는 j번째 문자와 비교한다.&lt;/li&gt;
&lt;li&gt;만약 다르다면 false를 리턴한다.&lt;/li&gt;
&lt;li&gt;i &amp;gt;= j 같다면 true을 리턴한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1686746941269&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool is_palindrome(const string &amp;amp; str){
    for(size_t i=0,j=str.length()-1; i &amp;lt; j; i++, j--){
        if(str[i] != str[j])
            return false;
    }
    return true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;OUTPUT:&lt;br /&gt;987654 is NOT palindrome&lt;br /&gt;1234321 is palindrome&lt;br /&gt;456789 is NOT palindrome&lt;br /&gt;102979201 is palindrome&lt;br /&gt;&lt;br /&gt;PEFORMANCE (1,000 times for 1234321) :&amp;nbsp; 81 milliseconds&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;memory allocation과 swap을 제거하여 상당부분 퍼포먼스를 개선하였다. Search도 딱 N/2만 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 string전환으로인한 memory access문제의 개선은 불가하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;input이 숫자라는 단서에 착안하여 memory access자체를 제거해 보자&lt;/p&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;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;reverse 변수를 0으로 초기화&lt;/li&gt;
&lt;li&gt;reverse 변수에 10을 곱해준다. ( 왼쪽으로 이동 )&lt;/li&gt;
&lt;li&gt;reverse 변수 입력값을 10으로 나눈 나머지를 더해준다. (마지막 숫자)&lt;/li&gt;
&lt;li&gt;입력값을 10으로 나눠서 저장한다. ( 마지막 숫자 제거 )&lt;/li&gt;
&lt;li&gt;입력값이 0이면 중단하고 아니라면 2번을 반복한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1686747440962&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int reverse(int data){
    int reverse = 0;
    while(data &amp;gt; 0){
        reverse *= 10;
        reverse += data % 10;
        data /= 10;
    }
    return reverse;
}

bool is_palindrome(int data){
    return reverse(data) == data;
}&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;OUTPUT:&lt;br /&gt;987654 is NOT palindrome&lt;br /&gt;1234321 is palindrome&lt;br /&gt;456789 is NOT palindrome&lt;br /&gt;102979201 is palindrome&lt;br /&gt;&lt;br /&gt;PEFORMANCE (1,000 times for 1234321) :&amp;nbsp; 16&amp;nbsp;milliseconds&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1번 예제에 비하여 1/10로 실행시간이 줄었다. 이유는 compiler는 계속된 연산이기 때문에 memory 접근을 최소화하고 register단에서 연산을 마무리하기 때문에 상당히 빠르다.&lt;/p&gt;</description>
      <category>programming</category>
      <category>algorithm</category>
      <category>palindrome</category>
      <author>Jack4u</author>
      <guid isPermaLink="true">https://dooli98.tistory.com/48</guid>
      <comments>https://dooli98.tistory.com/48#entry48comment</comments>
      <pubDate>Tue, 13 Jun 2023 17:03:09 +0900</pubDate>
    </item>
    <item>
      <title>OSI 7 Layer Network Model</title>
      <link>https://dooli98.tistory.com/46</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;OSI 7 Layer Model은 70-80년대 ISO 표준 국제 기구에서 OSI Model (&lt;span style=&quot;background-color: #ffffff; color: #202122; text-align: start;&quot;&gt;Open Systems Interconnection Reference Model)이라는 정식 명칙으로 만들어진 고~~~대의 통신 모델입니다. 수십년이 지난 지금도 표준모델로써의 역할을 활발히 하고 있지요.&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;background-color: #ffffff; color: #202122; text-align: start;&quot;&gt;그런데 왜? 이 고대의 표준모델을 가지고 왔느냐?&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;추상화의 이해
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요즘 추상화를 통해서 의존도를 줄이는 개발방법론들 아키텍쳐들( DDD, Clean Architecture등) 이 쏟아져 나오고 있죠. 이 추상화 기법들이 OSI의 기본 개념들로부터 이해하면 좀더 쉬운 이해가 될수있습니다.&lt;/li&gt;
&lt;li&gt;OSI는 인프라부터 응용영역까지 어떻게 추상화하여 단순화해 나아가고 하위 계측에 대한 의존도를 줄이는지는 아주 적절히 표현하고 있습니다.&lt;/li&gt;
&lt;li&gt;DDD와 Clean Architecture의 기본개념도 의존도의 방향에 대해 강하게 어필하는것 처럼 OSI도 의존도에 대한 계측과 방향이 중요합니다.&lt;/li&gt;
&lt;li&gt;지난 수십년간의 tcp, upd, http등의 구현물들을 보면 추상화에 대한 수많은 기법들을 손쉽게 배울 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;통신 패러다임의 이해
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요즘 MSA의 등장으로 HTTP가 통신의 기본처럼 되었지만 사실은 HTTP의 하위 layer가 존재하고 http는 이 하위 레이어들의 구현으로 이루어 진다는걸 알면 보안, 압축, 퍼포먼스등에 좀더 빠르게 대응이 가능합니다.&lt;/li&gt;
&lt;li&gt;TLS( Transport Layer Security, 이전글 참조 &lt;a href=&quot;https://dooli98.tistory.com/37&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;SSL(Secure Sockets Layer) vs TLS(Transport Layer Security)&lt;/a&gt;)라는 개념을 접했을떄 우리는 TLS가 Transport Layer에 위치해 있구나 TCP, UDP등에 적용되는 기술이구나 Session과 Application 기능은 구현되어 있지 않겠구나 .... 바로 추축 할 수 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;수많은 하드웨어 규격 ( RS232, RJ45, BLE, E1/CAS 등)은 Data Link Layer Protocol을 만족하면 되고 Application 측면에서 하드웨어들을 사용하면 (BLE, RS232 등)을 사용할때는 Applicaiton Layer, 최소 Network Layer, Transport Layer만 이해하면 가능하고... OSI를 통하여 상호 커뮤니케이션이 가능합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;722&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9H9Gy/btsjj8zuxwa/LNSZ9RcWZddQ1ZXdJ58zL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9H9Gy/btsjj8zuxwa/LNSZ9RcWZddQ1ZXdJ58zL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9H9Gy/btsjj8zuxwa/LNSZ9RcWZddQ1ZXdJ58zL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9H9Gy%2Fbtsjj8zuxwa%2FLNSZ9RcWZddQ1ZXdJ58zL0%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;710&quot; height=&quot;722&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;722&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;위의 그림은 정말 OSI 7 Layer를 잘 표현해 준 그림인 듯합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 layer는 하위 layer로 구현되고 다른 layer는 관심사가 아닙니다. 표준 protocol만 잘 지키면 여타 다른 layer의 의존도를 회기적으로 끈어 낼수있지요.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자 답게 코드로 이해 합시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FTP를 예를 들어보자.&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;FTP의 기능을 2가지로 정의해 보자.&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;* 파일전송&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;* 파일수신&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;FTP는 단순히 파일을 전송하고 수신하는 일을 하고 이를 구현하기 위하여 TCP또는 UDP layer를 사용하며 TCP, UDP의 구현방식에는 관심이 없다.&lt;/p&gt;
&lt;pre id=&quot;code_1686555492969&quot; class=&quot;lasso&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fn ftp::send(file_path){
	let data = read_file();
    
    let handle = tcp::connect(address);
	let data = read_file();
    tcp::send(data);
    tcp::close(handle)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위의 코드에서 FTP는 &quot;tcp::&quot;함수들의 구현/변경에는 관심이 없다. 위의 코드만으로 구현이 끝난상황이다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;여기서 tcp::send() 를 구현해 보자.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1686555492970&quot; class=&quot;lasso&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fn tcp::send(data : array){
    loop{
    	let packet = slice_packet(data);
        ip:send_packet(packet)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;여기서도 TCP 프로토콜은 ip:send_packet()함수의 구현/변경에는 또한 관심이 없다.&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;color: #666666; text-align: start;&quot; data-ke-style=&quot;style2&quot;&gt;!!! 어??? 그럼 tcp:send를 테스트하기 위해서는 ftp::send()가 구현되기를 기다려야하나? 어라? HTTP에서도 쓴다네?&lt;/blockquote&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;아~~ tcp를 많은 상위 layer에서 어떻게 쓰이는지 모르고 &quot;상위 layer의 구현 또한 관심이 없으므로 unit test을 잘 만들어서 품질을 보장하자&quot;가 TDD의 기본 개념이지 않을까 싶다.&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;상위 layer가 없으므로 unit test를 만들어 나가면서 구현을 해 나아가는것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1686555492971&quot; class=&quot;cpp&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[#test]
fn test_send_zero_sized(){
}

[#test]
fn test_send_packet_sized(){
}

[#test]
fn test_send_long_sized(){
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;급하게 마무리한 감이 있는데 .. ㅠ.ㅠ 점차 채워가겠습니다. ^^&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>architecture</category>
      <category>OSI</category>
      <category>OSI 7 layer</category>
      <category>통신모델</category>
      <author>Jack4u</author>
      <guid isPermaLink="true">https://dooli98.tistory.com/46</guid>
      <comments>https://dooli98.tistory.com/46#entry46comment</comments>
      <pubDate>Sat, 10 Jun 2023 01:17:51 +0900</pubDate>
    </item>
    <item>
      <title>[AI] 과거를 알면 미래가 보인다 - Perceptron (2)</title>
      <link>https://dooli98.tistory.com/45</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;기초부터 차근 차근&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;요즘 개발자들이 AI에 많이들 관심을 가지는것 같습니다만 &quot;perceptron&quot;을 물어보면 모르는 경우가 대부분입니다. AI = tensorflow라는 개념을 가지고 있지요. 사실 요즘은 오픈소스 생태계가 너무도 잘되어 있어서 SRE적으로 접근해도 됩니다. 그런데 개념을 잡지 못하면 오래가지 못해서 한계에 부딧칠겁니다. 근데 요즘 나오는 Deep Learning 기법들부터 이해하려하면 .... 또 역시 포기하게 되겠지요. Neural Network개념은 1960년대에 나온 개념입니다. 8비트 컴터도 없던 시절이지요. 이때 개념들부터 이해해 나가면 종국에는 Deep Learning의 영역까지 확장할수있을꺼라 확신합니다.&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;AI (Artificial Intelligence)의 역사&lt;/h3&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;1980년대 부터 개발을 하고 AI에 관심을 가져온 사람으로써 경험과 느낌들을 기반으로 기술한 역사로 &quot;역사학&quot; 공부하시는분들하고는 의견이 다를 수 있음을 밝힙니다.&amp;nbsp;&lt;/blockquote&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;perceptron은 1950년대에 &quot;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;Frank Rosenblatt&quot;이 수학적으로 제안한 AI의 초기 모델로 다들 기본적으로 알고 있는 뉴런이라는 인간의 뇌의 구조에 기반한 아이디어로 정립된 이론입니다. 8비트 컴퓨터가 나오기도 전에 이미 수학적으로 AI를 설계했다는 얘기지요.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이번 포스팅은 지난 포스팅 &lt;a href=&quot;https://dooli98.tistory.com/44&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[AI] 과거를 알고 미래가 보인다 - Perceptron(1)&lt;/a&gt;에 이어집니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;다층 퍼셉트론의 등장&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;1980년대 컴퓨팅 파워의 비약적인(?) 발전에 힘입어 단층 퍼센트론의 &quot;선형학습&quot;의 문제를 해결하고자 더 많은 &quot;컴퓨팅 파워&quot;을 사용하는 쪽으로 &quot;neural network&quot;이 발전하였고 결국은 복잡한 곡선 학습이 가능한 다층 퍼셉트론이 등장합니다.&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-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;843&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D4L4q/btsjjaklD8q/7fZ7GxCXnsVuQVyEVKqOL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D4L4q/btsjjaklD8q/7fZ7GxCXnsVuQVyEVKqOL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D4L4q/btsjjaklD8q/7fZ7GxCXnsVuQVyEVKqOL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD4L4q%2FbtsjjaklD8q%2F7fZ7GxCXnsVuQVyEVKqOL1%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;1280&quot; height=&quot;843&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;843&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력과 출력사이에 히든레이어를 두어서 출력값을 다수의 노드에서 연결강도를 조정함으로써 &quot;선형학습&quot;문제를 해결하고 &quot;XOR&quot;문제를 해결합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 BPNN ( Back Propagation Neural Nework ), SOM (Self-Organizing Map)등을 부각되고 &quot;지도학습&quot;, &quot;비지도학습&quot;, &quot;강화학습&quot;등의 연구와 실제 응용 세례들이 등장합니다. finally는 &quot;전문가 시스템&quot; 즉 특정분야에서는 인간의 판단을 일부 대신할수있는 시스템을 만들수있지 않을까 하는 개념들이 등장합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 활발히 상용화 되었던 것들이 &quot;음성인식&quot;, &quot;얼굴인식&quot;, &quot;번호판인식&quot;등의 제품들이 마구마구 나왔던것이 기억이 납니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 이때 나왔던 제품들 정말 쓰레기에 가까웠습니다. 사실 정확한 판단을 위해서는 수많은 히든레이어가 필요하고 더많은 계층의 히든레이어가 필요했는데 그당시 장비들의 컴퓨팅파워는 그 계산량을 감당할수없었지요. ㅠ.ㅠ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 상용화의 실패는 &quot;제2의 AI 암흑기&quot;를 불러옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시장은 더이상 AI에 대한 기대를 버리고 &quot;시스템&quot;과 &quot;알고리즘&quot;에 의존한 상용제품들을 내 놓고 IT산업을 발전 시킴니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;클라우드의 등장&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;그디어 클라우드의 시대가 열립니다. 지금 신세대 개발자들에게는 당연한 환경이겠지만 10년~20년전 클라우드, 클러스터같은 개념이 소개되었을때 정말 적응하는데 힘들었던 기억이 납니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;각설하고 클라우드의 등장은 &quot;무한한&quot; 컴퓨팅 파워을 제공했고 이 무한한 컴퓨팅 파워를 바탕으로 Neural Network는 심각하게 복잡한 계산을 가능하게 했고 두둥~~~ &quot;알파고&quot;가 등장합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;Deep Learning의 등장&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&quot;무제한&quot;의 컴퓨팅파워를 바탕으로 NN은 NN자체를 시간에 따라 복제하기 시작하고 히든레이어를 복제하고 이전 레이어로 역전파하기 시작했습니다. 과거의 컴퓨팅 파워로는 상상도 못하지만 지금은 가능한 시대가 되었습니다.&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-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1199&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sYviB/btsjlFwxqVT/Hd1FDCwt4xKNiHlRjxXVE1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sYviB/btsjlFwxqVT/Hd1FDCwt4xKNiHlRjxXVE1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sYviB/btsjlFwxqVT/Hd1FDCwt4xKNiHlRjxXVE1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsYviB%2FbtsjlFwxqVT%2FHd1FDCwt4xKNiHlRjxXVE1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1199&quot; height=&quot;526&quot; data-origin-width=&quot;1199&quot; data-origin-height=&quot;526&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DNN ( Deep Neural Network ) 입니다. 그냥 딱봐도 어마어마한 계산량이지요.. 단순히 그린거지.. 상용화를 위해서는 하나의 히든레이에 수백 수천개의 노드가 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;371&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQke31/btsjkGJxXns/0GVkpbTWxCPBZxYhfYvRX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQke31/btsjkGJxXns/0GVkpbTWxCPBZxYhfYvRX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQke31/btsjkGJxXns/0GVkpbTWxCPBZxYhfYvRX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQke31%2FbtsjkGJxXns%2F0GVkpbTWxCPBZxYhfYvRX0%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;850&quot; height=&quot;371&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;371&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RNN ( recurrent neural network ) 입니다. 아싸리 입력에 따른 히든레이어를 복사해 나가고 가중치도 전파해 나갑니다. 계산량을 감히 상상도 할 수 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;마치면서&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;1편 부터 2편까지 모두 읽었다면 딥러닝이란것이 갑자기 어디서 툭 튀어 나온것도 아니고 굉장히 획기적인 신기술도 아니라는것을 알 수 있을것입니다. 시대의 흐름을 잘 읽은 사람들의 작품이라 하겠습니다. 그런데 개인적으로 AI분야에 많은 개발자들이 진입하려하는것에 좀 우려감이 있습니다. 왜냐하면 거기에는 여러분의 intelligence가 필요하지 않기 때문입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;개인적으로는 Ai와도 연관되겠지만&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Big Data Minning&lt;/li&gt;
&lt;li&gt;Big Data Aggregating&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분야가 AI와 발맞출수있는 올바른 방향이라 생각됩니다.&lt;/p&gt;</description>
      <category>ai</category>
      <category>Ai</category>
      <category>Machine Learning</category>
      <category>ML</category>
      <category>neural network</category>
      <category>기계학습</category>
      <category>머신러닝</category>
      <author>Jack4u</author>
      <guid isPermaLink="true">https://dooli98.tistory.com/45</guid>
      <comments>https://dooli98.tistory.com/45#entry45comment</comments>
      <pubDate>Sat, 10 Jun 2023 00:01:15 +0900</pubDate>
    </item>
  </channel>
</rss>