<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>유니 코드</title>
    <link>https://uoohlz.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sun, 16 Aug 2026 05:34:35 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>꼬물쥰</managingEditor>
    <image>
      <title>유니 코드</title>
      <url>https://tistory1.daumcdn.net/tistory/5240687/attach/f81b17ecd67941149e0c4dcf7b14eebe</url>
      <link>https://uoohlz.tistory.com</link>
    </image>
    <item>
      <title>[Github] Organization 커스텀하기(README 추가, 프로필 변경)</title>
      <link>https://uoohlz.tistory.com/entry/Github-Organization-%EC%BB%A4%EC%8A%A4%ED%85%80%ED%95%98%EA%B8%B0README-%EC%B6%94%EA%B0%80-%ED%94%84%EB%A1%9C%ED%95%84-%EB%B3%80%EA%B2%BD</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;포트폴리오를 준비하다보니 다른사람의 포트폴리오를 많이 보게되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분 사람들이 노션에&amp;nbsp; 프로젝트를 정리해두거나, github repository에 readme를 작성하는 방식으로 포트폴리오를 준비하는 것 같다. 그래서 나도 지금 진행하고 있는 프로젝트에 readme를 추가해보려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깃허브에 Organization을 만들어서 협업하고 있다. 현재 우리 organization에 들어가면 아무것도 뜨지 않는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;634&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FmovJ/btr0p679YZb/xiat9Mw4KFFQHDQZzwFXm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FmovJ/btr0p679YZb/xiat9Mw4KFFQHDQZzwFXm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FmovJ/btr0p679YZb/xiat9Mw4KFFQHDQZzwFXm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFmovJ%2Fbtr0p679YZb%2Fxiat9Mw4KFFQHDQZzwFXm1%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;549&quot; height=&quot;371&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;634&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;readme를 추가하여 위의 화면에 프로젝트에 관한 설명을 추가해보려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 먼저 organization에 퍼블릭으로 .github 리포지토리를 생성한다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;821&quot; data-origin-height=&quot;609&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wBBsO/btr0o7zqiAK/ZCBUjpUqmJKeoEaAocvHU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wBBsO/btr0o7zqiAK/ZCBUjpUqmJKeoEaAocvHU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wBBsO/btr0o7zqiAK/ZCBUjpUqmJKeoEaAocvHU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwBBsO%2Fbtr0o7zqiAK%2FZCBUjpUqmJKeoEaAocvHU1%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;596&quot; height=&quot;548&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;821&quot; data-origin-height=&quot;609&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 위에서 만든 .github 리포지토리에서 profile 폴더 생성후 README.md 파일을 만들어준다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;위의 방법도 있지만 더 쉬운 방법을 알려주려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;overview 화면 오른쪽에 보면 아래 사진과 같이 &lt;b&gt;create a README file&lt;/b&gt; 글자를 클릭할 수가 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;388&quot; data-origin-height=&quot;230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2uypc/btr0yjx5836/44mRkfKWQ1KjUaofJcwMOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2uypc/btr0yjx5836/44mRkfKWQ1KjUaofJcwMOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2uypc/btr0yjx5836/44mRkfKWQ1KjUaofJcwMOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2uypc%2Fbtr0yjx5836%2F44mRkfKWQ1KjUaofJcwMOK%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;388&quot; height=&quot;230&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;388&quot; data-origin-height=&quot;230&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;create a README file을 클릭하면 파일을 추가하겠냐는 팝업창이 뜨는데 &lt;b&gt;Create file&lt;/b&gt;을 눌러준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qnF9O/btr0qYPxg7K/N1nXKj6nSYeaU5v9sRsdg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qnF9O/btr0qYPxg7K/N1nXKj6nSYeaU5v9sRsdg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qnF9O/btr0qYPxg7K/N1nXKj6nSYeaU5v9sRsdg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqnF9O%2Fbtr0qYPxg7K%2FN1nXKj6nSYeaU5v9sRsdg0%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;498&quot; height=&quot;278&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;278&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가해주면 아래와 같이 readme파일의 내용이 overview에 잘 나오는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 프로젝트 내용 정리하러 가야겠다..그럼 이만&lt;span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;770&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bh4Baj/btr0wW4sYb3/fKRkdz2K1wg9DkfXS2AMdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bh4Baj/btr0wW4sYb3/fKRkdz2K1wg9DkfXS2AMdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bh4Baj/btr0wW4sYb3/fKRkdz2K1wg9DkfXS2AMdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbh4Baj%2Fbtr0wW4sYb3%2FfKRkdz2K1wg9DkfXS2AMdK%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;685&quot; height=&quot;504&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;770&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.github.com/ko/organizations/collaborating-with-groups-in-organizations/customizing-your-organizations-profile&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;깃허브 공식 문서&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;++추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기록용으로 organization 프로필 변경하는 방법을 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;organization에 들어가서 setting을 누르면 바로 General이 뜬다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원하는 내용으로 변경해주면 된다. 변경하면 아래와 사진처럼 프로필이 수정된다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;548&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oG7PF/btr0sBmjoys/KXrt4KD9RKDw7tO16iFrs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oG7PF/btr0sBmjoys/KXrt4KD9RKDw7tO16iFrs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oG7PF/btr0sBmjoys/KXrt4KD9RKDw7tO16iFrs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoG7PF%2Fbtr0sBmjoys%2FKXrt4KD9RKDw7tO16iFrs0%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;810&quot; height=&quot;425&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;548&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>ect</category>
      <author>꼬물쥰</author>
      <guid isPermaLink="true">https://uoohlz.tistory.com/94</guid>
      <comments>https://uoohlz.tistory.com/entry/Github-Organization-%EC%BB%A4%EC%8A%A4%ED%85%80%ED%95%98%EA%B8%B0README-%EC%B6%94%EA%B0%80-%ED%94%84%EB%A1%9C%ED%95%84-%EB%B3%80%EA%B2%BD#entry94comment</comments>
      <pubDate>Thu, 23 Feb 2023 15:42:52 +0900</pubDate>
    </item>
    <item>
      <title>[Android] Android Studio Chipmunk버전 build.gradle(project) 설정방법</title>
      <link>https://uoohlz.tistory.com/entry/Android-Android-Studio-Chipmunk%EB%B2%84%EC%A0%84-buildgradleproject-%EC%84%A4%EC%A0%95%EB%B0%A9%EB%B2%95</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;내가 사용하고 있는 Android Studio의 버전은 Chipmunk 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트를 진행하면서 Firebase를 사용하게되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱과 Firebase연동과정에서 Chipmunk는 project수준 build.gradle 내용이 다르다는 것을 알게되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 build.gradle은 아래와 같이 buildscript와 allprojects가 있다.&lt;/p&gt;
&lt;pre class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;buildscript {
    ext.kotlin_version = &quot;1.5.0&quot;
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        classpath &quot;com.android.tools.build:gradle:4.2.2&quot;
        classpath &quot;org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version&quot;
        classpath 'com.google.gms:google-services:4.3.13'
    }
}

allprojects {
    repositories {
        google()
        mavenCentral()
        jcenter() // Warning: this repository is going to shut down soon
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}&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;하지만 chipmunk는 plugin만 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;처음에 보고 당황했다ㅋㅋㅋ.&lt;/s&gt;&lt;/p&gt;
&lt;pre class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot;&gt;&lt;code&gt;plugins {
    id 'com.android.application' version '7.2.2' apply false
    id 'com.android.library' version '7.2.2' apply false
    id 'org.jetbrains.kotlin.android' version '1.6.10' apply false
    id 'com.google.dagger.hilt.android' version '2.44' apply false
}&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;찾아보니 settings.gradle에 따로 작성하는 것이 gradle 6.8이 되면서 새로운 문법이 생겨났다는,,, 그런이야기도 ,,,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 방식이 centralized repository declaration이라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.gradle.org/current/userguide/dependency_management.html#sub:centralized-repository-declaration&quot;&gt;https://docs.gradle.org/current/userguide/dependency_management.html#sub:centralized-repository-declaration&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 블로그를 참고하면 좋을 듯하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ideajini.tistory.com/15&quot;&gt;https://ideajini.tistory.com/15&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;plugins 위에 buildscript를 추가했다.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;buildscript {
    dependencies {
        classpath 'com.google.gms:google-services:4.3.13'
    }
}

// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
    id 'com.android.application' version '7.2.2' apply false
    id 'com.android.library' version '7.2.2' apply false
    id 'org.jetbrains.kotlin.android' version '1.6.10' apply false
    id 'com.google.dagger.hilt.android' version '2.44' apply false
}&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;&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://hhyeok1026.tistory.com/29&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://hhyeok1026.tistory.com/29&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.gradle.org/current/userguide/dependency_management.html#sub:centralized-repository-declaration&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.gradle.org/current/userguide/dependency_management.html#sub:centralized-repository-declaration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@hahagudrn/Android-Studio-Chipmunk2021.2.1%EC%97%90%EC%84%9C-photoView-labrary-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@hahagudrn/Android-Studio-Chipmunk2021.2.1%EC%97%90%EC%84%9C-photoView-labrary-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ibm.com/docs/ko/mpf/8.0.0?topic=environment-setting-up-android-studio-projects-gradle&quot;&gt;https://www.ibm.com/docs/ko/mpf/8.0.0?topic=environment-setting-up-android-studio-projects-gradle&lt;/a&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/72656833/gradle-file-change-after-update-android-studio-chipmunk&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://stackoverflow.com/questions/72656833/gradle-file-change-after-update-android-studio-chipmunk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@emily2307/Unit-3-Navigation-4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@emily2307/Unit-3-Navigation-4&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>오늘의 공부는?!/Android</category>
      <category>Chipmunk</category>
      <category>gradle설정</category>
      <author>꼬물쥰</author>
      <guid isPermaLink="true">https://uoohlz.tistory.com/93</guid>
      <comments>https://uoohlz.tistory.com/entry/Android-Android-Studio-Chipmunk%EB%B2%84%EC%A0%84-buildgradleproject-%EC%84%A4%EC%A0%95%EB%B0%A9%EB%B2%95#entry93comment</comments>
      <pubDate>Thu, 23 Feb 2023 15:08:46 +0900</pubDate>
    </item>
    <item>
      <title>[Android] 반복되는 레이아웃 재사용하기 - include 태그(Kotlin)</title>
      <link>https://uoohlz.tistory.com/entry/Android-%EB%B0%98%EB%B3%B5%EB%90%98%EB%8A%94-%EB%A0%88%EC%9D%B4%EC%95%84%EC%9B%83-%EC%9E%AC%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-include-%ED%83%9C%EA%B7%B8Kotlin</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;앱개발을 하다보면 여러개의 레이아웃에서 반복되어 사용되는 레이아웃이 생긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나의 경우에는 앱 레이아웃에 전체적으로 툴바가 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;거기서 끝나는 것이 아니라 dataBinding을 사용하여 응용하는 방법까지 알아보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;267&quot; data-origin-height=&quot;61&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfpCmq/btrZr0fM8Tw/PExpXQRPZ5NvVPwUW4Aez0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfpCmq/btrZr0fM8Tw/PExpXQRPZ5NvVPwUW4Aez0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfpCmq/btrZr0fM8Tw/PExpXQRPZ5NvVPwUW4Aez0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfpCmq%2FbtrZr0fM8Tw%2FPExpXQRPZ5NvVPwUW4Aez0%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;267&quot; height=&quot;61&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;267&quot; data-origin-height=&quot;61&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;pre id=&quot;code_1676474793611&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;layout xmlns:app=&quot;http://schemas.android.com/apk/res-auto&quot;
    xmlns:tools=&quot;http://schemas.android.com/tools&quot;&amp;gt;

    &amp;lt;androidx.constraintlayout.widget.ConstraintLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
        android:layout_width=&quot;match_parent&quot;
        android:layout_height=&quot;match_parent&quot;&amp;gt;

        &amp;lt;androidx.appcompat.widget.Toolbar
		android:id=&quot;@+id/toolbar&quot;
		android:layout_width=&quot;match_parent&quot;
		android:layout_height=&quot;wrap_content&quot;
		tools:ignore=&quot;MissingConstraints&quot;&amp;gt;

		&amp;lt;TextView
			android:id=&quot;@+id/title&quot;
			style=&quot;@style/neo_bold_black_style&quot;
			android:layout_width=&quot;wrap_content&quot;
			android:layout_height=&quot;wrap_content&quot;
			android:layout_gravity=&quot;center&quot;
			android:text=&quot;@string/manage_staff&quot;
			android:textSize=&quot;20sp&quot; /&amp;gt;
	&amp;lt;/androidx.appcompat.widget.Toolbar&amp;gt;

        &amp;lt;ScrollView
            android:layout_width=&quot;match_parent&quot;
            android:layout_height=&quot;wrap_content&quot;
            app:layout_constraintTop_toBottomOf=&quot;@id/toolbar&quot;&amp;gt;
							...
        &amp;lt;/ScrollView&amp;gt;
    &amp;lt;/androidx.constraintlayout.widget.ConstraintLayout&amp;gt;
&amp;lt;/layout&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드는 위 스크린샷의 코드 일부이다.( activity_manage_staff.xml)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;거의 모든 레이아웃에 존재하고있는 이 코드를 따로 빼서 재사용하려고한다.&lt;/p&gt;
&lt;pre id=&quot;code_1676473872806&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;androidx.appcompat.widget.Toolbar
	android:id=&quot;@+id/toolbar&quot;
	android:layout_width=&quot;match_parent&quot;
	android:layout_height=&quot;wrap_content&quot;
	tools:ignore=&quot;MissingConstraints&quot;&amp;gt;

&amp;lt;TextView
	android:id=&quot;@+id/title&quot;
	style=&quot;@style/neo_bold_black_style&quot;
	android:layout_width=&quot;wrap_content&quot;
	android:layout_height=&quot;wrap_content&quot;
	android:layout_gravity=&quot;center&quot;
	android:text=&quot;@string/manage_staff&quot;
	android:textSize=&quot;20sp&quot; /&amp;gt;
&amp;lt;/androidx.appcompat.widget.Toolbar&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 먼저, 새로운 레이아웃을 생성하자(layout_toolbar.xml)&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1676474453891&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;androidx.constraintlayout.widget.ConstraintLayout 
	xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
	xmlns:app=&quot;http://schemas.android.com/apk/res-auto&quot;
	android:layout_width=&quot;match_parent&quot;
	android:layout_height=&quot;wrap_content&quot;&amp;gt;

	&amp;lt;androidx.appcompat.widget.Toolbar
		android:id=&quot;@+id/toolbar&quot;
		android:layout_width=&quot;match_parent&quot;	
		android:layout_height=&quot;wrap_content&quot;
		app:layout_constraintTop_toTopOf=&quot;parent&quot;&amp;gt;

		&amp;lt;androidx.appcompat.widget.AppCompatImageView
			android:id=&quot;@+id/iv_back&quot;
			android:layout_width=&quot;24dp&quot;
			android:layout_height=&quot;24dp&quot;
			android:src=&quot;@drawable/ic_back_arrow_black&quot; /&amp;gt;

		&amp;lt;TextView
			android:id=&quot;@+id/tv_title&quot;
			android:layout_width=&quot;wrap_content&quot;
			android:layout_height=&quot;wrap_content&quot;
			android:layout_marginStart=&quot;30dp&quot;
			android:text=&quot;title&quot; /&amp;gt;
	&amp;lt;/androidx.appcompat.widget.Toolbar&amp;gt;

	&amp;lt;TextView
		android:id=&quot;@+id/btn_right_text&quot;
		android:layout_width=&quot;wrap_content&quot;
		android:layout_height=&quot;wrap_content&quot;
		android:layout_marginEnd=&quot;24dp&quot;
		android:text=&quot;option&quot;
		app:layout_constraintBottom_toBottomOf=&quot;parent&quot;
		app:layout_constraintEnd_toEndOf=&quot;parent&quot;
		app:layout_constraintTop_toTopOf=&quot;parent&quot; /&amp;gt;
&amp;lt;/androidx.constraintlayout.widget.ConstraintLayout&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 해당 레이아웃을 넣어야하는 레이아웃(activity_manage_staff.xml)에 include 태그로 추가한다.&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1676475160217&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;layout xmlns:app=&quot;http://schemas.android.com/apk/res-auto&quot;
    xmlns:tools=&quot;http://schemas.android.com/tools&quot;&amp;gt;

    &amp;lt;androidx.constraintlayout.widget.ConstraintLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
	android:layout_width=&quot;match_parent&quot;
	android:layout_height=&quot;match_parent&quot;&amp;gt;

	&amp;lt;include
		android:id=&quot;@+id/toolbar&quot;
		layout=&quot;@layout/layout_toolbar&quot;/&amp;gt;

        &amp;lt;ScrollView
            android:layout_width=&quot;match_parent&quot;
            android:layout_height=&quot;wrap_content&quot;
            app:layout_constraintTop_toBottomOf=&quot;@id/toolbar&quot;&amp;gt;
							...
        &amp;lt;/ScrollView&amp;gt;
    &amp;lt;/androidx.constraintlayout.widget.ConstraintLayout&amp;gt;
&amp;lt;/layout&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지 하면 뒤로가기버튼과 title이라는 텍스트가 있는 툴바가 적용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;나는 옵션기능까지 추가해주었다. 뒤에서 데이터바인딩을 이용해 visibility를 변경할 것이다.&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 우리는 title이라는 텍스트가 각 레이아웃별로 변경되기를 원한다.&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;데이터 바인딩 활용하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 툴바 예시에서 'title'에 해당하는 부분이 위의 스크린샷처럼 '직원 관리'로 변경한다고 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터바인딩을 이용하면 텍스트뷰의 text에 들어갈 값을 지정할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 위에서 만든 툴바 레이아웃(layout_toolbar.xml)에서 변경해야할 부분에 대한 변수를 지정한다.&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1676475918789&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;layout&amp;gt;
    &amp;lt;data&amp;gt;
        &amp;lt;!--    title 텍스트 지정    --&amp;gt;
        &amp;lt;variable
            name=&quot;titleText&quot;
            type=&quot;java.lang.String&quot; /&amp;gt;
        &amp;lt;!--    오른쪽 텍스트 지정    --&amp;gt;
        &amp;lt;variable
            name=&quot;rightText&quot;
            type=&quot;java.lang.String&quot; /&amp;gt;
    &amp;lt;/data&amp;gt;

    &amp;lt;androidx.constraintlayout.widget.ConstraintLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
        xmlns:app=&quot;http://schemas.android.com/apk/res-auto&quot;
        xmlns:tools=&quot;http://schemas.android.com/tools&quot;
        android:layout_width=&quot;match_parent&quot;
        android:layout_height=&quot;wrap_content&quot;&amp;gt;

        &amp;lt;androidx.appcompat.widget.Toolbar
            android:id=&quot;@+id/toolbar&quot;
            android:layout_width=&quot;match_parent&quot;
            android:layout_height=&quot;wrap_content&quot;
            app:layout_constraintTop_toTopOf=&quot;parent&quot;&amp;gt;

            &amp;lt;androidx.appcompat.widget.AppCompatImageView
                android:id=&quot;@+id/iv_back&quot;
                android:layout_width=&quot;24dp&quot;
                android:layout_height=&quot;24dp&quot;
                android:src=&quot;@drawable/ic_back_arrow_black&quot; /&amp;gt;

            &amp;lt;TextView
                android:id=&quot;@+id/tv_title&quot;
                android:layout_width=&quot;wrap_content&quot;
                android:layout_height=&quot;wrap_content&quot;
                android:layout_marginStart=&quot;30dp&quot;
                android:text=&quot;@{titleText == null ? `title` : titleText}&quot;/&amp;gt;
        &amp;lt;/androidx.appcompat.widget.Toolbar&amp;gt;

        &amp;lt;TextView
            android:id=&quot;@+id/btn_right_text&quot;
            android:layout_width=&quot;wrap_content&quot;
            android:layout_height=&quot;wrap_content&quot;
            android:layout_marginEnd=&quot;24dp&quot;
            android:text=&quot;@{rightText == null ? `option` : rightText}&quot;
            app:layout_constraintBottom_toBottomOf=&quot;parent&quot;
            app:layout_constraintEnd_toEndOf=&quot;parent&quot;
            app:layout_constraintTop_toTopOf=&quot;parent&quot; /&amp;gt;
    &amp;lt;/androidx.constraintlayout.widget.ConstraintLayout&amp;gt;
&amp;lt;/layout&amp;gt;&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. include하는 부분에서 include 태그 내부로 해당 변수를 전달한다.&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1676476052060&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;layout xmlns:app=&quot;http://schemas.android.com/apk/res-auto&quot;
    xmlns:tools=&quot;http://schemas.android.com/tools&quot;&amp;gt;

    &amp;lt;androidx.constraintlayout.widget.ConstraintLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
	android:layout_width=&quot;match_parent&quot;
	android:layout_height=&quot;match_parent&quot;&amp;gt;

	&amp;lt;include
		android:id=&quot;@+id/toolbar&quot;
		layout=&quot;@layout/layout_toolbar&quot;
		app:titleText=&quot;@{`직원 관리`}&quot;/&amp;gt;

        &amp;lt;ScrollView
            android:layout_width=&quot;match_parent&quot;
            android:layout_height=&quot;wrap_content&quot;
            app:layout_constraintTop_toBottomOf=&quot;@id/toolbar&quot;&amp;gt;
							...
        &amp;lt;/ScrollView&amp;gt;
    &amp;lt;/androidx.constraintlayout.widget.ConstraintLayout&amp;gt;
&amp;lt;/layout&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터를 전달할때는 &lt;b&gt;데이터바인딩으로만 전달 가능&lt;/b&gt;하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, app:titleText=&quot;직원 관리&quot; 형식으로 사용할 수 없고,&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt; app:titleText=&quot;@{`직원 관리`}&quot;&lt;/span&gt;와 같이 사용해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 string value를 지정했다면 app:titleText=&quot;@{@string/manage_staff}&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;360&quot; data-origin-height=&quot;55&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuXCh8/btrZtq56H68/gnmCvXUtmkg96PMJyuKul1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuXCh8/btrZtq56H68/gnmCvXUtmkg96PMJyuKul1/img.png&quot; data-alt=&quot;결과 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuXCh8/btrZtq56H68/gnmCvXUtmkg96PMJyuKul1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuXCh8%2FbtrZtq56H68%2FgnmCvXUtmkg96PMJyuKul1%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;360&quot; height=&quot;55&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;55&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;결과 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지 하면 기본적인 것은 다 설명한 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 추가적으로 내가 필요했던 내용을 정리해보려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나에게 남은 과제는 option 기능의 visibility를 지정하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수로 rightText값을 전달받지 않으면 visibility를 Gone으로 하려고 한다.&lt;/p&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;추가1) DataBinding으로 visibility 처리하기&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1676476988625&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;data&amp;gt;
    &amp;lt;import type=&quot;android.view.View&quot;/&amp;gt;
    &amp;lt;variable
        name=&quot;rightText&quot;
        type=&quot;java.lang.String&quot;/&amp;gt;
&amp;lt;/data&amp;gt;

&amp;lt;FrameLayout android:visibility=&quot;@{rightText == null ? View.GONE : View.VISIBLE}&quot;/&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;추가2) textColor 변경하기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특별케이스로 option 의 텍스트 색이 다른 경우가 생겼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 rightTextColor라는 Boolean 변수를 만들고, 만약 값을 전달받지 않거나, false이면 @color/disabled_text,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;true이면 @color/app_color로 지정해주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종적인 코드이다.(&lt;b&gt;&lt;/b&gt;layout_toolbar.xml)&lt;/p&gt;
&lt;pre id=&quot;code_1676477467454&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;
&amp;lt;layout&amp;gt;
    &amp;lt;data&amp;gt;
        &amp;lt;import type=&quot;android.view.View&quot; /&amp;gt;
        &amp;lt;!--    title 텍스트 지정    --&amp;gt;
        &amp;lt;variable name=&quot;titleText&quot; type=&quot;java.lang.String&quot; /&amp;gt;
        &amp;lt;!--    오른쪽 텍스트 지정    --&amp;gt;
        &amp;lt;variable name=&quot;rightText&quot; type=&quot;java.lang.String&quot; /&amp;gt;
        &amp;lt;!--   오른쪽 텍스트 컬러지정 - true: app_color, false 또는 null : b1     --&amp;gt;
        &amp;lt;variable name=&quot;rightTextColor&quot; type=&quot;Boolean&quot; /&amp;gt;
    &amp;lt;/data&amp;gt;

    &amp;lt;androidx.constraintlayout.widget.ConstraintLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
        xmlns:app=&quot;http://schemas.android.com/apk/res-auto&quot;
        xmlns:tools=&quot;http://schemas.android.com/tools&quot;
        android:layout_width=&quot;match_parent&quot;
        android:layout_height=&quot;wrap_content&quot;&amp;gt;

        &amp;lt;androidx.appcompat.widget.Toolbar .../&amp;gt;

        &amp;lt;TextView
            android:id=&quot;@+id/btn_right_text&quot;
            android:layout_width=&quot;wrap_content&quot;
            android:layout_height=&quot;wrap_content&quot;
            android:layout_marginEnd=&quot;24dp&quot;
            android:text=&quot;@{rightText == null ? `option` : rightText}&quot;
            android:textColor=&quot;@{rightTextColor == null || !rightTextColor ?  @color/disabled_text : @color/app_color}&quot;
            android:visibility=&quot;@{rightText == null ? View.GONE : View.VISIBLE}&quot;
            app:layout_constraintBottom_toBottomOf=&quot;parent&quot;
            app:layout_constraintEnd_toEndOf=&quot;parent&quot;
            app:layout_constraintTop_toTopOf=&quot;parent&quot;/&amp;gt;
    &amp;lt;/androidx.constraintlayout.widget.ConstraintLayout&amp;gt;
&amp;lt;/layout&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>오늘의 공부는?!/Android</category>
      <category>databinding</category>
      <category>include</category>
      <category>툴바</category>
      <author>꼬물쥰</author>
      <guid isPermaLink="true">https://uoohlz.tistory.com/92</guid>
      <comments>https://uoohlz.tistory.com/entry/Android-%EB%B0%98%EB%B3%B5%EB%90%98%EB%8A%94-%EB%A0%88%EC%9D%B4%EC%95%84%EC%9B%83-%EC%9E%AC%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-include-%ED%83%9C%EA%B7%B8Kotlin#entry92comment</comments>
      <pubDate>Thu, 16 Feb 2023 01:15:46 +0900</pubDate>
    </item>
    <item>
      <title>[Android]OkHttp Interceptor를 이용해 헤더에 토큰 붙이기(Kotlin)</title>
      <link>https://uoohlz.tistory.com/entry/OkHttp-Interceptor%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4-%ED%97%A4%EB%8D%94%EC%97%90-%ED%86%A0%ED%81%B0-%EB%B6%99%EC%9D%B4%EA%B8%B0Kotlin</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트를 진행하면서 jwt 인증을 이용하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 내가 할 건 별로 없긴한데, 시나리오를 한번 정리해보겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 회원가입 후 로그인을 하면 서버에서 accessToken과 refreshToken을 발급해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 이 토큰을 가지고 api call에 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; -&amp;gt; 회원정보 수정이나 정보조회 등,,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. api call할때, 추가로 헤더에 accessToken을 넣어서 request 보내야 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; -&amp;gt;&amp;nbsp; 이때, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;&quot;Bearer ${token}&quot;&lt;/b&gt;&lt;/span&gt; 형식으로 보내야 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 만약 accessToken이 만료되었다면 서버에서는 403코드를 보낼것임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 403을 받으면 refreshToken을 포함하여 call 보내서 Token을 재발급 해야함.&lt;/p&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;pre id=&quot;code_1675957484684&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//retrofit 인터페이스
@POST(&quot;auth/check-password&quot;)
fun checkPassword(
	@Header(&quot;Authorization&quot;) token: String,
	@Body params: HashMap&amp;lt;String, String&amp;gt;,
): Call&amp;lt;ResultResponse&amp;gt;


//retrofit 사용하여 api call
    private fun checkPassword() {
        val currentPassword = HashMap&amp;lt;String, String&amp;gt;()
        currentPassword[&quot;password&quot;] = binding.editCurrentPassword.text.toString()
        val tok = &quot;Bearer &quot; + MyApplication.prefs.getString(&quot;accessToken&quot;)
        service.checkPassword(
            tok, currentPassword
        ).enqueue(object : Callback&amp;lt;ResultResponse&amp;gt; {
            override fun onResponse(
                call: Call&amp;lt;ResultResponse&amp;gt;,
                response: Response&amp;lt;ResultResponse&amp;gt;
            ) {
                val body = response.body()
                if (body != null) {
                    if (body.statusCode == 200) {
                        intentPage(ModifyPwActivity::class.java)
                    } else {
                        errorMessageDialog(body.message)
                        binding.editCurrentPassword.text = null
                    }
                }
            }

            override fun onFailure(call: Call&amp;lt;ResultResponse&amp;gt;, t: Throwable) {
                Log.e(&quot;checkPassword fail&quot;, &quot;[Fail]$t&quot;)
            }
        })
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지는 위의 코드처럼 retrofit 인터페이스에 하나하나 token을 붙여서 보내는 방식이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메소드 수가 많아질수록 저 같은 코드를 여러번 반복하는게 귀찮고 거슬렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 이걸 어떻게 해결할지 좀 찾아보다가 &lt;b&gt;Interceptor&lt;/b&gt;라는 것을 발견했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Interceptor는 말그대로 가로채는 것인데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Interceptor를 이용하면 request 요청이나 response를 받을 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;interceptor가 가로채서 헤더를 추가하거나, 요청에 대한 응답을 처리할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;내가 쓴 말이 이해가 안될 것 같아서 다른 분이 작성하신 것을 추가해보겠다....ㅎ&lt;/s&gt;&lt;s&gt;&lt;/s&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;Interceptors란 API 통신에서 요청에 대해 monitor, rewrite 그리고 retry 할 수 있는 강력한 메커니즘이다. &lt;b&gt;Interceptor를 통해서 우리는 API 통신을 만들 때, 통신 과정을 모니터링 하거나 특별한 작업을 수행&lt;/b&gt;할 수 있다. 쉽게 말해서, Interceptor 기능은 공항 보안 요원이 보안 검사하는 과정과 비슷하다. 그들은 먼저 탑승권을 확인하고, 승인한 다음에서야 우리가 지나갈 수 있도록 하는 것처럼 말이다.&lt;br /&gt;Interceptor는 중앙에서 API 호출들을 모니터링 하는 것처럼 다양하게 사용된다. 일반적으로 우리는 각각의 network 호출에 대해&amp;nbsp;logger를 달아야 할 필요가 있다. 하지만 Interceptor를 이용한다면 하나의&amp;nbsp;logger를 추가하여 모든 network 호출에 대해 동작하도록 할 수 있다. 다른 경우로는&amp;nbsp;offline-first app의 build를 위해 network 요청의&amp;nbsp;response를 캐싱하기도 한다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;//&lt;s&gt;구현한 거 추가하기,,!&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자세한 코드는 깃허브 링크 남기겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/Management-Of-Staff/client/blob/develop/app/src/main/java/myapplication/second/workinghourmanagement/AuthInterceptor.kt&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;GitHub&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1677132699323&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - Management-Of-Staff/client: 사장님 매장 관리 어플리케이션 Android&quot; data-og-description=&quot;사장님 매장 관리 어플리케이션 Android. Contribute to Management-Of-Staff/client development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/Management-Of-Staff/client/blob/develop/app/src/main/java/myapplication/second/workinghourmanagement/AuthInterceptor.kt&quot; data-og-url=&quot;https://github.com/Management-Of-Staff/client&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bZjrNF/hyRItC4yhf/UNpks1FbluWlf2qlKkfuZ1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/Management-Of-Staff/client/blob/develop/app/src/main/java/myapplication/second/workinghourmanagement/AuthInterceptor.kt&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/Management-Of-Staff/client/blob/develop/app/src/main/java/myapplication/second/workinghourmanagement/AuthInterceptor.kt&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bZjrNF/hyRItC4yhf/UNpks1FbluWlf2qlKkfuZ1/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;GitHub - Management-Of-Staff/client: 사장님 매장 관리 어플리케이션 Android&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;사장님 매장 관리 어플리케이션 Android. Contribute to Management-Of-Staff/client development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devgeek.tistory.com/56&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://devgeek.tistory.com/56&lt;/a&gt;&lt;/p&gt;</description>
      <category>오늘의 공부는?!/Android</category>
      <category>interceptor</category>
      <category>OKHttp</category>
      <category>RETROFIT</category>
      <author>꼬물쥰</author>
      <guid isPermaLink="true">https://uoohlz.tistory.com/91</guid>
      <comments>https://uoohlz.tistory.com/entry/OkHttp-Interceptor%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4-%ED%97%A4%EB%8D%94%EC%97%90-%ED%86%A0%ED%81%B0-%EB%B6%99%EC%9D%B4%EA%B8%B0Kotlin#entry91comment</comments>
      <pubDate>Fri, 10 Feb 2023 00:58:01 +0900</pubDate>
    </item>
    <item>
      <title>[BOJ/백준][Gold4] 14002. 가장 긴 증가하는 수열4(Kotlin)</title>
      <link>https://uoohlz.tistory.com/entry/BOJ%EB%B0%B1%EC%A4%80Gold4-14002-%EA%B0%80%EC%9E%A5-%EA%B8%B4-%EC%A6%9D%EA%B0%80%ED%95%98%EB%8A%94-%EC%88%98%EC%97%B44</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/14002&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/14002&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1675185207804&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;14002번: 가장 긴 증가하는 부분 수열 4&quot; data-og-description=&quot;수열 A가 주어졌을 때, 가장 긴 증가하는&amp;nbsp;부분&amp;nbsp;수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분&amp;nbsp;수열은&amp;nbsp;A = {10, 20, 10, 30, 20, 50} 이&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/14002&quot; data-og-url=&quot;https://www.acmicpc.net/problem/14002&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/biku7r/hyRsuPwewV/j8as9nN9LtnjQgVhL3UvvK/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/14002&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/14002&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/biku7r/hyRsuPwewV/j8as9nN9LtnjQgVhL3UvvK/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&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;14002번: 가장 긴 증가하는 부분 수열 4&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;수열 A가 주어졌을 때, 가장 긴 증가하는&amp;nbsp;부분&amp;nbsp;수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분&amp;nbsp;수열은&amp;nbsp;A = {10, 20, 10, 30, 20, 50} 이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;problem-body&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수열 A가 주어졌을 때, 가장 긴 증가하는&amp;nbsp;부분&amp;nbsp;수열을 구하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분&amp;nbsp;수열은&amp;nbsp;A = {&lt;b&gt;10&lt;/b&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;20&lt;/b&gt;, 10,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;30&lt;/b&gt;, 20,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;50&lt;/b&gt;} 이고, 길이는 4이다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;입출력&lt;/b&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[입력]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째 줄에 수열 A의 크기 N (1 &amp;le; N &amp;le; 1,000)이 주어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 &amp;le; Ai&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;le; 1,000)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[출력]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘째 줄에는 가장 긴 증가하는 부분 수열을 출력한다. 그러한 수열이 여러가지인 경우 아무거나 출력한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1195&quot; data-origin-height=&quot;205&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKmLF4/btrXORxnjGA/CkFQryhhTZWeRlbEjfjoFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKmLF4/btrXORxnjGA/CkFQryhhTZWeRlbEjfjoFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKmLF4/btrXORxnjGA/CkFQryhhTZWeRlbEjfjoFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKmLF4%2FbtrXORxnjGA%2FCkFQryhhTZWeRlbEjfjoFK%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;1195&quot; height=&quot;205&quot; data-origin-width=&quot;1195&quot; data-origin-height=&quot;205&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;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;접근방법&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://uoohlz.tistory.com/entry/BOJ%EB%B0%B1%EC%A4%80silver2-11053-%EA%B0%80%EC%9E%A5-%EA%B8%B4-%EC%A6%9D%EA%B0%80%ED%95%98%EB%8A%94-%EB%B6%80%EB%B6%84-%EC%88%98%EC%97%B4Kotlin&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;11053. 가장 긴 증가하는 부분 수열&lt;/a&gt;의 응용문제로 수열을 출력하는 것만 설명하려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;(가장 긴 수열의 길이 구하는 자세한 설명은 앞의 링크 참고)&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 문제는 가장 긴 증가하는 부분 수열의 길이를 출력하면 되는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 가장 긴 증가하는 부분 수열도 출력해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제를 봤을 때 별로 어려운게 없는 것 같은데 gold4 난이도라서 의아했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부분 수열의 길이를 저장해놓은 dp 배열이 있으니까&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dp를 구하고 0부터 반복문 돌려서 cnt를 늘려가며 출력하면 되는거 아닌가?&lt;/p&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_1675253549509&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.*

fun main(){
    val N = readLine()!!.toInt()
    val input = readLine()!!.split(&quot; &quot;).map{it.toInt()}
    val dp = IntArray(N){1}
    
    for(i in 1 until N){
        for(j in 0 until i){
            if(input[j] &amp;lt; input[i]) dp[i] = maxOf(dp[i], dp[j]+1)
        }
    }
    println(dp.maxOrNull())
    var cnt = 1
    for(i in 0 until N){
        if(dp[i] == cnt){
            cnt++
            print(&quot;${input[i]} &quot;)
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과는 틀렸다. 처음에는 왜 틀렸는지 몰랐다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제에 있는 입출력과 똑같았기 때문,,,&lt;/p&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&gt;&lt;code&gt;5
1 4 2 3 5&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 입력이 주어지면 출력은&amp;nbsp;&lt;/p&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1 4 3 5&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자,, 이제 문제가 무엇인지 보일것이다...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 긴 증가하는 부분 수열은 1 2 3 5로 출력되어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 dp[1]과 dp[2]가 모두 2인데, 0부터 반복문을 돌리게 되면 앞에있는 4가 먼저 출력되고, 2는 출력되지 않게된다.&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;따라서 반복문을 0부터 시작하는 것이 아닌, 뒤에서부터 시작하면서 역추적해야하는 것이다!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뒤에서부터 추적하기 때문에 해당 수열값을 stack에 저장한 후에 추적이 완료되면 하나씩 꺼내면서 출력해주었다&lt;/p&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1675185248802&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.*

fun main(){
    val N = readLine()!!.toInt()
    val input = readLine()!!.split(&quot; &quot;).map{it.toInt()}
    val dp = IntArray(N){1}
    
    for(i in 1 until N){
        for(j in 0 until i){
            if(input[j] &amp;lt; input[i]) dp[i] = maxOf(dp[i], dp[j]+1)
        }
    }
    
    var cnt = dp.maxOrNull()
    println(cnt)
    val stack = Stack&amp;lt;Int&amp;gt;()
    for(i in N-1 downTo (0)){
        if(dp[i] == cnt){
            cnt--
            stack.push(input[i])
        }
    }
    
    while(stack.isNotEmpty()) {
        print(&quot;${stack.pop()} &quot;)
    }  
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/다이나믹프로그래밍</category>
      <category>dp</category>
      <category>LIS</category>
      <category>stack</category>
      <author>꼬물쥰</author>
      <guid isPermaLink="true">https://uoohlz.tistory.com/90</guid>
      <comments>https://uoohlz.tistory.com/entry/BOJ%EB%B0%B1%EC%A4%80Gold4-14002-%EA%B0%80%EC%9E%A5-%EA%B8%B4-%EC%A6%9D%EA%B0%80%ED%95%98%EB%8A%94-%EC%88%98%EC%97%B44#entry90comment</comments>
      <pubDate>Wed, 1 Feb 2023 02:15:14 +0900</pubDate>
    </item>
    <item>
      <title>[BOJ/백준][Silver2] 11722. 가장 긴 감소하는 부분 수열(Kotlin)</title>
      <link>https://uoohlz.tistory.com/entry/BOJ%EB%B0%B1%EC%A4%80silver2-11722-%EA%B0%80%EC%9E%A5-%EA%B8%B4-%EA%B0%90%EC%86%8C%ED%95%98%EB%8A%94-%EB%B6%80%EB%B6%84-%EC%88%98%EC%97%B4Kotlin</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/11053&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/11053&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1675184850399&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;11053번: 가장 긴 증가하는 부분 수열&quot; data-og-description=&quot;수열 A가 주어졌을 때, 가장 긴 증가하는&amp;nbsp;부분&amp;nbsp;수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분&amp;nbsp;수열은&amp;nbsp;A = {10, 20, 10, 30, 20, 50} 이&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/11053&quot; data-og-url=&quot;https://www.acmicpc.net/problem/11053&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b0ytpx/hyRsu22g2q/zE0Kkk2TNISPbHflz4ItY0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/11053&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/11053&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b0ytpx/hyRsu22g2q/zE0Kkk2TNISPbHflz4ItY0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&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;11053번: 가장 긴 증가하는 부분 수열&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;수열 A가 주어졌을 때, 가장 긴 증가하는&amp;nbsp;부분&amp;nbsp;수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분&amp;nbsp;수열은&amp;nbsp;A = {10, 20, 10, 30, 20, 50} 이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&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;div id=&quot;problem-body&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수열 A가 주어졌을 때, 가장 긴 감소하는&amp;nbsp;부분&amp;nbsp;수열을 구하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 수열 A = {10, 30, 10, 20, 20, 10} 인 경우에 가장 긴 감소하는 부분&amp;nbsp;수열은&amp;nbsp;A = {10,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;30&lt;/b&gt;, 10,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;20&lt;/b&gt;, 20,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;10&lt;/b&gt;}&amp;nbsp; 이고, 길이는 3이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;입출력&lt;/b&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[입력]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;첫째 줄에 수열 A의 크기 N (1 &amp;le; N &amp;le; 1,000)이 주어진다.&lt;/span&gt;&lt;/p&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 &amp;le; Ai&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;le; 1,000)&lt;/p&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: #555555;&quot;&gt;첫째 줄에 수열 A의 가장 긴 감소하는 부분 수열의 길이를 출력한다.&lt;/span&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;167&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKlWLp/btrXJ2MAsm1/eYGnQNUkFneh5y9LxckNk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKlWLp/btrXJ2MAsm1/eYGnQNUkFneh5y9LxckNk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKlWLp/btrXJ2MAsm1/eYGnQNUkFneh5y9LxckNk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKlWLp%2FbtrXJ2MAsm1%2FeYGnQNUkFneh5y9LxckNk0%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;952&quot; height=&quot;167&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;167&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;접근방법&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://uoohlz.tistory.com/entry/BOJ%EB%B0%B1%EC%A4%80silver2-11053-%EA%B0%80%EC%9E%A5-%EA%B8%B4-%EC%A6%9D%EA%B0%80%ED%95%98%EB%8A%94-%EB%B6%80%EB%B6%84-%EC%88%98%EC%97%B4Kotlin&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;이전 게시물&lt;/a&gt;에 아주 자세히 설명해놨으니 참고하면 될 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에서 조건문부분만 변경하면 끝이다.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1675184806081&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.*

fun main(){
    val N = readLine()!!.toInt()
    val input = readLine()!!.split(&quot; &quot;).map{it.toInt()}
    val dp = IntArray(N){1}
    for(i in 1 until N){
        for(j in 0 until i){
            if(input[i] &amp;lt; input[j]){
                dp[i] = maxOf(dp[i], dp[j]+1)
            }
        }
    }
    println(dp.maxOrNull())
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</description>
      <category>알고리즘/다이나믹프로그래밍</category>
      <category>dp</category>
      <category>LIS</category>
      <author>꼬물쥰</author>
      <guid isPermaLink="true">https://uoohlz.tistory.com/89</guid>
      <comments>https://uoohlz.tistory.com/entry/BOJ%EB%B0%B1%EC%A4%80silver2-11722-%EA%B0%80%EC%9E%A5-%EA%B8%B4-%EA%B0%90%EC%86%8C%ED%95%98%EB%8A%94-%EB%B6%80%EB%B6%84-%EC%88%98%EC%97%B4Kotlin#entry89comment</comments>
      <pubDate>Wed, 1 Feb 2023 02:11:15 +0900</pubDate>
    </item>
    <item>
      <title>[BOJ/백준][Silver2] 11053. 가장 긴 증가하는 부분 수열(Kotlin)</title>
      <link>https://uoohlz.tistory.com/entry/BOJ%EB%B0%B1%EC%A4%80silver2-11053-%EA%B0%80%EC%9E%A5-%EA%B8%B4-%EC%A6%9D%EA%B0%80%ED%95%98%EB%8A%94-%EB%B6%80%EB%B6%84-%EC%88%98%EC%97%B4Kotlin</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/11053&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/11053&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1675184850399&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;11053번: 가장 긴 증가하는 부분 수열&quot; data-og-description=&quot;수열 A가 주어졌을 때, 가장 긴 증가하는&amp;nbsp;부분&amp;nbsp;수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분&amp;nbsp;수열은&amp;nbsp;A = {10, 20, 10, 30, 20, 50} 이&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/11053&quot; data-og-url=&quot;https://www.acmicpc.net/problem/11053&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b0ytpx/hyRsu22g2q/zE0Kkk2TNISPbHflz4ItY0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/11053&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/11053&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b0ytpx/hyRsu22g2q/zE0Kkk2TNISPbHflz4ItY0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&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;11053번: 가장 긴 증가하는 부분 수열&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;수열 A가 주어졌을 때, 가장 긴 증가하는&amp;nbsp;부분&amp;nbsp;수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분&amp;nbsp;수열은&amp;nbsp;A = {10, 20, 10, 30, 20, 50} 이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&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;div id=&quot;problem-body&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수열 A가 주어졌을 때, 가장 긴 증가하는&amp;nbsp;부분&amp;nbsp;수열을 구하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분&amp;nbsp;수열은&amp;nbsp;A = {&lt;b&gt;10&lt;/b&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;20&lt;/b&gt;, 10,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;30&lt;/b&gt;, 20,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;50&lt;/b&gt;} 이고, 길이는 4이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;입출력&lt;/b&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[입력]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;첫째 줄에 수열 A의 크기 N (1 &amp;le; N &amp;le; 1,000)이 주어진다.&lt;/span&gt;&lt;/p&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 &amp;le; Ai&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;le; 1,000)&lt;/p&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: #555555;&quot;&gt;첫째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력한다.&lt;/span&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;175&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KlfDr/btrXIjBxqUT/KRE3pfnmTfdWC5HenIWYRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KlfDr/btrXIjBxqUT/KRE3pfnmTfdWC5HenIWYRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KlfDr/btrXIjBxqUT/KRE3pfnmTfdWC5HenIWYRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKlfDr%2FbtrXIjBxqUT%2FKRE3pfnmTfdWC5HenIWYRk%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;962&quot; height=&quot;175&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;175&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;접근방법&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 input[i]를 마지막 값으로 가지는 가장 긴 증가부분수열의(LIS) 길이를 담을 dp배열을 생성해준다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dp[0]는 input[0]를 마지막 값으로 가지는 LIS 길이이므로 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;이중 for문을 이용해 input[i]가 이전값(input[j])보다 크다면 dp[i]값을 초기화해주는 방식이다&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;i = 0일때는 수열이 10 하나이므로 dp[i]는 1이기때문에 반복문 범위에 넣지 않아도 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(dp 배열 생성시 값을 1로 초기화해주기 때문)&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 51px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 105.703px; text-align: center; height: 17px;&quot;&gt;i&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; text-align: center; height: 17px;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; text-align: center; height: 17px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; text-align: center; height: 17px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; text-align: center; height: 17px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; text-align: center; height: 17px;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 105.781px; text-align: center; height: 17px;&quot;&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 105.703px; text-align: center; height: 17px;&quot;&gt;input[i]&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; text-align: center; height: 17px;&quot;&gt;10&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; text-align: center; height: 17px;&quot;&gt;20&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; text-align: center; height: 17px;&quot;&gt;10&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; text-align: center; height: 17px;&quot;&gt;30&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; text-align: center; height: 17px;&quot;&gt;20&lt;/td&gt;
&lt;td style=&quot;width: 105.781px; text-align: center; height: 17px;&quot;&gt;50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 105.703px; text-align: center; height: 17px;&quot;&gt;dp[i]&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; text-align: center; height: 17px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; text-align: center; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; text-align: center; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; text-align: center; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; text-align: center; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 105.781px; text-align: center; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;i = 1일때, input[i] = 20, 이전값은 10이므로 input[i]가 더 크다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 수열의 가장 마지막에 20이 올 수 있으므로 dp[i] = dp[j] + 1이 된다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 51px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;i&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 105.781px; height: 17px; text-align: center;&quot;&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;input[i]&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;10&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;20&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;10&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;30&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;20&lt;/td&gt;
&lt;td style=&quot;width: 105.781px; height: 17px; text-align: center;&quot;&gt;50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;dp[i]&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;2&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 105.781px; height: 17px; text-align: center;&quot;&gt;&amp;nbsp;&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;i = 2일때, input[i] = 10이고 이는 이전값 10, 20보다 크지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 input[2]가 수열의 마지막에 있을경우 길이는 1이다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 51px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;i&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;2&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 105.781px; height: 17px; text-align: center;&quot;&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;input[i]&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;10&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;20&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;10&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;30&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;20&lt;/td&gt;
&lt;td style=&quot;width: 105.781px; height: 17px; text-align: center;&quot;&gt;50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;dp[i]&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 105.781px; height: 17px; text-align: center;&quot;&gt;&amp;nbsp;&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;i = 3일때, input[i] = 30이고 이전값 10과 20 뒤에 붙을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부 for문을 통해 dp값 중 가장 큰 값에 +1 해준 것이 dp[i]가 되겠다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 maxOf(dp[i], dp[j] +1)로 큰 값을 구해주었다&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 51px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;i&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;3&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 105.781px; height: 17px; text-align: center;&quot;&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;input[i]&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;10&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;20&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;10&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;30&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;20&lt;/td&gt;
&lt;td style=&quot;width: 105.781px; height: 17px; text-align: center;&quot;&gt;50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;dp[i]&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;3&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 105.781px; height: 17px; text-align: center;&quot;&gt;&amp;nbsp;&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;i = 4일때, input[i] = 20이고 이전값 중 10보다 크기때문에 10 뒤에 붙을 수 있다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 51px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;i&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;4&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 105.781px; height: 17px; text-align: center;&quot;&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;input[i]&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;10&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;20&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;10&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;30&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;20&lt;/td&gt;
&lt;td style=&quot;width: 105.781px; height: 17px; text-align: center;&quot;&gt;50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;dp[i]&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;2&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 105.781px; height: 17px; text-align: center;&quot;&gt;&amp;nbsp;&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;이쯤되면 다들 이해했을거라고 생각하고 마지막 i = 5일때 dp를 구해보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;i = 5일때, input[i] = 50이고, 이전값 중 10, 20, 30 뒤에 붙을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 dp = 4&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 51px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;i&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 105.781px; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;5&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;input[i]&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;10&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;20&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;10&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;30&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;20&lt;/td&gt;
&lt;td style=&quot;width: 105.781px; height: 17px; text-align: center;&quot;&gt;50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;dp[i]&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 105.703px; height: 17px; text-align: center;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 105.781px; height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;4&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div id=&quot;problem_output&quot;&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1675184806081&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.*

fun main(){
    val sc = Scanner(System.`in`)
    val N = readLine()!!.toInt()
    val input = readLine()!!.split(&quot; &quot;).map{it.toInt()} 
    //dp[i] : input[i]를 마지막 값으로 가지는 가장 긴 증가부분수열의 길이
    val dp = IntArray(N){1}
    for(i in 1 until N){
        for(j in 0 until i){
            if(input[j] &amp;lt; input[i]) dp[i] = maxOf(dp[i], dp[j]+1)
        }
    } 
    println(dp.maxOrNull())
}&lt;/code&gt;&lt;/pre&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;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://namu.wiki/w/%EC%B5%9C%EC%9E%A5%20%EC%A6%9D%EA%B0%80%20%EB%B6%80%EB%B6%84%20%EC%88%98%EC%97%B4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://namu.wiki/w/%EC%B5%9C%EC%9E%A5%20%EC%A6%9D%EA%B0%80%20%EB%B6%80%EB%B6%84%20%EC%88%98%EC%97%B4&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1675185537979&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;최장 증가 부분 수열 - 나무위키&quot; data-og-description=&quot;어떤 임의의 수열이 주어질 때, 이 수열에서 몇 개의 수들을 제거해서 부분수열을 만들 수 있다. 이때 만들어진 부분수열 중 오름차순으로 정렬된 가장 긴 수열을 최장 증가 부분 수열이라 한다.&quot; data-og-host=&quot;namu.wiki&quot; data-og-source-url=&quot;https://namu.wiki/w/%EC%B5%9C%EC%9E%A5%20%EC%A6%9D%EA%B0%80%20%EB%B6%80%EB%B6%84%20%EC%88%98%EC%97%B4&quot; data-og-url=&quot;https://namu.wiki/w/%EC%B5%9C%EC%9E%A5%20%EC%A6%9D%EA%B0%80%20%EB%B6%80%EB%B6%84%20%EC%88%98%EC%97%B4&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://namu.wiki/w/%EC%B5%9C%EC%9E%A5%20%EC%A6%9D%EA%B0%80%20%EB%B6%80%EB%B6%84%20%EC%88%98%EC%97%B4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://namu.wiki/w/%EC%B5%9C%EC%9E%A5%20%EC%A6%9D%EA%B0%80%20%EB%B6%80%EB%B6%84%20%EC%88%98%EC%97%B4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;최장 증가 부분 수열 - 나무위키&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;어떤 임의의 수열이 주어질 때, 이 수열에서 몇 개의 수들을 제거해서 부분수열을 만들 수 있다. 이때 만들어진 부분수열 중 오름차순으로 정렬된 가장 긴 수열을 최장 증가 부분 수열이라 한다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;namu.wiki&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>알고리즘/다이나믹프로그래밍</category>
      <category>dp</category>
      <category>LIS</category>
      <author>꼬물쥰</author>
      <guid isPermaLink="true">https://uoohlz.tistory.com/88</guid>
      <comments>https://uoohlz.tistory.com/entry/BOJ%EB%B0%B1%EC%A4%80silver2-11053-%EA%B0%80%EC%9E%A5-%EA%B8%B4-%EC%A6%9D%EA%B0%80%ED%95%98%EB%8A%94-%EB%B6%80%EB%B6%84-%EC%88%98%EC%97%B4Kotlin#entry88comment</comments>
      <pubDate>Wed, 1 Feb 2023 02:08:03 +0900</pubDate>
    </item>
    <item>
      <title>[git] refusing to allow a Personal Access Token to create or update workflow ~ without `workflow` scope 에러해결</title>
      <link>https://uoohlz.tistory.com/entry/git-refusing-to-allow-a-Personal-Access-Token-to-create-or-update-workflow-without-workflow-scope-%EC%97%90%EB%9F%AC%ED%95%B4%EA%B2%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;작업을 완료하고 git push를 하는데 remote rejected라는 문구와 함께 아래와 같은 에러가 발생했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;95&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bM3FSj/btrW9qn3IQz/aHBK2bbC3Ix13F7Y0AgaIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bM3FSj/btrW9qn3IQz/aHBK2bbC3Ix13F7Y0AgaIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bM3FSj/btrW9qn3IQz/aHBK2bbC3Ix13F7Y0AgaIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbM3FSj%2FbtrW9qn3IQz%2FaHBK2bbC3Ix13F7Y0AgaIk%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;715&quot; height=&quot;95&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;95&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;발생이유&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;깃허브 블로그를 만들고 jekyll theme를 적용하려고 yml파일을 업로드하려고 하니 에러가 발생했다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;에러메시지는 발급받은 Access token으로는 workflow에 접근하지 못한다는 오류이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;-&amp;gt; 사용하고 있는 Personal Access Token에는 scope에 workflow가 빠져있는데, 해당 레포지토리에 github workflow설정이 되어있는 경우에 권한이 없다는 에러가 발생하는 것이다.&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;b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;해결방법&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;토큰의 scope만 변경해주면 된다&amp;gt;&amp;lt;&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;a href=&quot;https://github.com/settings/tokens&quot;&gt;github.com/settings/tokens&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 이 링크로 들어가서 사용중인 토큰을 선택한다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHUSlT/btrW37W6SRD/vkCnkkyWLXpHKi7HePlaJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHUSlT/btrW37W6SRD/vkCnkkyWLXpHKi7HePlaJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHUSlT/btrW37W6SRD/vkCnkkyWLXpHKi7HePlaJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHUSlT%2FbtrW37W6SRD%2FvkCnkkyWLXpHKi7HePlaJ1%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;374&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 사진처럼 해당 &lt;span style=&quot;background-color: #ffffff;&quot;&gt;Personal Access Token&lt;/span&gt; 설정에 들어가서 workflow에 체크하고, 업데이트 해주면 끝이다.&lt;/p&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;이렇게 스코프를 변경해주고 다시 bash에서 push를 하니까 잘 된다 ㅎ.ㅎ&lt;/p&gt;</description>
      <category>ect</category>
      <category>Git</category>
      <category>에러해결</category>
      <author>꼬물쥰</author>
      <guid isPermaLink="true">https://uoohlz.tistory.com/87</guid>
      <comments>https://uoohlz.tistory.com/entry/git-refusing-to-allow-a-Personal-Access-Token-to-create-or-update-workflow-without-workflow-scope-%EC%97%90%EB%9F%AC%ED%95%B4%EA%B2%B0#entry87comment</comments>
      <pubDate>Wed, 25 Jan 2023 21:31:43 +0900</pubDate>
    </item>
    <item>
      <title>[Android] Charles를 이용한 웹 디버깅</title>
      <link>https://uoohlz.tistory.com/entry/Android-Charles%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9B%B9-%EB%94%94%EB%B2%84%EA%B9%85</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Charles?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #3c4858;&quot;&gt;웹 디버깅 프록시 프로그램으로 HTTP 프록시 / HTTP 모니터링 / 역방향 프록시로서 개발자가 자신의 기기의 모든 HTTP 및 SSL / HTTPS 트래픽을 볼 수 있도록 해준다. 여기에는 Request / Response 및 HTTP 헤더 (쿠키 및 캐싱 정보 포함)가 포함된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhZXUx/btrVK1BVIrX/IAq7kQ06KoOLJJVFkkFISk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhZXUx/btrVK1BVIrX/IAq7kQ06KoOLJJVFkkFISk/img.jpg&quot; data-alt=&quot;Charles 로고가 예쁘게 생겼다,,,,ㅎ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhZXUx/btrVK1BVIrX/IAq7kQ06KoOLJJVFkkFISk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhZXUx%2FbtrVK1BVIrX%2FIAq7kQ06KoOLJJVFkkFISk%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;225&quot; height=&quot;225&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Charles 로고가 예쁘게 생겼다,,,,ㅎ&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;안드로이드 연결 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 &lt;a href=&quot;https://www.charlesproxy.com/download/&quot;&gt;https://www.charlesproxy.com/download/&lt;/a&gt; 에서 프로그램을 다운받고 실행한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;685&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cU0Wrj/btrVBoSHa3K/7pj7a108ebHq0GGaCM5yp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cU0Wrj/btrVBoSHa3K/7pj7a108ebHq0GGaCM5yp0/img.png&quot; data-alt=&quot;Charles 실행화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cU0Wrj/btrVBoSHa3K/7pj7a108ebHq0GGaCM5yp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcU0Wrj%2FbtrVBoSHa3K%2F7pj7a108ebHq0GGaCM5yp0%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;652&quot; height=&quot;509&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;685&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Charles 실행화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안드로이드 기기와 연결하기 위해서 Help &amp;gt; Local IP Address를 클릭한다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;685&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/099Gc/btrVBRtNR7O/Wd8QU8KqHDs1eukatbznQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/099Gc/btrVBRtNR7O/Wd8QU8KqHDs1eukatbznQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/099Gc/btrVBRtNR7O/Wd8QU8KqHDs1eukatbznQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F099Gc%2FbtrVBRtNR7O%2FWd8QU8KqHDs1eukatbznQK%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;640&quot; height=&quot;497&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;685&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 IP 주소가 나오는데 이 IP주소를 잘 알아두자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안드로이드 기기에서 현재 pc에 연결된 wifi와 같은 wifi를 클릭하여 네트워크 설정화면으로 이동한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크 설정부분으로 들어가게되면 프록시 설정하는 부분이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프록시 설정을 설정안함에서 수동으로 변경해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czHEj2/btrVAulBGNN/8mAMhGbly6TUB59habpzV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czHEj2/btrVAulBGNN/8mAMhGbly6TUB59habpzV1/img.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1081&quot; data-is-animation=&quot;false&quot; width=&quot;386&quot; height=&quot;386&quot; style=&quot;width: 49.3957%; margin-right: 10px;&quot; data-widthpercent=&quot;49.98&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czHEj2/btrVAulBGNN/8mAMhGbly6TUB59habpzV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczHEj2%2FbtrVAulBGNN%2F8mAMhGbly6TUB59habpzV1%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;1080&quot; height=&quot;1081&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vUPaS/btrVG0pYs3f/vLfikcbqiowiDg9ykZ524k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vUPaS/btrVG0pYs3f/vLfikcbqiowiDg9ykZ524k/img.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.4415%;&quot; data-widthpercent=&quot;50.02&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vUPaS/btrVG0pYs3f/vLfikcbqiowiDg9ykZ524k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvUPaS%2FbtrVG0pYs3f%2FvLfikcbqiowiDg9ykZ524k%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;1080&quot; height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아까 확인한 IP주소를 호스트 이름에 넣고, 포트에 8888입력후 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼이제 안드로이드 기기에서 네트워크 요청/응답이 이뤄지면 모든 기록이 Charles에 남게 된다.&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;안드로이드 기기에서 웹브라우저를 열어 Charles연결된 상태로 &lt;span style=&quot;background-color: #ffffff; color: #3c4858;&quot;&gt;&lt;a href=&quot;http://charlesproxy.com/getssl&quot;&gt;http://charlesproxy.com/getssl&lt;/a&gt;&lt;/span&gt; 에 접속한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 인증서가 자동으로 다운로드 된다. 하지만 나는 &quot;&lt;b&gt;CA 인증서를 설치할 수 없음&quot;&lt;/b&gt; 이라는 메시지가 떴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 &lt;b&gt;설정 &amp;gt; 생체인식 및 보안 &amp;gt; 기타 보안 설정 &amp;gt; 기기에 저장된 인증서 설치 &amp;gt; CA 인증서&lt;/b&gt; 로 이동해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수동으로 설치하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음에는 이렇게 연결한 Charles를 이용하여 api 통신시 데이터를 확인하는 방법을 가지고 오겠다..!&lt;/p&gt;</description>
      <category>오늘의 공부는?!/Android</category>
      <category>Charles</category>
      <category>웹디버깅</category>
      <author>꼬물쥰</author>
      <guid isPermaLink="true">https://uoohlz.tistory.com/85</guid>
      <comments>https://uoohlz.tistory.com/entry/Android-Charles%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9B%B9-%EB%94%94%EB%B2%84%EA%B9%85#entry85comment</comments>
      <pubDate>Mon, 9 Jan 2023 02:20:34 +0900</pubDate>
    </item>
    <item>
      <title>[끄적끄적] 매개변수와 인수</title>
      <link>https://uoohlz.tistory.com/entry/%EB%81%84%EC%A0%81%EB%81%84%EC%A0%81-%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98%EC%99%80-%EC%9D%B8%EC%88%98</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;매개변수와 인수는 같은 의미로 사용하나, 서로 다른 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수를 &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;정의&lt;/span&gt;할 때 함수에 전달하는 것은 &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;매개변수&lt;/span&gt;이고,,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수를 &lt;span style=&quot;background-color: #99cefa;&quot;&gt;호출&lt;/span&gt;할 때 매개변수를 위해 전달하는 것이 &lt;span style=&quot;background-color: #99cefa;&quot;&gt;인수&lt;/span&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 매개변수는 함수가 액세스할 수 있는 변수이고, 인수는 사용자가 실제로 전달하는 값&lt;/p&gt;</description>
      <category>ect</category>
      <author>꼬물쥰</author>
      <guid isPermaLink="true">https://uoohlz.tistory.com/83</guid>
      <comments>https://uoohlz.tistory.com/entry/%EB%81%84%EC%A0%81%EB%81%84%EC%A0%81-%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98%EC%99%80-%EC%9D%B8%EC%88%98#entry83comment</comments>
      <pubDate>Wed, 16 Nov 2022 21:18:46 +0900</pubDate>
    </item>
  </channel>
</rss>