<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>도전하고 기록하기</title>
    <link>https://hyojun.tistory.com/</link>
    <description>나중에 다시 보기 위해 기록하는 블로그</description>
    <language>ko</language>
    <pubDate>Tue, 23 Jun 2026 08:04:46 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>HYOJUN</managingEditor>
    <item>
      <title>[LeetCode] 661. Image Smoother - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-661-Image-Smoother-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/image-smoother/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://leetcode.com/problems/image-smoother/description/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1702951335567&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;Image Smoother - LeetCode&quot; data-og-description=&quot;Can you solve this real interview question? Image Smoother - An image smoother is a filter of the size 3 x 3 that can be applied to each cell of an image by rounding down the average of the cell and the eight surrounding cells (i.e., the average of the nin&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/image-smoother/description/&quot; data-og-url=&quot;https://leetcode.com/problems/image-smoother/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bgce01/hyUL6d4EM8/rIqKTk5kku5QKpSVF6k9mk/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/image-smoother/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/image-smoother/description/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bgce01/hyUL6d4EM8/rIqKTk5kku5QKpSVF6k9mk/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Image Smoother - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Can you solve this real interview question? Image Smoother - An image smoother is a filter of the size 3 x 3 that can be applied to each cell of an image by rounding down the average of the cell and the eight surrounding cells (i.e., the average of the nin&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;An&amp;nbsp;image&amp;nbsp;smoother&amp;nbsp;is&amp;nbsp;a&amp;nbsp;filter&amp;nbsp;of&amp;nbsp;the&amp;nbsp;size&amp;nbsp;3&amp;nbsp;x&amp;nbsp;3&amp;nbsp;that&amp;nbsp;can&amp;nbsp;be&amp;nbsp;applied&amp;nbsp;to&amp;nbsp;each&amp;nbsp;cell&amp;nbsp;of&amp;nbsp;an&amp;nbsp;image&amp;nbsp;by&amp;nbsp;rounding&amp;nbsp;down&amp;nbsp;the&amp;nbsp;average&amp;nbsp;of&amp;nbsp;the&amp;nbsp;cell&amp;nbsp;and&amp;nbsp;the&amp;nbsp;eight&amp;nbsp;surrounding&amp;nbsp;cells&amp;nbsp;(i.e.,&amp;nbsp;the&amp;nbsp;average&amp;nbsp;of&amp;nbsp;the&amp;nbsp;nine&amp;nbsp;cells&amp;nbsp;in&amp;nbsp;the&amp;nbsp;blue&amp;nbsp;smoother).&amp;nbsp;If&amp;nbsp;one&amp;nbsp;or&amp;nbsp;more&amp;nbsp;of&amp;nbsp;the&amp;nbsp;surrounding&amp;nbsp;cells&amp;nbsp;of&amp;nbsp;a&amp;nbsp;cell&amp;nbsp;is&amp;nbsp;not&amp;nbsp;present,&amp;nbsp;we&amp;nbsp;do&amp;nbsp;not&amp;nbsp;consider&amp;nbsp;it&amp;nbsp;in&amp;nbsp;the&amp;nbsp;average&amp;nbsp;(i.e.,&amp;nbsp;the&amp;nbsp;average&amp;nbsp;of&amp;nbsp;the&amp;nbsp;four&amp;nbsp;cells&amp;nbsp;in&amp;nbsp;the&amp;nbsp;red&amp;nbsp;smoother).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Given&amp;nbsp;an&amp;nbsp;m&amp;nbsp;x&amp;nbsp;n&amp;nbsp;integer&amp;nbsp;matrix&amp;nbsp;img&amp;nbsp;representing&amp;nbsp;the&amp;nbsp;grayscale&amp;nbsp;of&amp;nbsp;an&amp;nbsp;image,&amp;nbsp;return&amp;nbsp;the&amp;nbsp;image&amp;nbsp;after&amp;nbsp;applying&amp;nbsp;the&amp;nbsp;smoother&amp;nbsp;on&amp;nbsp;each&amp;nbsp;cell&amp;nbsp;of&amp;nbsp;it.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1702951446515&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: img = [[1,1,1],[1,0,1],[1,1,1]]
Output: [[0,0,0],[0,0,0],[0,0,0]]
Explanation:
For the points (0,0), (0,2), (2,0), (2,2): floor(3/4) = floor(0.75) = 0
For the points (0,1), (1,0), (1,2), (2,1): floor(5/6) = floor(0.83333333) = 0
For the point (1,1): floor(8/9) = floor(0.88888889) = 0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1702951462058&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: img = [[100,200,100],[200,50,200],[100,200,100]]
Output: [[137,141,137],[141,138,141],[137,141,137]]
Explanation:
For the points (0,0), (0,2), (2,0), (2,2): floor((100+200+200+50)/4) = floor(137.5) = 137
For the points (0,1), (1,0), (1,2), (2,1): floor((200+200+50+200+100+100)/6) = floor(141.666667) = 141
For the point (1,1): floor((50+200+200+200+200+100+100+100+100)/9) = floor(138.888889) = 138&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;image smoother는 이미지의 각 셀에 대해서 자신을 포함한 주변 3x3 크기의 정사각형 영역의 값의 평균을 구하여 현재 셀에 할당하도록 하는 필터이다. 이 때 3x3 크기의 정사각형안에 셀이 존재하지 않는 경우 해당 셀은 평균에 포함되지 않는 것으로 간주한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;m x n 사이즈의 정수 배열 img가 주어졌을 때 image smoother 필터를 적용한 결과값을 return하는 문제이다.&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;먼저 결과값을 배열을 선언하고 img와 같은 크기로 초기화한다.&lt;/p&gt;
&lt;pre id=&quot;code_1702951985341&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int[][] result = new int[img.length][img[0].length];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 셀에 대해서 주변 셀을 탐색하기 위해 각 방향의 좌표 이동값을 정의한다.&lt;br /&gt;(현재 좌표 기준 앞에서 부터 차례대로 왼쪽 위, 가운데 위, 오른쪽 위, 왼쪽, 오른쪽, 왼쪽 아래, 가운데 아래, 오른쪽 아래)&lt;/p&gt;
&lt;pre id=&quot;code_1702952030464&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 각 방향의 좌표 이동값 ( top left, top center, top right, left, right, bottom left, bottom center, bottom right )
int directions[][] = {{-1,-1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1}};&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;반복문을 통해 img 배열의 각 셀에 대해서 탐색한다.&lt;br /&gt;주변 값의 평균을 구하기 위해 주변 셀 값의 합을 담을 sum과 주변 셀 개수의 합을 담을 cnt 변수를 선언한다.&lt;br /&gt;초기값은 각각 현재 탐색 중인 셀 값과 그 개수인 1로 초기화한다.&lt;/p&gt;
&lt;pre id=&quot;code_1702952187676&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 각 셀에 대해서 탐색
for(int row = 0; row &amp;lt; img.length; row++) {
    for(int col = 0; col &amp;lt; img[0].length; col++) {
        // 주변 셀 값의 합 ( 초기값 = 현재 탐색 중인 셀 값 )
        int sum = img[row][col];
        // 주변 셀 개수 합 ( 초기값 = 현재 탐색 중인 셀 = 1 )
        int cnt = 1;
        
        ...
    }
}&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;이후 각 방향에 대해 탐색하는데 만약 이동한 좌표에 해당하는 셀이 배열을 벗어나는 경우는 탐색을 제외하고, 그렇지 않은 경우에는 그 값을 sum에 더하고 cnt를 증가 시킨다.&lt;br /&gt;각 방향에 대한 탐색이 끝나면 sum을 cnt로 나누어 소수점을 버린 평균 값을 구하여 result 배열에 담는다. &lt;/p&gt;
&lt;pre id=&quot;code_1702952313240&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 각 방향에 대해 탐색
for(int[] dir : directions) {
    int curRow = row + dir[0];
    int curCol = col + dir[1];

    // 좌표가 배열을 벗어나는 경우 탐색 제외
    if(curRow &amp;lt; 0 || curCol &amp;lt; 0 || curRow &amp;gt;= img.length || curCol &amp;gt;= img[0].length) continue;

    sum += img[curRow][curCol];
    cnt++;
}

result[row][col] = sum / cnt;&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;모든 셀에 대한 탐색이 끝나면 완성된 result 배열을 return한다.&lt;/p&gt;
&lt;pre id=&quot;code_1702952408607&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;return result;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1702951922859&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int[][] imageSmoother(int[][] img) {
        int[][] result = new int[img.length][img[0].length];
        // 각 방향의 좌표 이동값 ( top left, top center, top right, left, right, bottom left, bottom center, bottom right )
        int directions[][] = {{-1,-1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1}};

        // 각 셀에 대해서 탐색
        for(int row = 0; row &amp;lt; img.length; row++) {
            for(int col = 0; col &amp;lt; img[0].length; col++) {
                // 주변 셀 값의 합 ( 초기값 = 현재 탐색 중인 셀 값 )
                int sum = img[row][col];
                // 주변 셀 개수 합 ( 초기값 = 현재 탐색 중인 셀 = 1 )
                int cnt = 1;
                // 각 방향에 대해 탐색
                for(int[] dir : directions) {
                    int curRow = row + dir[0];
                    int curCol = col + dir[1];

                    // 좌표가 배열을 벗어나는 경우 탐색 제외
                    if(curRow &amp;lt; 0 || curCol &amp;lt; 0 || curRow &amp;gt;= img.length || curCol &amp;gt;= img[0].length) continue;

                    sum += img[curRow][curCol];
                    cnt++;
                }

                result[row][col] = sum / cnt;
            }
        }

        return result;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>Algorithm</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>알고리즘</category>
      <category>자바</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/174</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-661-Image-Smoother-Java#entry174comment</comments>
      <pubDate>Tue, 19 Dec 2023 11:20:28 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 2483. Minimum Penalty for a Shop - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-2483-Minimum-Penalty-for-a-Shop-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/minimum-penalty-for-a-shop/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/minimum-penalty-for-a-shop/description/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1693286071940&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;Minimum Penalty for a Shop - LeetCode&quot; data-og-description=&quot;Can you solve this real interview question? Minimum Penalty for a Shop - You are given the customer visit log of a shop represented by a 0-indexed string customers consisting only of characters 'N' and 'Y': * if the ith character is 'Y', it means that cust&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/minimum-penalty-for-a-shop/description/&quot; data-og-url=&quot;https://leetcode.com/problems/minimum-penalty-for-a-shop/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/OGsA4/hyTL8ikDIk/c0IIrKJ8MzdUtoukZ8zpo0/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/minimum-penalty-for-a-shop/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/minimum-penalty-for-a-shop/description/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/OGsA4/hyTL8ikDIk/c0IIrKJ8MzdUtoukZ8zpo0/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Minimum Penalty for a Shop - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Can you solve this real interview question? Minimum Penalty for a Shop - You are given the customer visit log of a shop represented by a 0-indexed string customers consisting only of characters 'N' and 'Y': * if the ith character is 'Y', it means that cust&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;You are given the customer visit log of a shop represented by a 0-indexed string &lt;b&gt;customers&lt;/b&gt; consisting only of characters &lt;b&gt;'N'&lt;/b&gt; and &lt;b&gt;'Y'&lt;/b&gt;:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;if the &lt;b&gt;ith&lt;/b&gt; character is &lt;b&gt;'Y'&lt;/b&gt;, it means that customers come at the &lt;b&gt;ith&lt;/b&gt; hour&lt;/li&gt;
&lt;li&gt;whereas &lt;b&gt;'N'&lt;/b&gt; indicates that no customers come at the &lt;b&gt;ith&lt;/b&gt; hour.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;If&amp;nbsp;the&amp;nbsp;shop&amp;nbsp;closes&amp;nbsp;at&amp;nbsp;the&amp;nbsp;&lt;b&gt;jth&lt;/b&gt;&amp;nbsp;hour&amp;nbsp;(0&amp;nbsp;&amp;lt;=&amp;nbsp;j&amp;nbsp;&amp;lt;=&amp;nbsp;n),&amp;nbsp;the&amp;nbsp;&lt;b&gt;penalty&amp;nbsp;&lt;/b&gt;is calculated as follows:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;For every hour when the shop is open and no customers come, the penalty increases by &lt;b&gt;1&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;For every hour when the shop is closed and customers come, the penalty increases by &lt;b&gt;1&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;Return the earliest hour at which the shop must be closed to incur a minimum penalty.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Note&amp;nbsp;that&amp;nbsp;if&amp;nbsp;a&amp;nbsp;shop&amp;nbsp;closes&amp;nbsp;at&amp;nbsp;the&amp;nbsp;&lt;b&gt;jth&lt;/b&gt;&amp;nbsp;hour,&amp;nbsp;it&amp;nbsp;means&amp;nbsp;the&amp;nbsp;shop&amp;nbsp;is&amp;nbsp;closed&amp;nbsp;at&amp;nbsp;the&amp;nbsp;hour&lt;b&gt;&amp;nbsp;j&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1693286368762&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: customers = &quot;YYNY&quot;
Output: 2
Explanation: 
- Closing the shop at the 0th hour incurs in 1+1+0+1 = 3 penalty.
- Closing the shop at the 1st hour incurs in 0+1+0+1 = 2 penalty.
- Closing the shop at the 2nd hour incurs in 0+0+0+1 = 1 penalty.
- Closing the shop at the 3rd hour incurs in 0+0+1+1 = 2 penalty.
- Closing the shop at the 4th hour incurs in 0+0+1+0 = 1 penalty.
Closing the shop at 2nd or 4th hour gives a minimum penalty. Since 2 is earlier, the optimal closing time is 2.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1693286375746&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: customers = &quot;NNNNN&quot;
Output: 0
Explanation: It is best to close the shop at the 0th hour as no customers arrive.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 3:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1693286383282&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: customers = &quot;YYYY&quot;
Output: 4
Explanation: It is best to close the shop at the 4th hour as customers arrive at each hour.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1 &amp;lt;= customers.length &amp;lt;= 105&lt;/li&gt;
&lt;li&gt;customers&amp;nbsp;consists&amp;nbsp;only&amp;nbsp;of&amp;nbsp;characters&amp;nbsp;'Y'&amp;nbsp;and&amp;nbsp;'N'.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'N'과 'Y'로만 이루어진 문자열 customers가 주어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열 customers의 각 자리는 i번째 시간에 매장에 방문한 사람이 있는지 여부를 나타낸다. 즉 &quot;YYNY&quot;의 경우 0, 1, 3번째 시간에는 매장에 손님이 방문했고, 2번째 시간에는 손님이 방문하지 않았음을 뜻한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 특정 시간에 가게가 문을 닫는 경우 패널티가 발생 하는데 패널티는 다음과 같이 계산된다.&lt;br /&gt;가게의 문이 열려있는 동안 손님이 방문하지 않는 경우 패널티가 1 증가하고, 가게의 문이 닫혀 있는 동안 손님이 방문하는 경우 역시 패널티가 1 증가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 패널티를 가장 적게 받을 수 있는 폐점 시간 중 가장 이른 시간을 구하는 문제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 각 시간대의 방문 여부를 구하기 위해 문자열을 배열로 분리한다.&lt;/p&gt;
&lt;pre id=&quot;code_1693286683426&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 방문 로그를 분리
char[] visited = customers.toCharArray();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 각 시간대의 패널티, 최소 패널티, 최적 폐점 시간을 저장할 변수를 선언한다.&lt;/p&gt;
&lt;pre id=&quot;code_1693286715626&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 패널티
int penalty = 0;
// 최소 패널티
int minPenalty = 0;
// 최적 폐점 시간
int optimalClosingTime = 0;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 방문 로그를 탐색하는데 i번째 시간마다 폐점을 한다고 가정하고 패널티를 계산한다.&lt;br /&gt;i번째의 방문 여부가 'Y'인 경우 열려있는 동안 손님이 방문한 경우이므로 패널티를 감소하고,&lt;br /&gt;i번째의 방문 여부가 'N'인 경우 열려있는 동안 손님이 방문하지 않은 경우이므로 패널티를 증가한다.&lt;br /&gt;현재 패널티가 최소 패널티보다 작은 경우에는 최소 패널티와 최적 폐점 시간을 갱신해준다.&lt;br /&gt;단 탐색이 0번 인덱스부터 시작하였으므로 실제 'i번째' 에 해당하는 시간은 i + 1로 계산한다.&lt;/p&gt;
&lt;pre id=&quot;code_1693287027474&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for(int i = 0; i &amp;lt; visited.length; i++) {
    // i번째의 방문여부가 'Y'인 경우 패널티 감소
    if(visited[i] == 'Y') penalty--;
    // i번째의 방문여부가 'N'인 경우 패널티 증가
    else penalty++;

    // 현재 패널티가 최소 패널티보다 작은 경우
    // 최소 패널티 및 최적 폐점 시간 갱신
    if(penalty &amp;lt; minPenalty) {
        minPenalty = penalty;
        optimalClosingTime = i + 1;
    }
}&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;최종적으로 구해진 최소 패널티의 시간대를 return 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1693287238803&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 최소 패널티의 시간을 return
return optimalClosingTime;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1693286394162&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int bestClosingTime(String customers) {
        // 방문 로그를 분리
        char[] visited = customers.toCharArray();
        // 패널티
        int penalty = 0;
        // 최소 패널티
        int minPenalty = 0;
        // 최적 폐점 시간
        int optimalClosingTime = 0;
        
        for(int i = 0; i &amp;lt; visited.length; i++) {
            // i번째의 방문여부가 'Y'인 경우 패널티 감소
            if(visited[i] == 'Y') penalty--;
            // i번째의 방문여부가 'N'인 경우 패널티 증가
            else penalty++;
            
            // 현재 패널티가 최소 패널티보다 작은 경우
            // 최소 패널티 및 최적 폐점 시간 갱신
            if(penalty &amp;lt; minPenalty) {
                minPenalty = penalty;
                optimalClosingTime = i + 1;
            }
        }
        
        // 최소 패널티의 시간을 return
        return optimalClosingTime;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>Algorithm</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>자바</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/173</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-2483-Minimum-Penalty-for-a-Shop-Java#entry173comment</comments>
      <pubDate>Tue, 29 Aug 2023 14:34:04 +0900</pubDate>
    </item>
    <item>
      <title>[Node.js] Node.js + express를 사용한 서버 구성 시작하기</title>
      <link>https://hyojun.tistory.com/entry/Nodejs-Nodejs-express%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%9C-%EC%84%9C%EB%B2%84-%EA%B5%AC%EC%84%B1-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Node.js 프로젝트 생성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;express를 설치하고 사용하기 앞서 우선 Node.js를 설치하고 Node.js 프로젝트를 생성해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Node.js 사이트에서 운영체제에 맞는 원하는 버전의 Node.js를 다운로드 받을 수 있다.&lt;/p&gt;
&lt;figure id=&quot;og_1693044739493&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;Node.js&quot; data-og-description=&quot;Node.js&amp;reg; is a JavaScript runtime built on Chrome's V8 JavaScript engine.&quot; data-og-host=&quot;nodejs.org&quot; data-og-source-url=&quot;https://nodejs.org/ko&quot; data-og-url=&quot;https://nodejs.org/ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/HIgdW/hyTIIkE9mW/b3skp53rE5cSkLVISKgks1/img.png?width=224&amp;amp;height=256&amp;amp;face=0_0_224_256,https://scrap.kakaocdn.net/dn/vjZoR/hyTIQbV5BQ/kZHgKdNUfu8Zfkbs4eaPKK/img.png?width=224&amp;amp;height=256&amp;amp;face=0_0_224_256&quot;&gt;&lt;a href=&quot;https://nodejs.org/ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://nodejs.org/ko&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/HIgdW/hyTIIkE9mW/b3skp53rE5cSkLVISKgks1/img.png?width=224&amp;amp;height=256&amp;amp;face=0_0_224_256,https://scrap.kakaocdn.net/dn/vjZoR/hyTIQbV5BQ/kZHgKdNUfu8Zfkbs4eaPKK/img.png?width=224&amp;amp;height=256&amp;amp;face=0_0_224_256');&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;Node.js&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Node.js&amp;reg; is a JavaScript runtime built on Chrome's V8 JavaScript engine.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;nodejs.org&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;다음으로 프로젝트 대상 폴더에서 터미널에 아래 명령어를 입력하여 package.json 파일을 생성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1693045312267&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm init&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어를 입력하면 다음과 같은 기본적인 설정 정보들을 입력한다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;프로젝트 생성.png&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;233&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dJglDC/btsslbe1Wfq/AY6tvk6WgK5hDLBfKzyd1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dJglDC/btsslbe1Wfq/AY6tvk6WgK5hDLBfKzyd1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dJglDC/btsslbe1Wfq/AY6tvk6WgK5hDLBfKzyd1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdJglDC%2Fbtsslbe1Wfq%2FAY6tvk6WgK5hDLBfKzyd1k%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;494&quot; height=&quot;233&quot; data-filename=&quot;프로젝트 생성.png&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;233&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹은 -y 옵션을 통해 모든 항목을 기본값으로 설치한다.&lt;/p&gt;
&lt;pre id=&quot;code_1693045631689&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm init -y&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상적으로 package.json 파일이 생성되었다면 서버 구성을 위해 express 설치를 진행한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;프로젝트 생성2.png&quot; data-origin-width=&quot;1100&quot; data-origin-height=&quot;404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xp3W6/btssfTmraEQ/5syj2e9nHlZdhQ8R9APj9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xp3W6/btssfTmraEQ/5syj2e9nHlZdhQ8R9APj9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xp3W6/btssfTmraEQ/5syj2e9nHlZdhQ8R9APj9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxp3W6%2FbtssfTmraEQ%2F5syj2e9nHlZdhQ8R9APj9K%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;1100&quot; height=&quot;404&quot; data-filename=&quot;프로젝트 생성2.png&quot; data-origin-width=&quot;1100&quot; data-origin-height=&quot;404&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;express 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;express는 Node.js에서 서버 구성을 좀 더 쉽게 할 수 있도록 해주는 프레임워크이다.&lt;br /&gt;아래 명령어를 통해 express를 설치한다.&lt;/p&gt;
&lt;pre id=&quot;code_1693045935442&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm i express&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;node_modules 폴더 아래에 모듈이 설치되며 package.json 파일의 dependencies 항목에 express 모듈이 추가된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;express 설치.png&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;102&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/StpLp/btssbz3jYf1/khrdooxiiOlYzUeseZ0Kt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/StpLp/btssbz3jYf1/khrdooxiiOlYzUeseZ0Kt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/StpLp/btssbz3jYf1/khrdooxiiOlYzUeseZ0Kt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FStpLp%2Fbtssbz3jYf1%2FkhrdooxiiOlYzUeseZ0Kt1%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;362&quot; height=&quot;102&quot; data-filename=&quot;express 설치.png&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;102&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;express 설치2.png&quot; data-origin-width=&quot;731&quot; data-origin-height=&quot;455&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dECYIi/btsslbsy8vS/X9CE9ttKqdbAwwJXvMknDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dECYIi/btsslbsy8vS/X9CE9ttKqdbAwwJXvMknDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dECYIi/btsslbsy8vS/X9CE9ttKqdbAwwJXvMknDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdECYIi%2Fbtsslbsy8vS%2FX9CE9ttKqdbAwwJXvMknDK%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;731&quot; height=&quot;455&quot; data-filename=&quot;express 설치2.png&quot; data-origin-width=&quot;731&quot; data-origin-height=&quot;455&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;express 사용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 구동을 위한 코드를 작성할 js파일을 하나 생성하고 express 홈페이지에 나와있는 Hello World 예제를 통해 서버 구동을 테스트한다.&lt;/p&gt;
&lt;figure id=&quot;og_1693046257123&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;Express &amp;quot;Hello World&amp;quot; 예제&quot; data-og-description=&quot;Hello world 예제 기본적으로 이 앱은 여러분이 작성할 수 있는 가장 간단한 Express 앱일 것입니다. 이 앱은 하나의 파일로 된 앱이며 Express 생성기를 통해 얻게 되는 앱과는 같지 않습니다. (이 예제&quot; data-og-host=&quot;expressjs.com&quot; data-og-source-url=&quot;https://expressjs.com/ko/starter/hello-world.html&quot; data-og-url=&quot;https://expressjs.com/ko/starter/hello-world.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://expressjs.com/ko/starter/hello-world.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://expressjs.com/ko/starter/hello-world.html&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;Express &quot;Hello World&quot; 예제&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Hello world 예제 기본적으로 이 앱은 여러분이 작성할 수 있는 가장 간단한 Express 앱일 것입니다. 이 앱은 하나의 파일로 된 앱이며 Express 생성기를 통해 얻게 되는 앱과는 같지 않습니다. (이 예제&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;expressjs.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1693046479008&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// express 불러오기
const express = require('express');
// express 인스턴스 생성
const app = express();
// 포트 정보
const port = 3000;

// 라우트 설정
// HTTP GET 방식으로 '/' 경로를 요청하였을 때
// Hello World!라는 문자열을 결과값으로 보냄
app.get('/', (req, res) =&amp;gt; {
  res.send('Hello World!');
});

// 서버 실행
app.listen(port, () =&amp;gt; {
  console.log(`App running on port ${port}...`);
});&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;node 명령어를 통해 해당 파일을 실행하면 서버가 실행되고 localhost:3000에서 실행중인 서버를 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;서버 실행.png&quot; data-origin-width=&quot;418&quot; data-origin-height=&quot;70&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmcxgJ/btssaA2urjP/ZAnWSfdoaLlBaJ7yk5F97k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmcxgJ/btssaA2urjP/ZAnWSfdoaLlBaJ7yk5F97k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmcxgJ/btssaA2urjP/ZAnWSfdoaLlBaJ7yk5F97k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmcxgJ%2FbtssaA2urjP%2FZAnWSfdoaLlBaJ7yk5F97k%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;418&quot; height=&quot;70&quot; data-filename=&quot;서버 실행.png&quot; data-origin-width=&quot;418&quot; data-origin-height=&quot;70&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;서버 실행2.png&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;167&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSMv3L/btssgmu7Vlv/sKvwbvlHGGFKa6k8aY6RY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSMv3L/btssgmu7Vlv/sKvwbvlHGGFKa6k8aY6RY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSMv3L/btssgmu7Vlv/sKvwbvlHGGFKa6k8aY6RY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSMv3L%2Fbtssgmu7Vlv%2FsKvwbvlHGGFKa6k8aY6RY1%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;167&quot; data-filename=&quot;서버 실행2.png&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;167&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발/Node.js</category>
      <category>Express</category>
      <category>JavaScript</category>
      <category>node</category>
      <category>nodejs</category>
      <category>서버</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/172</guid>
      <comments>https://hyojun.tistory.com/entry/Nodejs-Nodejs-express%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%9C-%EC%84%9C%EB%B2%84-%EA%B5%AC%EC%84%B1-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0#entry172comment</comments>
      <pubDate>Sat, 26 Aug 2023 19:47:14 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 215. Kth Largest Element in an Array - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-215-Kth-Largest-Element-in-an-Array-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/kth-largest-element-in-an-array/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/kth-largest-element-in-an-array/description/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1691997507117&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;Kth Largest Element in an Array - LeetCode&quot; data-og-description=&quot;Can you solve this real interview question? Kth Largest Element in an Array - Given an integer array nums and an integer k, return the kth largest element in the array. Note that it is the kth largest element in the sorted order, not the kth distinct eleme&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/kth-largest-element-in-an-array/description/&quot; data-og-url=&quot;https://leetcode.com/problems/kth-largest-element-in-an-array/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cwc7ka/hyTCANBACs/OW4KkNlWgi93LhZ4GLzGr0/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/kth-largest-element-in-an-array/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/kth-largest-element-in-an-array/description/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cwc7ka/hyTCANBACs/OW4KkNlWgi93LhZ4GLzGr0/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Kth Largest Element in an Array - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Can you solve this real interview question? Kth Largest Element in an Array - Given an integer array nums and an integer k, return the kth largest element in the array. Note that it is the kth largest element in the sorted order, not the kth distinct eleme&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;Given&amp;nbsp;an&amp;nbsp;integer&amp;nbsp;array&amp;nbsp;&lt;b&gt;nums&amp;nbsp;&lt;/b&gt;and&amp;nbsp;an&amp;nbsp;integer&amp;nbsp;&lt;b&gt;k&lt;/b&gt;,&amp;nbsp;return&amp;nbsp;the&amp;nbsp;&lt;b&gt;kth&amp;nbsp;&lt;/b&gt;largest&amp;nbsp;element&amp;nbsp;in&amp;nbsp;the&amp;nbsp;array. &lt;br /&gt;&lt;br /&gt;Note&amp;nbsp;that&amp;nbsp;it&amp;nbsp;is&amp;nbsp;the&amp;nbsp;&lt;b&gt;kth&amp;nbsp;&lt;/b&gt;largest&amp;nbsp;element&amp;nbsp;in&amp;nbsp;the&amp;nbsp;sorted&amp;nbsp;order,&amp;nbsp;not&amp;nbsp;the&amp;nbsp;&lt;b&gt;kth&amp;nbsp;&lt;/b&gt;distinct&amp;nbsp;element. &lt;br /&gt;&lt;br /&gt;Can&amp;nbsp;you&amp;nbsp;solve&amp;nbsp;it&amp;nbsp;without&amp;nbsp;sorting? &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1691997543276&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: nums = [3,2,1,5,6,4], k = 2
Output: 5&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1691997549067&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: nums = [3,2,3,1,2,4,5,5,6], k = 4
Output: 4&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1 &amp;lt;= k &amp;lt;= nums.length &amp;lt;= 105&lt;/li&gt;
&lt;li&gt;-104&amp;nbsp;&amp;lt;=&amp;nbsp;nums[i]&amp;nbsp;&amp;lt;=&amp;nbsp;104&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정수 배열 nums와 정수 k가 주어질 때 nums배열안에서 k번째로 큰 요소를 찾아 return하는 문제이다.&lt;br /&gt;nums에는 중복된 요소가 존재할 수 있으며 정렬을 사용하지 않고 풀이하는 것이 이 문제의 과제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 조건으로 문제를 풀이하기 위하여 우선순위큐를 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1691997682956&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PriorityQueue&amp;lt;Integer&amp;gt; pq = new PriorityQueue&amp;lt;&amp;gt;();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열의 요소를 처음부터 탐색하며 우선순위큐에 넣어주고 만약 우선순위 큐의 사이즈가 k보다 커지게 된다면 우선순위큐의 요소를 하나 제거한다. 그러면 우선순위큐에는 우선순위가 가장 높은 수(= 제일 작은 수)가 제거되므로 최종적으로 우선순위 큐에는 가장 큰 수부터 k번째 큰 수 까지만 남게된다.&lt;/p&gt;
&lt;pre id=&quot;code_1691997884843&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for(int i : nums) {
    // num배열의 각 수를 우선순위큐에 넣음
    pq.offer(i);
    // 우선순위큐의 사이즈가 k보다 커지는 경우 원소를 하나 제거
    // 우선순위큐에는 가장 큰 수부터 k번째 큰 수 까지만 남게됨
    if(pq.size() &amp;gt; k) pq.poll();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 모든 탐색이 종료된 후 우선순위큐에 남아있는 요소를 하나 뽑아 return하면 k번째 큰 수를 구할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1691997915523&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 우선순위 큐에 남아있는 k번째 큰 수를 return
return pq.poll();&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1691997582796&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int findKthLargest(int[] nums, int k) {
        PriorityQueue&amp;lt;Integer&amp;gt; pq = new PriorityQueue&amp;lt;&amp;gt;();
        
        for(int i : nums) {
            // num배열의 각 수를 우선순위큐에 넣음
            pq.offer(i);
            // 우선순위큐의 사이즈가 k보다 커지는 경우 원소를 하나 제거
            // 우선순위큐에는 가장 큰 수부터 k번째 큰 수 까지만 남게됨
            if(pq.size() &amp;gt; k) pq.poll();
        }
        
        // 우선순위 큐에 남아있는 k번째 큰 수를 return
        return pq.poll();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>Algorithm</category>
      <category>Java</category>
      <category>JavaScript</category>
      <category>leetcode</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>자바</category>
      <category>자바스크립트</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/171</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-215-Kth-Largest-Element-in-an-Array-Java#entry171comment</comments>
      <pubDate>Mon, 14 Aug 2023 16:30:31 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript] 콜백 지옥(Callback Hell) 탈출을 위한 코드작성 - promise, async/await</title>
      <link>https://hyojun.tistory.com/entry/JavaScript-Callback-Hell%EC%BD%9C%EB%B0%B1-%EC%A7%80%EC%98%A5-%ED%83%88%EC%B6%9C%EC%9D%84-%EC%9C%84%ED%95%9C-%EC%BD%94%EB%93%9C%EC%9E%91%EC%84%B1-promise-asyncawait</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;❓ 콜백 함수 (callback function)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;콜백&lt;/b&gt;(callback)&amp;nbsp;또는&amp;nbsp;&lt;b&gt;콜백&amp;nbsp;함수&lt;/b&gt;(callback function)는 다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 말한다.&lt;br /&gt;콜백을&amp;nbsp;넘겨받는&amp;nbsp;코드는&amp;nbsp;이&amp;nbsp;콜백을&amp;nbsp;필요에&amp;nbsp;따라&amp;nbsp;즉시&amp;nbsp;실행할&amp;nbsp;수도&amp;nbsp;있고,&amp;nbsp;아니면&amp;nbsp;나중에&amp;nbsp;실행할&amp;nbsp;수도&amp;nbsp;있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1691851164324&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function sum(a, b, callback) {
  callback(a + b);
}

sum(2, 5, (result) =&amp;gt; {
  console.log(result);
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드는 sum이라는 함수의 인자로 정수 a,b 와 콜백 함수를 넘겨 주며 콜백 함수에서는 두 정수 a와 b를 합한 결과인 result를 콘솔로 출력한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;❓&amp;nbsp;콜백 지옥 (callback hell)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;콜백 지옥이란 JavaScript에서 비동기 프로그래밍시 흔히 발생하는 문제로 여러개의 콜백함수가 연속적으로 사용되어 반복되는 들여쓰기로 인해 코드의 가독성이 떨어지는 현상을 의미한다. 코드의 들여쓰기가 마치 피라미드 모양과도 같아 운명의 피라미드(Pyramid of doom)라고 불리기도 하며 이러한 형태의 코드는 유지보수에도 어려움을 주게 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1691852607675&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a((resultA) =&amp;gt; {
    b(resultA, (resultB) =&amp;gt; {
        c(resultB, (resultC) =&amp;gt; {
            d(resultC, (resultD) =&amp;gt; {
                e(resultD, (resultE) =&amp;gt; {
                    f(resultE, (resultF) =&amp;gt; {
                        g(resultF, (resultG) =&amp;gt; {
                            console.log(resultG);
                        });
                    });
                });
            });
        });
    });
});&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아래 코드는 콜백 지옥의 간단한 예시이다. 알파벳 소문자로 작성된 hello.txt 파일을 읽고 해당 문자열을 대문자로 변환한 후 다시 텍스트 파일로 저장하는 코드이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1691853770364&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const fs = require('fs');

function convert(data, callback) {
    // 알파벳 문자열을 대문자로 변환
    const converted = data.toUpperCase();
    // 1초 후에 콜백 함수 실행
    setTimeout(() =&amp;gt; {
        callback(converted);
    }, 1000);
}

// 텍스트 파일 읽기
fs.readFile('hello.txt', 'utf-8', (err, data) =&amp;gt; {
    if (err) {
        console.log('Could not read file!');
    } else {
        // 대문자 변환 함수 실행
        convert(data, (result) =&amp;gt; {
            // 변환된 문자열을 파일로 저장
            fs.writeFile('output.txt', result, (err) =&amp;gt; {
                if (err) {
                    console.log('Could not write file!');
                } else {
                    console.log('File successfully written');
                }
            });
        });
    }
});&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;  콜백 지옥&amp;nbsp;탈출을 위한 promise&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;콜백 지옥을 탈출하기 위한 첫 번째 방법으로 promise의 사용이 있다.&lt;br /&gt;promise는 어떤 연산에 대한 결과값을 반환하는데 이 결과값은 최종 결과 값이 아니고, 미래의 어떤 시점에 결과를 제공하겠다는 '약속'(프로미스)를 반환한다.&lt;/li&gt;
&lt;li&gt;promise를 지원하지 않는 함수에서 promise를 사용하기 위해서는 먼저 new Promise 생성자를 이용하여 새로운 promise객체를 생성하고 resolve와 reject를 매개변수로 받는 함수를 작성한다.&lt;br /&gt;이 때 resolve는 주어진 값으로 이행되는 promise 객체를 반환하며 then 메서드에서 최종 상태를 결정한다.&lt;br /&gt;reject의 경우 주어진 사유로 인해 거부하는 promise 객체를 반환하며 catch 메서드에서 거부된 결과에 대한 후 처리 작업을 진행한다.&lt;/li&gt;
&lt;li&gt;위의 예시를 promise를 이용하여 리팩토링 하기 위해서는 우선 convert함수, 파일을 읽는 함수, 파일을 저장하는 함수를 promise화 해야한다. 각각의 함수를 promise화한 결과는 아래와 같다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1691928501575&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const fs = require('fs');

function convert(data, callback) {
    return new Promise((resolve) =&amp;gt; {
        // 알파벳 문자열을 대문자로 변환
        const converted = data.toUpperCase();
        // 1초 후에 콜백 함수 실행
        setTimeout(() =&amp;gt; {
            resolve(converted);
        }, 1000);
    });
}

// 텍스트 파일 읽기
function readFilePromise(fileName) {
    return new Promise((resolve, reject) =&amp;gt; {
        fs.readFile(fileName, 'utf-8', (err, data) =&amp;gt; {
            if (err) reject('Could not read file!');
            else resolve(data);
        });
    });
}

// 텍스트 파일 쓰기
function writeFilePromise(fileName, data) {
    return new Promise((resolve, reject) =&amp;gt; {
        fs.writeFile(fileName, data, (err) =&amp;gt; {
            if (err) reject('Could not write file!');
            else resolve(data);
        });
    });
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;promise화 된 함수를 바탕으로 코드를 리팩토링하게 되면 다음과 같이 코드가 간결해지고 가독성이 높아지게 된다.&lt;br /&gt;함수가 추가되더라도 들여쓰기의 깊이는 더 이상 깊어지지 않고 마치 열차처럼 연결된 형태로 확장이 가능해진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1691854674717&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Promise를 이용한 코드 리팩토링
readFilePromise('hello.txt')
    .then((data) =&amp;gt; convert(data))
    .then((converted) =&amp;gt; writeFilePromise('output.txt', converted))
    .then(() =&amp;gt; console.log('File successfully written'))
    .catch((err) =&amp;gt; console.log(err));&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;  콜백 지옥 탈출을 위한 async / await&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JavaScript ES8버전부터는 promise를 이용한 비동기 코드를 더 쉽게 작성하고 관리할 수 있도록 도와주는 async와 await의 사용이 가능해졌다.&lt;/li&gt;
&lt;li&gt;함수 앞에 async를 선언하여 async함수를 정의할 수 있으며 해당 함수는 결과값으로 항상 promise를 반환한다.&lt;/li&gt;
&lt;li&gt;await 키워드는 async 함수 내에서만 사용이 가능하며 await 뒤에오는 promise가 처리될 때까지 현재 함수의 실행을 일시 중지하며 promise의 결과값을 기다린다.&lt;/li&gt;
&lt;li&gt;promise가 처리되면 해당 promise의 결과값을 반환받을 수 있다.&lt;/li&gt;
&lt;li&gt;promise의 then, catch 대신 try catch 구문으로 함수의 이행과 오류를 구분하여 처리할 수 있고 promise의 then 체인을 사용하지 않아도 보다 직관적인 비동기 코드 작성이 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1691855050841&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// async&amp;amp;await를 이용한 코드 리팩토링
(async () =&amp;gt; {
    try {
        const data = await readFilePromise('hello.txt');
        const converted = await convert(data);
        await writeFilePromise('output.txt', converted);
        console.log('File successfully written');
    } catch (err) {
        console.log(err);
    }
})();&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;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://ko.wikipedia.org/wiki/%EC%BD%9C%EB%B0%B1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ko.wikipedia.org/wiki/%EC%BD%9C%EB%B0%B1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Promise&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Promise&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>개발/JavaScript</category>
      <category>async</category>
      <category>Await</category>
      <category>callback hell</category>
      <category>JavaScript</category>
      <category>nodejs</category>
      <category>PROMISE</category>
      <category>pyramid of doom</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/170</guid>
      <comments>https://hyojun.tistory.com/entry/JavaScript-Callback-Hell%EC%BD%9C%EB%B0%B1-%EC%A7%80%EC%98%A5-%ED%83%88%EC%B6%9C%EC%9D%84-%EC%9C%84%ED%95%9C-%EC%BD%94%EB%93%9C%EC%9E%91%EC%84%B1-promise-asyncawait#entry170comment</comments>
      <pubDate>Sun, 13 Aug 2023 00:05:17 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 518. Coin Change II - Java, JavaScript</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-518-Coin-Change-II-Java-JavaScript</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/coin-change-ii/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/coin-change-ii/description/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1691734706602&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;Coin Change II - LeetCode&quot; data-og-description=&quot;Can you solve this real interview question? Coin Change II - You are given an integer array coins representing coins of different denominations and an integer amount representing a total amount of money. Return the number of combinations that make up that &quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/coin-change-ii/description/&quot; data-og-url=&quot;https://leetcode.com/problems/coin-change-ii/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ZwDt9/hyTBwdYJz9/iSKvyZT2PwXyYKp1JSkItk/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/coin-change-ii/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/coin-change-ii/description/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ZwDt9/hyTBwdYJz9/iSKvyZT2PwXyYKp1JSkItk/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Coin Change II - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Can you solve this real interview question? Coin Change II - You are given an integer array coins representing coins of different denominations and an integer amount representing a total amount of money. Return the number of combinations that make up that&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;You&amp;nbsp;are&amp;nbsp;given&amp;nbsp;an&amp;nbsp;integer&amp;nbsp;array&amp;nbsp;&lt;b&gt;coins&amp;nbsp;&lt;/b&gt;representing&amp;nbsp;coins&amp;nbsp;of&amp;nbsp;different&amp;nbsp;denominations&amp;nbsp;and&amp;nbsp;an&amp;nbsp;integer&amp;nbsp;&lt;b&gt;amount&amp;nbsp;&lt;/b&gt;representing&amp;nbsp;a&amp;nbsp;total&amp;nbsp;amount&amp;nbsp;of&amp;nbsp;money. &lt;br /&gt;&lt;br /&gt;Return&amp;nbsp;the&amp;nbsp;number&amp;nbsp;of&amp;nbsp;combinations&amp;nbsp;that&amp;nbsp;make&amp;nbsp;up&amp;nbsp;that&amp;nbsp;amount.&amp;nbsp;If&amp;nbsp;that&amp;nbsp;amount&amp;nbsp;of&amp;nbsp;money&amp;nbsp;cannot&amp;nbsp;be&amp;nbsp;made&amp;nbsp;up&amp;nbsp;by&amp;nbsp;any&amp;nbsp;combination&amp;nbsp;of&amp;nbsp;the&amp;nbsp;coins,&amp;nbsp;return&lt;b&gt;&amp;nbsp;0&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;You&amp;nbsp;may&amp;nbsp;assume&amp;nbsp;that&amp;nbsp;you&amp;nbsp;have&amp;nbsp;an&amp;nbsp;infinite&amp;nbsp;number&amp;nbsp;of&amp;nbsp;each&amp;nbsp;kind&amp;nbsp;of&amp;nbsp;coin. &lt;br /&gt;&lt;br /&gt;The&amp;nbsp;answer&amp;nbsp;is&amp;nbsp;&lt;b&gt;guaranteed&amp;nbsp;&lt;/b&gt;to&amp;nbsp;fit&amp;nbsp;into&amp;nbsp;a&amp;nbsp;signed&amp;nbsp;&lt;b&gt;32-bit&amp;nbsp;&lt;/b&gt;integer.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DP를 이용하여 0부터 amount원까지 각 금액을 만들 수 있는 경우의 수를 구해나간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 memoization을 위해 amount + 1길이 만큼의 배열을 선언하고 0번째 인덱스는 1로 초기화 한다.(0원을 만들 수 있는 경우의 수는 항상 1가지 이므로)&lt;/p&gt;
&lt;pre id=&quot;code_1691734937192&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int[] dp = new int[amount + 1];
dp[0] = 1;&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;그리고 각 동전의 종류에 대해서 동전의 금액부터 amount까지 반복 탐색한다.&lt;br /&gt;탐색하는 각 금액을 i라고 했을 때 i원이 될 수 있는 경우의 수는 i원에서 coin을 뺀 금액의 경우의 수와 같다고 할 수 있다.&lt;br /&gt;그렇기 때문에 각 동전 별로 i - coin의 경우의 수를 i의 경우의 수에 합산하여 최종적으로 amount의 경우의 수를 return 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1691735136824&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for(int coin : coins) {
    for(int i = coin; i &amp;lt;= amount; i++) {
        // i원이 될 수 있는 경우의 수는
        // i원에서 coin만큼 뺀금액의 경우의 수
        // 따라서 i - coin의 경우의 수를 i의 경우의 수에 추가
        dp[i] += dp[i - coin];
    }
}

return dp[amount];&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Java&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1691734745503&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int change(int amount, int[] coins) {
        int[] dp = new int[amount + 1];
        dp[0] = 1;
        
        for(int coin : coins) {
            for(int i = coin; i &amp;lt;= amount; i++) {
                // i원이 될 수 있는 경우의 수는
                // i원에서 coin만큼 뺀금액의 경우의 수
                // 따라서 i - coin의 경우의 수를 i의 경우의 수에 추가
                dp[i] += dp[i - coin];
            }
        }

        return dp[amount];
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;JavaScript&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1691734802345&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/**
 * @param {number} amount
 * @param {number[]} coins
 * @return {number}
 */
var change = function(amount, coins) {
    const dp = Array(amount + 1).fill(0);
  dp[0] = 1;

  for (const coin of coins) {
    for (let i = coin; i &amp;lt;= amount; i++) {
      dp[i] += dp[i - coin];
    }
  }

  return dp[amount];
};&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>Algorithm</category>
      <category>Java</category>
      <category>JavaScript</category>
      <category>leetcode</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>자바</category>
      <category>자바스크립트</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/169</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-518-Coin-Change-II-Java-JavaScript#entry169comment</comments>
      <pubDate>Fri, 11 Aug 2023 15:25:47 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 74. Search a 2D Matrix - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-74-Search-a-2D-Matrix-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/search-a-2d-matrix/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/search-a-2d-matrix/description/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1691414993767&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;Search a 2D Matrix - LeetCode&quot; data-og-description=&quot;Can you solve this real interview question? Search a 2D Matrix - You are given an m x n integer matrix matrix with the following two properties: * Each row is sorted in non-decreasing order. * The first integer of each row is greater than the last integer &quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/search-a-2d-matrix/description/&quot; data-og-url=&quot;https://leetcode.com/problems/search-a-2d-matrix/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bjK0pm/hyTzjL2KRZ/2TMHX41P4L8tjnUqYCVZV1/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/htOuv/hyTzfCT3Wx/4VpqsW0kJNKGonpTI4KZV1/img.jpg?width=322&amp;amp;height=242&amp;amp;face=0_0_322_242,https://scrap.kakaocdn.net/dn/b40SX6/hyTAzsYduK/Wmuh2HVIkFCFRRujg1DGx1/img.jpg?width=322&amp;amp;height=242&amp;amp;face=0_0_322_242&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/search-a-2d-matrix/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/search-a-2d-matrix/description/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bjK0pm/hyTzjL2KRZ/2TMHX41P4L8tjnUqYCVZV1/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/htOuv/hyTzfCT3Wx/4VpqsW0kJNKGonpTI4KZV1/img.jpg?width=322&amp;amp;height=242&amp;amp;face=0_0_322_242,https://scrap.kakaocdn.net/dn/b40SX6/hyTAzsYduK/Wmuh2HVIkFCFRRujg1DGx1/img.jpg?width=322&amp;amp;height=242&amp;amp;face=0_0_322_242');&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;Search a 2D Matrix - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Can you solve this real interview question? Search a 2D Matrix - You are given an m x n integer matrix matrix with the following two properties: * Each row is sorted in non-decreasing order. * The first integer of each row is greater than the last integer&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;You are given an m x n integer matrix matrix with the following two properties:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Each row is sorted in non-decreasing order.&lt;/li&gt;
&lt;li&gt;The first integer of each row is greater than the last integer of the previous row.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Given&amp;nbsp;an&amp;nbsp;integer&amp;nbsp;target,&amp;nbsp;return&amp;nbsp;true&amp;nbsp;if&amp;nbsp;target&amp;nbsp;is&amp;nbsp;in&amp;nbsp;matrix&amp;nbsp;or&amp;nbsp;false&amp;nbsp;otherwise. &lt;br /&gt;&lt;br /&gt;You&amp;nbsp;must&amp;nbsp;write&amp;nbsp;a&amp;nbsp;solution&amp;nbsp;in&amp;nbsp;O(log(m&amp;nbsp;*&amp;nbsp;n))&amp;nbsp;time&amp;nbsp;complexity.&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;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pxISP/btsqrNBKAD3/9wCUuOZ9WjNdNVeyBqA1f1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pxISP/btsqrNBKAD3/9wCUuOZ9WjNdNVeyBqA1f1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pxISP/btsqrNBKAD3/9wCUuOZ9WjNdNVeyBqA1f1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpxISP%2FbtsqrNBKAD3%2F9wCUuOZ9WjNdNVeyBqA1f1%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;322&quot; height=&quot;242&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;242&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1691415065028&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
Output: true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zWRf4/btsp92s5Zrx/OX0p20zBUiIXCuvvC1eQCk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zWRf4/btsp92s5Zrx/OX0p20zBUiIXCuvvC1eQCk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zWRf4/btsp92s5Zrx/OX0p20zBUiIXCuvvC1eQCk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzWRf4%2Fbtsp92s5Zrx%2FOX0p20zBUiIXCuvvC1eQCk%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;322&quot; height=&quot;242&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;242&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1691415071443&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
Output: 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;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;m == matrix.length&lt;/li&gt;
&lt;li&gt;n == matrix[i].length&lt;/li&gt;
&lt;li&gt;1 &amp;lt;= m, n &amp;lt;= 100&lt;/li&gt;
&lt;li&gt;-104&amp;nbsp;&amp;lt;=&amp;nbsp;matrix[i][j],&amp;nbsp;target&amp;nbsp;&amp;lt;=&amp;nbsp;104&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;m x n크기의 2차원 배열 matrix가 주어지고 다음과 같은 성질을 가진다.&lt;br /&gt;배열의 각 행은 오름차순 정렬되어 있으며, 각 행의 첫 번째 요소는 이전 행의 마지막 요소보다 큰 값을 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정수 target이 주어질 때 target이 배열 내에 존재하는 경우 true, 그렇지 않은 경우 false를 return 해야한다.&lt;br /&gt;단, O(log(m x n))의 시간 복잡도로 풀이해야 한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이진탐색을 2차원 배열에 적용하여 풀이하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 탐색을 시작할 행의 인덱스를 0으로 초기화하고 열의 인덱스는 마지막 값으로 초기화한다.&lt;/p&gt;
&lt;pre id=&quot;code_1691415301676&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int row = 0;
int col = matrix[0].length - 1;&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;행의 인덱스가 배열의 길이를 넘지 않고 열의 인덱스가 0 이상인 경우 반복하여 다음 조건을 탐색한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 행,열의 값이 target과 일치하는 경우 true를 return한다.&lt;/li&gt;
&lt;li&gt;현재 행,열의 값이 target보다 작은 경우, 즉 각 행의 마지막 값이 target보다 커질 때 까지 row를 증가시킨다.&lt;/li&gt;
&lt;li&gt;현재 행, 열의 값이 target보다 큰 경우, 즉 현재 행이 target이 속할 수 있는 범위 내 인경우 col을 감소시킨다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1691415520164&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;while(row &amp;lt; matrix.length &amp;amp;&amp;amp; col &amp;gt;= 0) {
    // target과 일치하는 경우
    if(matrix[row][col] == target) return true;
    // 현재 row의 col 값이 target보다 작은 경우 row 증가
    if(matrix[row][col] &amp;lt; target) row++;
    // 현재 row의 col 값이 target보다 큰 경우 col 감소
    else col--;
}&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;모든 탐색이 종료되는 경우에는 target과 일치하는 요소가 없으므로 false를 return 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1691415534212&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 반복 탐색이 모두 끝난 경우 target이 포함되지 않으므로 false를 return
return false;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1691414993292&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int row = 0;
        int col = matrix[0].length - 1;
        
        while(row &amp;lt; matrix.length &amp;amp;&amp;amp; col &amp;gt;= 0) {
            // target과 일치하는 경우
            if(matrix[row][col] == target) return true;
            // 현재 row의 col 값이 target보다 작은 경우 row 증가
            if(matrix[row][col] &amp;lt; target) row++;
            // 현재 row의 col 값이 target보다 큰 경우 col 감소
            else col--;
        }
        
        // 반복 탐색이 모두 끝난 경우 target이 포함되지 않으므로 false를 return
        return false;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>Algorithm</category>
      <category>binary search</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>이진탐색</category>
      <category>자바</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/168</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-74-Search-a-2D-Matrix-Java#entry168comment</comments>
      <pubDate>Mon, 7 Aug 2023 22:39:33 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 735. Asteroid Collision - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-735-Asteroid-Collision-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/asteroid-collision/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/asteroid-collision/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1690006792324&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;Asteroid Collision - LeetCode&quot; data-og-description=&quot;Can you solve this real interview question? Asteroid Collision - We are given an array asteroids of integers representing asteroids in a row. For each asteroid, the absolute value represents its size, and the sign represents its direction (positive meaning&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/asteroid-collision/&quot; data-og-url=&quot;https://leetcode.com/problems/asteroid-collision/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/AHM1j/hyTnQKknq6/9rlRGnywPcPxBPLfV3chTk/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/asteroid-collision/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/asteroid-collision/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/AHM1j/hyTnQKknq6/9rlRGnywPcPxBPLfV3chTk/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Asteroid Collision - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Can you solve this real interview question? Asteroid Collision - We are given an array asteroids of integers representing asteroids in a row. For each asteroid, the absolute value represents its size, and the sign represents its direction (positive meaning&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;We&amp;nbsp;are&amp;nbsp;given&amp;nbsp;an&amp;nbsp;array&amp;nbsp;asteroids&amp;nbsp;of&amp;nbsp;integers&amp;nbsp;representing&amp;nbsp;asteroids&amp;nbsp;in&amp;nbsp;a&amp;nbsp;row. &lt;br /&gt;&lt;br /&gt;For&amp;nbsp;each&amp;nbsp;asteroid,&amp;nbsp;the&amp;nbsp;absolute&amp;nbsp;value&amp;nbsp;represents&amp;nbsp;its&amp;nbsp;size,&amp;nbsp;and&amp;nbsp;the&amp;nbsp;sign&amp;nbsp;represents&amp;nbsp;its&amp;nbsp;direction&amp;nbsp;(positive&amp;nbsp;meaning&amp;nbsp;right,&amp;nbsp;negative&amp;nbsp;meaning&amp;nbsp;left).&amp;nbsp;Each&amp;nbsp;asteroid&amp;nbsp;moves&amp;nbsp;at&amp;nbsp;the&amp;nbsp;same&amp;nbsp;speed. &lt;br /&gt;&lt;br /&gt;Find&amp;nbsp;out&amp;nbsp;the&amp;nbsp;state&amp;nbsp;of&amp;nbsp;the&amp;nbsp;asteroids&amp;nbsp;after&amp;nbsp;all&amp;nbsp;collisions.&amp;nbsp;If&amp;nbsp;two&amp;nbsp;asteroids&amp;nbsp;meet,&amp;nbsp;the&amp;nbsp;smaller&amp;nbsp;one&amp;nbsp;will&amp;nbsp;explode.&amp;nbsp;If&amp;nbsp;both&amp;nbsp;are&amp;nbsp;the&amp;nbsp;same&amp;nbsp;size,&amp;nbsp;both&amp;nbsp;will&amp;nbsp;explode.&amp;nbsp;Two&amp;nbsp;asteroids&amp;nbsp;moving&amp;nbsp;in&amp;nbsp;the&amp;nbsp;same&amp;nbsp;direction&amp;nbsp;will&amp;nbsp;never&amp;nbsp;meet. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1690006804140&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: asteroids = [5,10,-5]
Output: [5,10]
Explanation: The 10 and -5 collide resulting in 10. The 5 and 10 never collide.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1690006811035&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: asteroids = [8,-8]
Output: []
Explanation: The 8 and -8 collide exploding each other.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 3:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1690006818987&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: asteroids = [10,2,-5]
Output: [10]
Explanation: The 2 and -5 collide resulting in -5. The 10 and -5 collide resulting in 10.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2 &amp;lt;= asteroids.length &amp;lt;= 104&lt;/li&gt;
&lt;li&gt;-1000 &amp;lt;= asteroids[i] &amp;lt;= 1000&lt;/li&gt;
&lt;li&gt;asteroids[i]&amp;nbsp;!=&amp;nbsp;0&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주어진 정수배열 asteroids 에서 양수값과 음수값은 각각 오른쪽으로 움직이는 소행성, 왼쪽으로 움직이는 소행성을 나타내고 각 요소의 절대값은 소행성의 크기를 나타낸다.&lt;br /&gt;각 소행성들은 모두 같은 속도로 움직이고 소행성끼리 부딫히게 되었을 때 크기가 같으면 모두 파괴되고 크기가 다른 경우 크기가 작은 소행성이 파괴된다.&lt;br /&gt;이 때 파괴될 수 있는 모든 소행성이 파괴된 후 남은 소행성을 구하는 문제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 소행성 간의 비교를 위해 Stack을 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1690007682684&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Stack&amp;lt;Integer&amp;gt; stack = new Stack&amp;lt;&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;소행성 배열의 각 요소를 차례대로 탐색하며 각 값에 따라 처리한다.&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;반대로 소행성 값이 음수인 경우에는 stack에 값이 남아있지 않거나 현재 소행성의 크기가 stack의 가장 마지막 소행성의 크기 이하가 될 때 까지 stack에서 값을 꺼내어 소행성이 파괴되었음을 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 처리 과정을 거친 후 stack이 비어있거나 stack의 마지막 값이 음수값인 경우에는 현재 소행성 값을 stack에 추가한다.&lt;br /&gt;만약 stack에 양수값이 남아있고 비교할 두 소행성의 크기가 같은 경우에는 두 소행성을 모두 파괴 처리한다.&lt;/p&gt;
&lt;pre id=&quot;code_1690007703812&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 모든 소행성 탐색
for(int asteroid : asteroids) {
    // 소행성 값이 양수인 경우(= 오른쪽으로 움직이는 소행성)
    if(asteroid &amp;gt; 0) {
        // stack에 값 추가
        stack.push(asteroid);
    }
    // 소행성 값이 음수인 경우(= 왼쪽으로 움직이는 소행성)
    else {
        // stack에 비교할 양수 값이 남아있고
        // stack의 가장 위에 있는 소행성의 크기 이하가 될 때까지 소행성 파괴
        while(!stack.isEmpty() &amp;amp;&amp;amp; stack.peek() &amp;gt; 0 &amp;amp;&amp;amp; stack.peek() &amp;lt; -asteroid) {
            stack.pop();
        }
        // 더 이상 stack에 비교할 양수 값이 남아있지 않은 경우
        if(stack.isEmpty() || stack.peek() &amp;lt; 0) {
            // stack에 값 추가
            stack.push(asteroid);
        }
        // 비교할 두 소행성의 사이즈가 같은 경우
        else if(stack.peek() == -asteroid) {
            // 두 소행성 모두 파괴
            stack.pop();
        }
    }
}&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;최종적으로 stack을 배열로 변환하여 반환한다.&lt;/p&gt;
&lt;pre id=&quot;code_1690008259636&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Array 형태로 return
return stack.stream().mapToInt(Integer::intValue).toArray();&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;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1690006848868&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int[] asteroidCollision(int[] asteroids) {
        Stack&amp;lt;Integer&amp;gt; stack = new Stack&amp;lt;&amp;gt;();
        
        // 모든 소행성 탐색
        for(int asteroid : asteroids) {
            // 소행성 값이 양수인 경우(= 오른쪽으로 움직이는 소행성)
            if(asteroid &amp;gt; 0) {
                // stack에 값 추가
                stack.push(asteroid);
            }
            // 소행성 값이 음수인 경우(= 왼쪽으로 움직이는 소행성)
            else {
                // stack에 비교할 양수 값이 남아있고
                // stack의 가장 위에 있는 소행성의 크기보다 작아질 때까지 소행성 파괴
                while(!stack.isEmpty() &amp;amp;&amp;amp; stack.peek() &amp;gt; 0 &amp;amp;&amp;amp; stack.peek() &amp;lt; -asteroid) {
                    stack.pop();
                }
                // 더 이상 stack에 비교할 양수 값이 남아있지 않은 경우
                if(stack.isEmpty() || stack.peek() &amp;lt; 0) {
                    // stack에 값 추가
                    stack.push(asteroid);
                }
                // 비교할 두 소행성의 사이즈가 같은 경우
                else if(stack.peek() == -asteroid) {
                    // 두 소행성 모두 파괴
                    stack.pop();
                }
            }
        }
        
        // Array 형태로 return
        return stack.stream().mapToInt(Integer::intValue).toArray();
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>자바</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/167</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-735-Asteroid-Collision-Java#entry167comment</comments>
      <pubDate>Sat, 22 Jul 2023 15:44:27 +0900</pubDate>
    </item>
    <item>
      <title>[Flutter] 첫 번째 토이프로젝트 - 앱개발부터 배포까지 회고</title>
      <link>https://hyojun.tistory.com/entry/Flutter-%EC%B2%AB-%EB%B2%88%EC%A7%B8-%ED%86%A0%EC%9D%B4%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%95%B1%EA%B0%9C%EB%B0%9C%EB%B6%80%ED%84%B0-%EB%B0%B0%ED%8F%AC%EA%B9%8C%EC%A7%80-%ED%9A%8C%EA%B3%A0</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;유튜브에 올라온 강의들과 유데미의 강의로 플러터를 공부하면서 기본적이고 핵심적인 내용들을 다 학습하고 나면 간단한 앱을 만들어서 스토어에 게시까지 해보리라 다짐했었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그러다가 이번에 어느정도 목표한 부분까지 학습이 끝나게 되어서 토이프로젝트를 진행하게 되었고 스토어에 게시까지 성공하게 되었다.&lt;br /&gt;비록 정말 단순한 앱이지만 플러터 개발의 첫 시작이 되는 이번 토이프로젝트를 기록으로 남기고자 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 토이프로젝트의 목표&lt;/h2&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이번 토이프로젝트의 가장 큰 목표이다. 우선 간단한 프로젝트로 앱 개발의 전체적인 흐름을 경험함으로써 겪을 수 있는 많은 문제들을 미리 핸들링해보고, 추후에 더욱 복잡한 앱을 만들어 배포하게 될 때 더욱 효율적으로 개발을 하고자 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;핵심기능만 빠르게 완성해보기
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개인 프로젝트를 진행하다가 실패하게되는 가장 큰 이유중 하나가 너무 많은 기능을 기획하고 개발하려다가 지치게 되고 포기하게 되는 경우라고 한다. 이번 토이프로젝트의 가장 큰 목표는 앱 개발부터 배포까지 전체적인 사이클을 경험해 보는 것으로 핵심기능만 집중하여 개발하고 나중에 추가, 수정등을 통해 업데이트 해보기로 하였다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;내가 꾸준히 사용 할 앱을 만들어보기
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Todo 앱이나 뽀모도로 앱과 같이 토이프로젝트 하면 흔히 볼 수 있는 프로젝트 주제들이 있지만, 아무래도 내가 실제로 필요로 하고 자주 사용하는 앱을 만들어야 문제점을 개선하고 기능을 추가하는데 더욱 도움이 되지 않을까 생각했다.&lt;br /&gt;평소에 집 지하주차장에 차를 대고 다음에 차를 타러 갈 때 몇 층에 댔는지 자주 잊어버려 층을 왔다갔다 한 경험이 많다. 집 뿐만 아니라 마트등에 갈 때도 주차한 층을 자주 잊어버리곤 하는데 간단하게 주차한 층을 기록하는 앱 정도면 빠르게 만들어 볼 수 있겠다 싶어 이번 프로젝트의 주제로 결정하였다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 개발 환경&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언어 - Dart&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프레임워크 - Flutter&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IDE - Android studio Flamingo&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;형상관리 - Git, GitHub&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디자인 - Figma&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;style8&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 화면 설계&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화면은 간단한 싱글페이지 구성으로 주차 위치가 지상인지 지하인지 구분하는 버튼과 층을 선택할 수 있는 버튼, 그리고 저장 버튼으로 구성했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실상 일상에서 주차하는 건물에는 지상이든 지하이든 10층 이상으로는 가는 경우가 거의 없기 때문에 층 버튼은 숫자 키패드와 비슷하게 1층에서 9층까지만 두었고 이 내용을 바탕으로 간단하게 틀을 잡고 개발을 시작했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;와이어프레임.png&quot; data-origin-width=&quot;367&quot; data-origin-height=&quot;759&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vpz72/btsl3jRzDSa/oxKuyNgOGSjjItBrD9lCN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vpz72/btsl3jRzDSa/oxKuyNgOGSjjItBrD9lCN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vpz72/btsl3jRzDSa/oxKuyNgOGSjjItBrD9lCN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvpz72%2Fbtsl3jRzDSa%2FoxKuyNgOGSjjItBrD9lCN1%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;367&quot; height=&quot;759&quot; data-filename=&quot;와이어프레임.png&quot; data-origin-width=&quot;367&quot; data-origin-height=&quot;759&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 화면 및 기능 개발&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설계한 내용을 바탕으로 화면 레이아웃을 만들고 기능들을 추가했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한번 저장한 데이터는 다음에 앱을 다시 실행하더라도 유지가 되어야 하므로 DB와의 연결이 필요했는데 저장할 데이터가 단순하고 양이 적었기 때문에 별도 서버구성은 하지않고 기기내에서 저장할 수 있도록 &lt;a href=&quot;https://pub.dev/packages/shared_preferences&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;shared_preferences&lt;/a&gt; 패키지를 사용하여 저장기능을 구현하였다. 또한 저장시 저장 완료 알림을 위해 &lt;a href=&quot;https://pub.dev/packages/fluttertoast&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;fluttertoast&lt;/a&gt; 패키지로 토스트 알림창을 적용하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;실행화면.png&quot; data-origin-width=&quot;407&quot; data-origin-height=&quot;863&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wuT8O/btsl1zt4vVU/SDjKynK6WmkAiOwkj2rvu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wuT8O/btsl1zt4vVU/SDjKynK6WmkAiOwkj2rvu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wuT8O/btsl1zt4vVU/SDjKynK6WmkAiOwkj2rvu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwuT8O%2Fbtsl1zt4vVU%2FSDjKynK6WmkAiOwkj2rvu1%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;407&quot; height=&quot;863&quot; data-filename=&quot;실행화면.png&quot; data-origin-width=&quot;407&quot; data-origin-height=&quot;863&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 배포 준비&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱 배포를 위해서 피그마를 이용하여 앱 실행 아이콘을 디자인 해주었다. 앱 실행 아이콘을 개발하면서 앱 실행시 초기에 보여지는 스플래시 화면과 스토어 등록할 때 필요한 그래픽 이미지와 스크린샷 등도 같이 만들어 주었다.&lt;br /&gt;스크린샷 이미지 역시 피그마를 통해 만들었고 커뮤니티에서 템플릿을 받아 제작하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;앱 아이콘 디자인.png&quot; data-origin-width=&quot;456&quot; data-origin-height=&quot;677&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/65Bd1/btslZ1LVbAj/MdpkzzM1KXVXO6SmtnH0mk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/65Bd1/btslZ1LVbAj/MdpkzzM1KXVXO6SmtnH0mk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/65Bd1/btslZ1LVbAj/MdpkzzM1KXVXO6SmtnH0mk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F65Bd1%2FbtslZ1LVbAj%2FMdpkzzM1KXVXO6SmtnH0mk%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;456&quot; height=&quot;677&quot; data-filename=&quot;앱 아이콘 디자인.png&quot; data-origin-width=&quot;456&quot; data-origin-height=&quot;677&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스토어 스크린샷.png&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;539&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OA4vL/btslZSnT5p5/rHDvbuSKpkA4xCOby65qK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OA4vL/btslZSnT5p5/rHDvbuSKpkA4xCOby65qK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OA4vL/btslZSnT5p5/rHDvbuSKpkA4xCOby65qK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOA4vL%2FbtslZSnT5p5%2FrHDvbuSKpkA4xCOby65qK1%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;594&quot; height=&quot;539&quot; data-filename=&quot;스토어 스크린샷.png&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;539&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;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.android.com/studio/publish/app-signing?hl=ko&quot;&gt;https://developer.android.com/studio/publish/app-signing?hl=ko&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1688196664156&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;앱 서명 &amp;nbsp;|&amp;nbsp; Android 스튜디오 &amp;nbsp;|&amp;nbsp; Android Developers&quot; data-og-description=&quot;앱 서명 및 보안과 관련된 중요한 개념을 알아보고, Android 스튜디오를 사용하여 Google Play에 출시하기 위해 앱에 서명하는 방법과 Play 앱 서명을 선택하는 방법을 알아보세요.&quot; data-og-host=&quot;developer.android.com&quot; data-og-source-url=&quot;https://developer.android.com/studio/publish/app-signing?hl=ko&quot; data-og-url=&quot;https://developer.android.com/studio/publish/app-signing?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/p1Exh/hyTaY1P8GX/Gp8rsxKXQO4wEdlxdzy2J0/img.png?width=1640&amp;amp;height=1346&amp;amp;face=0_0_1640_1346,https://scrap.kakaocdn.net/dn/jU0Zg/hyTbdY1s3y/mgtlsiKoXeKPy0LMVnQPrK/img.png?width=1638&amp;amp;height=1346&amp;amp;face=0_0_1638_1346,https://scrap.kakaocdn.net/dn/cFMXLM/hyTbdSeQPd/10hQ99XBZKfAdaK0d7doG1/img.png?width=1410&amp;amp;height=801&amp;amp;face=0_0_1410_801&quot;&gt;&lt;a href=&quot;https://developer.android.com/studio/publish/app-signing?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.android.com/studio/publish/app-signing?hl=ko&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/p1Exh/hyTaY1P8GX/Gp8rsxKXQO4wEdlxdzy2J0/img.png?width=1640&amp;amp;height=1346&amp;amp;face=0_0_1640_1346,https://scrap.kakaocdn.net/dn/jU0Zg/hyTbdY1s3y/mgtlsiKoXeKPy0LMVnQPrK/img.png?width=1638&amp;amp;height=1346&amp;amp;face=0_0_1638_1346,https://scrap.kakaocdn.net/dn/cFMXLM/hyTbdSeQPd/10hQ99XBZKfAdaK0d7doG1/img.png?width=1410&amp;amp;height=801&amp;amp;face=0_0_1410_801');&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;앱 서명 &amp;nbsp;|&amp;nbsp; Android 스튜디오 &amp;nbsp;|&amp;nbsp; Android Developers&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;앱 서명 및 보안과 관련된 중요한 개념을 알아보고, Android 스튜디오를 사용하여 Google Play에 출시하기 위해 앱에 서명하는 방법과 Play 앱 서명을 선택하는 방법을 알아보세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.android.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 안드로이드 스튜디오 개발자 계정을 등록하여 앱 배포 준비를 완료 하였다.&lt;br /&gt;안드로이드 개발자 계정의 경우에는 25달러를 한번 결제하면 개발자 계정을 사용할 수 있지만 애플같은 경우에는 1년마다 129,000 원의 멤버십을 연장하며 사용해야한다고 한다. &lt;br /&gt;지금 진행하는 프로젝트는 수익이 발생하는 앱도 아니고 멤버십에 들어가는 비용이 적지는 않은 비용이라 이번에는 안드로이드로만 진행을 하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 배포&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 준비한 소스와 이미지들로 스토어 정보들을 등록하고 앱을 게시하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스토어 등록정보 1.png&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bK8jdI/btsl5jX6lgU/63ziilVjtZtsSSsBt2oVUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bK8jdI/btsl5jX6lgU/63ziilVjtZtsSSsBt2oVUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bK8jdI/btsl5jX6lgU/63ziilVjtZtsSSsBt2oVUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbK8jdI%2Fbtsl5jX6lgU%2F63ziilVjtZtsSSsBt2oVUK%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;748&quot; height=&quot;502&quot; data-filename=&quot;스토어 등록정보 1.png&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스토어 등록정보 2.png&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;705&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3yLJA/btsl6VQbc0P/eCH1JpKUwmEGkVqzcsCoc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3yLJA/btsl6VQbc0P/eCH1JpKUwmEGkVqzcsCoc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3yLJA/btsl6VQbc0P/eCH1JpKUwmEGkVqzcsCoc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3yLJA%2Fbtsl6VQbc0P%2FeCH1JpKUwmEGkVqzcsCoc0%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;746&quot; height=&quot;705&quot; data-filename=&quot;스토어 등록정보 2.png&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;705&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스토어 등록정보 3.png&quot; data-origin-width=&quot;734&quot; data-origin-height=&quot;663&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bF1sWz/btsl0L2UKpB/FGZLd1sT8suQMpehT9VGt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bF1sWz/btsl0L2UKpB/FGZLd1sT8suQMpehT9VGt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bF1sWz/btsl0L2UKpB/FGZLd1sT8suQMpehT9VGt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbF1sWz%2Fbtsl0L2UKpB%2FFGZLd1sT8suQMpehT9VGt0%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;734&quot; height=&quot;663&quot; data-filename=&quot;스토어 등록정보 3.png&quot; data-origin-width=&quot;734&quot; data-origin-height=&quot;663&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;프로젝트는 2023.06.19 ~ 2023.06.23 까지 총 5일이 소요되었으며 등록한 앱은 검토를 거쳐서 이틀 뒤인 6월 25일에 스토어에 프로덕션 상태로 등록되게되었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스토어 등록완료 1.png&quot; data-origin-width=&quot;1207&quot; data-origin-height=&quot;291&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LbpxM/btslZ6TNdEm/nY4Ry8BktBg3tdwHEbJKkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LbpxM/btslZ6TNdEm/nY4Ry8BktBg3tdwHEbJKkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LbpxM/btslZ6TNdEm/nY4Ry8BktBg3tdwHEbJKkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLbpxM%2FbtslZ6TNdEm%2FnY4Ry8BktBg3tdwHEbJKkk%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;1207&quot; height=&quot;291&quot; data-filename=&quot;스토어 등록완료 1.png&quot; data-origin-width=&quot;1207&quot; data-origin-height=&quot;291&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스토어 등록완료 2.jpg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwqbB9/btsl1WbxWE8/ObF1JuhKvFuhffZNq0ALtk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwqbB9/btsl1WbxWE8/ObF1JuhKvFuhffZNq0ALtk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwqbB9/btsl1WbxWE8/ObF1JuhKvFuhffZNq0ALtk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwqbB9%2Fbtsl1WbxWE8%2FObF1JuhKvFuhffZNq0ALtk%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;418&quot; height=&quot;859&quot; data-filename=&quot;스토어 등록완료 2.jpg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2220&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.hyojun.where_is_my_car&quot;&gt;https://play.google.com/store/apps/details?id=com.hyojun.where_is_my_car&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1688197507265&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;내차어딨지? - 주차 위치 기록하기 - Google Play 앱&quot; data-og-description=&quot;내 차 몇층에 있더라..? 이제 간편하게 기록하세요!&quot; data-og-host=&quot;play.google.com&quot; data-og-source-url=&quot;https://play.google.com/store/apps/details?id=com.hyojun.where_is_my_car&quot; data-og-url=&quot;https://play.google.com/store/apps/details?id=com.hyojun.where_is_my_car&amp;amp;hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c1954a/hyTa5UdrUJ/qgddeLj8BRr1hNWmxfrV90/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/KMiSd/hyTa2Dbn5y/TJoh9UNWwDMBaqZxTZIk3k/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/GsKct/hyTa5zVeWP/uJ0u3I0AgjKrt6iWhtPuUk/img.png?width=240&amp;amp;height=240&amp;amp;face=0_0_240_240&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.hyojun.where_is_my_car&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://play.google.com/store/apps/details?id=com.hyojun.where_is_my_car&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c1954a/hyTa5UdrUJ/qgddeLj8BRr1hNWmxfrV90/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/KMiSd/hyTa2Dbn5y/TJoh9UNWwDMBaqZxTZIk3k/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/GsKct/hyTa5zVeWP/uJ0u3I0AgjKrt6iWhtPuUk/img.png?width=240&amp;amp;height=240&amp;amp;face=0_0_240_240');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;내차어딨지? - 주차 위치 기록하기 - Google Play 앱&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;play.google.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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 개선 방향&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 먼저 상태관리 패키지인 Provider를 이용하여 소스코드 전체를 리팩토링 할 예정이다. 지금은 화면 하나에 기능도 몇 개 없어서 크게 문제가 없지만 나중에 기능이 추가되고 화면이 늘어나게 되었을 때 관리를 쉽게 하기 위해서는 필수적인 작업이라고 생각된다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발/Flutter</category>
      <category>Android</category>
      <category>FLUTTER</category>
      <category>IOS</category>
      <category>아이폰</category>
      <category>안드로이드</category>
      <category>크로스플랫폼</category>
      <category>플러터</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/166</guid>
      <comments>https://hyojun.tistory.com/entry/Flutter-%EC%B2%AB-%EB%B2%88%EC%A7%B8-%ED%86%A0%EC%9D%B4%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%95%B1%EA%B0%9C%EB%B0%9C%EB%B6%80%ED%84%B0-%EB%B0%B0%ED%8F%AC%EA%B9%8C%EC%A7%80-%ED%9A%8C%EA%B3%A0#entry166comment</comments>
      <pubDate>Sat, 1 Jul 2023 17:00:48 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 1091. Shortest Path in Binary Matrix - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-1091-Shortest-Path-in-Binary-Matrix-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/shortest-path-in-binary-matrix/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/shortest-path-in-binary-matrix/description/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1685599957285&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;Shortest Path in Binary Matrix - LeetCode&quot; data-og-description=&quot;Can you solve this real interview question? Shortest Path in Binary Matrix - Given an n x n binary matrix grid, return the length of the shortest clear path in the matrix. If there is no clear path, return -1. A clear path in a binary matrix is a path from&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/shortest-path-in-binary-matrix/description/&quot; data-og-url=&quot;https://leetcode.com/problems/shortest-path-in-binary-matrix/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cOZy6i/hySPqSOrak/KL8H6MIyi6ah1A29cVfOdK/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/goXPb/hySPsC3MGT/RF1wfIiRGzXT5hSlqikCc0/img.png?width=1996&amp;amp;height=864&amp;amp;face=0_0_1996_864,https://scrap.kakaocdn.net/dn/bK2bFk/hySPe5UBDr/dMNDhej9TTKNFkCiKqXXC0/img.png?width=1884&amp;amp;height=880&amp;amp;face=0_0_1884_880&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/shortest-path-in-binary-matrix/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/shortest-path-in-binary-matrix/description/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cOZy6i/hySPqSOrak/KL8H6MIyi6ah1A29cVfOdK/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/goXPb/hySPsC3MGT/RF1wfIiRGzXT5hSlqikCc0/img.png?width=1996&amp;amp;height=864&amp;amp;face=0_0_1996_864,https://scrap.kakaocdn.net/dn/bK2bFk/hySPe5UBDr/dMNDhej9TTKNFkCiKqXXC0/img.png?width=1884&amp;amp;height=880&amp;amp;face=0_0_1884_880');&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;Shortest Path in Binary Matrix - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Can you solve this real interview question? Shortest Path in Binary Matrix - Given an n x n binary matrix grid, return the length of the shortest clear path in the matrix. If there is no clear path, return -1. A clear path in a binary matrix is a path from&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;Given an n x n binary matrix grid, return the length of the shortest clear path in the matrix. If there is no clear path, return -1.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A clear path in a binary matrix is a path from the top-left cell (i.e., (0, 0)) to the bottom-right cell (i.e., (n - 1, n - 1)) such that:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;All the visited cells of the path are 0.&lt;/li&gt;
&lt;li&gt;All the adjacent cells of the path are 8-directionally connected (i.e., they are different and they share an edge or a corner).&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The&amp;nbsp;length&amp;nbsp;of&amp;nbsp;a&amp;nbsp;clear&amp;nbsp;path&amp;nbsp;is&amp;nbsp;the&amp;nbsp;number&amp;nbsp;of&amp;nbsp;visited&amp;nbsp;cells&amp;nbsp;of&amp;nbsp;this&amp;nbsp;path.&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;Example&amp;nbsp;1:&lt;/b&gt; &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;597&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8yEW6/btsicPOOoIk/cYaAC9OJh0gFv3aPeBmSak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8yEW6/btsicPOOoIk/cYaAC9OJh0gFv3aPeBmSak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8yEW6/btsicPOOoIk/cYaAC9OJh0gFv3aPeBmSak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8yEW6%2FbtsicPOOoIk%2FcYaAC9OJh0gFv3aPeBmSak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;597&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;597&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1685600116703&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: grid = [[0,1],[1,0]]
Output: 2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;554&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kDngw/btsiekALPHV/lwwr7ex7kNYyjLN5KuAeMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kDngw/btsiekALPHV/lwwr7ex7kNYyjLN5KuAeMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kDngw/btsiekALPHV/lwwr7ex7kNYyjLN5KuAeMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkDngw%2FbtsiekALPHV%2Flwwr7ex7kNYyjLN5KuAeMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;554&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;554&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1685600139856&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: grid = [[0,0,0],[1,1,0],[1,1,0]]
Output: 4&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 3:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1685600155447&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: grid = [[1,0,0],[1,1,0],[1,1,0]]
Output: -1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;n == grid.length&lt;/li&gt;
&lt;li&gt;n == grid[i].length&lt;/li&gt;
&lt;li&gt;1 &amp;lt;= n &amp;lt;= 100&lt;/li&gt;
&lt;li&gt;grid[i][j]&amp;nbsp;is&amp;nbsp;0&amp;nbsp;or&amp;nbsp;1&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;길이가 n이고 값이 0과 1로 이루어진 정사각형 모양의 2차원배열 grid가 주어지고 0은 이동을 했던 지점, 1은 이동을 하지 않았던 지점을 나타낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왼쪽 상단에서 출발하여 오른쪽 하단에 도착하려고 할 때 최단 거리를 구하는 문제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이동은 대각선을 포함한 8방향 모두 이동이 가능하고 출발점에서 도착점으로 가는 최단 경로가 존재하지 않는 경우 -1을 return한다.&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이거나 구할 수 없는 경우를 먼저 제외한다.&lt;br /&gt;배열의 길이를 n이라고 할 때 출발점의 값이 0이고 배열의 길이 n이 1인 경우는 항상 그 자체로 최단거리이므로 바로 1을 return 한다.&lt;br /&gt;만약 출발점이나 도착점의 값이 0이 아닌 경우는 출발점에서 도착점으로 이어지는 경로를 구할 수 없으므로 -1을 return한다.&lt;/p&gt;
&lt;pre id=&quot;code_1685600686488&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 배열의 길이
int n = grid.length;

// 배열이 한 칸이고 이동가능한 경우 최단거리 1을 return
if(grid[0][0] == 0 &amp;amp;&amp;amp; n == 1) return 1;
// 출발점이나 도착점이 이동 불가능한 지점인 경우 경로탐색이 불가능 하므로 -1을 return
if(grid[0][0] == 1 || grid[n - 1][n - 1] == 1) return -1;&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;이외의 경우에는 큐를 이용한 BFS탐색을 이용하기로 한다.&lt;br /&gt;우선 현재 좌표를 기준으로 왼쪽 위, 중앙 위, 오른쪽 위, 왼쪽, 오른쪽, 왼쪽 아래, 중앙 아래, 오른쪽 아래 순서대로 탐색할 방향을 지정한다.&lt;/p&gt;
&lt;pre id=&quot;code_1685600938648&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 탐색할 방향 (왼쪽 위, 중앙 위, 오른쪽 위, 왼쪽, 오른쪽, 왼쪽 아래, 중앙 아래, 오른쪽 아래)
int[][] dirs = {{-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1}};&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;다음으로 탐색에 사용할 큐를 선언해주고 출발점인 (0,0) 좌표를 삽입한다.&lt;/p&gt;
&lt;pre id=&quot;code_1685600966774&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 탐색에 사용할 큐 선언
Queue&amp;lt;int[]&amp;gt; q = new LinkedList&amp;lt;&amp;gt;();
// 큐에 출발점 삽입
q.offer(new int[] {0, 0});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;너비우선탐색을 위해서는 특정 지점의 방문 여부를 알 필요가 있는데 방문한 지점의 값을 -1로 바꾸어 방문 여부를 표시해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1685601029199&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 출발점값을 -1로 방문여부 표시
grid[0][0] = -1;&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;정답 카운트를 0부터 시작하여 큐가 빌 때까지 반복하여 탐색을 한다.&lt;br /&gt;먼저 정답 카운트를 하나 증가 시키고 현재 큐에 있는 모든 값을 반복 하여 탐색한다.&lt;br /&gt;현재 탐색중인 지점이 도착점인 경우 정답값을 return 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇지 않은 경우에는 나머지 8방향 탐색을 계속한다.&lt;br /&gt;처음에 선언해준 탐색 방향대로 새로운 행 좌표와 열 좌표를 각각 구하고&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;새로운 좌표가 배열을 벗어나는 경우&lt;/li&gt;
&lt;li&gt;방문 가능한 좌표가 아닌 경우( 값이 1인 경우 )&lt;/li&gt;
&lt;li&gt;이미 방문한 경우 ( 값이 -1인 경우 )&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 경우에는 탐색에서 제외한다.&lt;br /&gt;탐색이 가능한 경우에는 새로운 좌표의 값을 -1로 변경하여 방문 표시를 하고, 큐에 새로운 좌표값을 추가한다.&lt;/p&gt;
&lt;pre id=&quot;code_1685601355248&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 큐가 빌 때까지 반복
while(!q.isEmpty()) {
    // 정답 카운트 증가
    answer++;
    // 현재 큐에 있는 모든 요소 탐색
    for(int i = q.size(); i &amp;gt; 0; i--) {
        // 현재 탐색중인 지점
        int[] point = q.poll();
        // 현재 탐색중인 지점의 행 좌표
        int row = point[0];
        // 현재 탐색중인 지점의 열 좌표
        int col = point[1];

        // 도착점에 도착한 경우 정답 카운트를 return
        if(row == n - 1 &amp;amp;&amp;amp; col == n - 1) return answer;

        // 8방향 탐색
        for(int[] dir : dirs) {
            // 새로운 행 좌표
            int newRow = row + dir[0];
            // 새로운 열 좌표
            int newCol = col + dir[1];
            // 새로운 좌표가 배열을 벗어나는 경우 탐색 제외
            if(newRow &amp;lt; 0 || newRow == n || newCol &amp;lt; 0 || newCol == n) continue;
            // 새로운 좌표가 방문 가능한 좌표가 아니거나 이미 방문한 경우 탐색 제외
            if(grid[newRow][newCol] != 0) continue;

            // 현재 좌표 -1로 방문 표시
            grid[newRow][newCol] = -1;
            // 큐에 새로운 좌표값 주가
            q.offer(new int[] {newRow, newCol});
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1685599966153&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int shortestPathBinaryMatrix(int[][] grid) {
        // 배열의 길이
        int n = grid.length;
        
        // 배열이 한 칸이고 이동가능한 경우 최단거리 1을 return
        if(grid[0][0] == 0 &amp;amp;&amp;amp; n == 1) return 1;
        // 출발점이나 도착점이 이동 불가능한 지점인 경우 경로탐색이 불가능 하므로 -1을 return
        if(grid[0][0] == 1 || grid[n - 1][n - 1] == 1) return -1;
        
        // 탐색할 방향 (왼쪽 위, 중앙 위, 오른쪽 위, 왼쪽, 오른쪽, 왼쪽 아래, 중앙 아래, 오른쪽 아래)
        int[][] dirs = {{-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1}};
        // 탐색에 사용할 큐 선언
        Queue&amp;lt;int[]&amp;gt; q = new LinkedList&amp;lt;&amp;gt;();
        // 큐에 출발점 삽입
        q.offer(new int[] {0, 0});
        // 출발점값을 -1로 방문여부 표시
        grid[0][0] = -1;
        
        // 정답 카운트
        int answer = 0;
        
        // 큐가 빌 때까지 반복
        while(!q.isEmpty()) {
            // 정답 카운트 증가
            answer++;
            // 현재 큐에 있는 모든 요소 탐색
            for(int i = q.size(); i &amp;gt; 0; i--) {
                // 현재 탐색중인 지점
                int[] point = q.poll();
                // 현재 탐색중인 지점의 행 좌표
                int row = point[0];
                // 현재 탐색중인 지점의 열 좌표
                int col = point[1];
                
                // 도착점에 도착한 경우 정답 카운트를 return
                if(row == n - 1 &amp;amp;&amp;amp; col == n - 1) return answer;
                
                // 8방향 탐색
                for(int[] dir : dirs) {
                    // 새로운 행 좌표
                    int newRow = row + dir[0];
                    // 새로운 열 좌표
                    int newCol = col + dir[1];
                    // 새로운 좌표가 배열을 벗어나는 경우 탐색 제외
                    if(newRow &amp;lt; 0 || newRow == n || newCol &amp;lt; 0 || newCol == n) continue;
                    // 새로운 좌표가 방문 가능한 좌표가 아니거나 이미 방문한 경우 탐색 제외
                    if(grid[newRow][newCol] != 0) continue;
                    
                    // 현재 좌표 -1로 방문 표시
                    grid[newRow][newCol] = -1;
                    // 큐에 새로운 좌표값 주가
                    q.offer(new int[] {newRow, newCol});
                }
            }
        }

        return -1;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algrythm</category>
      <category>BFS</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>너비우선탐색</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/164</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-1091-Shortest-Path-in-Binary-Matrix-Java#entry164comment</comments>
      <pubDate>Thu, 1 Jun 2023 15:36:05 +0900</pubDate>
    </item>
    <item>
      <title>[Flutter] 어플리케이션 실행 아이콘 변경하기 2 - 플러그인 이용</title>
      <link>https://hyojun.tistory.com/entry/Flutter-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%8B%A4%ED%96%89-%EC%95%84%EC%9D%B4%EC%BD%98-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B8%B0-2-%ED%94%8C%EB%9F%AC%EA%B7%B8%EC%9D%B8-%EC%9D%B4%EC%9A%A9</link>
      <description>&lt;figure id=&quot;og_1684995380656&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Flutter] 어플리케이션 실행 아이콘 변경하기&quot; data-og-description=&quot;플러터로 새로운 프로젝트를 만들고 실행하면 아래와 같은 플러터 아이콘이 기본 어플리케이션 아이콘으로 생성된다. 어플리케이션의 실행 아이콘으로 사용하고자 하는 이미지를 준비하여 다&quot; data-og-host=&quot;hyojun.tistory.com&quot; data-og-source-url=&quot;https://hyojun.tistory.com/entry/Flutter-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%8B%A4%ED%96%89-%EC%95%84%EC%9D%B4%EC%BD%98-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B8%B0&quot; data-og-url=&quot;https://hyojun.tistory.com/entry/Flutter-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%8B%A4%ED%96%89-%EC%95%84%EC%9D%B4%EC%BD%98-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B8%B0&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bWvytU/hySKCd8sB8/CjSIy2UhLK1GN1SdWwNIj1/img.png?width=51&amp;amp;height=51&amp;amp;face=0_0_51_51,https://scrap.kakaocdn.net/dn/Dd5IQ/hySKHzLx36/9RdbikvfSm66Ho4Z9jR4B0/img.png?width=51&amp;amp;height=51&amp;amp;face=0_0_51_51,https://scrap.kakaocdn.net/dn/Z2Q8o/hySKwZjCSk/qhayvyl5vK4VhFpjveClQ1/img.png?width=963&amp;amp;height=452&amp;amp;face=0_0_963_452&quot;&gt;&lt;a href=&quot;https://hyojun.tistory.com/entry/Flutter-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%8B%A4%ED%96%89-%EC%95%84%EC%9D%B4%EC%BD%98-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hyojun.tistory.com/entry/Flutter-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%8B%A4%ED%96%89-%EC%95%84%EC%9D%B4%EC%BD%98-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B8%B0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bWvytU/hySKCd8sB8/CjSIy2UhLK1GN1SdWwNIj1/img.png?width=51&amp;amp;height=51&amp;amp;face=0_0_51_51,https://scrap.kakaocdn.net/dn/Dd5IQ/hySKHzLx36/9RdbikvfSm66Ho4Z9jR4B0/img.png?width=51&amp;amp;height=51&amp;amp;face=0_0_51_51,https://scrap.kakaocdn.net/dn/Z2Q8o/hySKwZjCSk/qhayvyl5vK4VhFpjveClQ1/img.png?width=963&amp;amp;height=452&amp;amp;face=0_0_963_452');&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;[Flutter] 어플리케이션 실행 아이콘 변경하기&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;hyojun.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 글에서 플러그인 없이 앱 실행 아이콘 변경하는 법을 정리하였는데 플러그인을 이용해서 해당 과정을 간단하게 처리하는 방법도 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;flutter_launcher_icons라는 플러그인을 이용하는 것인데 아래의 플러그인 문서를 참고하여 pubspec.yaml 파일에 dependencies를 추가한다.&lt;/p&gt;
&lt;figure id=&quot;og_1684995462627&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;flutter_launcher_icons | Dart Package&quot; data-og-description=&quot;A package which simplifies the task of updating your Flutter app's launcher icon.&quot; data-og-host=&quot;pub.dev&quot; data-og-source-url=&quot;https://pub.dev/packages/flutter_launcher_icons&quot; data-og-url=&quot;https://pub.dev/packages/flutter_launcher_icons&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/lgXU8/hySKCSLpR8/pI4flxIbhNs5X5XPNHo2t0/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640,https://scrap.kakaocdn.net/dn/bq0TBU/hySKDRFaI2/Stxmk4RzVimDPCgYLZD3VK/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640,https://scrap.kakaocdn.net/dn/xKbca/hySKBM4Yla/zKvPvOxcpaZ2Ukm1ic8t00/img.png?width=495&amp;amp;height=409&amp;amp;face=0_0_495_409&quot;&gt;&lt;a href=&quot;https://pub.dev/packages/flutter_launcher_icons&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://pub.dev/packages/flutter_launcher_icons&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/lgXU8/hySKCSLpR8/pI4flxIbhNs5X5XPNHo2t0/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640,https://scrap.kakaocdn.net/dn/bq0TBU/hySKDRFaI2/Stxmk4RzVimDPCgYLZD3VK/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640,https://scrap.kakaocdn.net/dn/xKbca/hySKBM4Yla/zKvPvOxcpaZ2Ukm1ic8t00/img.png?width=495&amp;amp;height=409&amp;amp;face=0_0_495_409');&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;flutter_launcher_icons | Dart Package&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A package which simplifies the task of updating your Flutter app's launcher icon.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;pub.dev&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;앱아이콘 변경 플러그인 - 1.png&quot; data-origin-width=&quot;811&quot; data-origin-height=&quot;715&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOUt4w/btshqxmmzZe/1jREtri6KMNwWFIST6DK9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOUt4w/btshqxmmzZe/1jREtri6KMNwWFIST6DK9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOUt4w/btshqxmmzZe/1jREtri6KMNwWFIST6DK9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOUt4w%2FbtshqxmmzZe%2F1jREtri6KMNwWFIST6DK9K%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;811&quot; height=&quot;715&quot; data-filename=&quot;앱아이콘 변경 플러그인 - 1.png&quot; data-origin-width=&quot;811&quot; data-origin-height=&quot;715&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;그 후 pubspec.yaml 파일과 같은 경로에 flutter_launcher_icons.yaml 파일을 생성하여 아래와 같이 작성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1684995776086&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;flutter_icons:
  android: &quot;launcher_icon&quot;
  ios: true
  image_path: &quot;images/i_am_rich_app_icon.png&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;image_path에는 앱 실행아이콘으로 사용할 이미지를 넣어놓은 경로를 작성해주면 된다.&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_1684995863700&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;flutter pub run flutter_launcher_icons:main&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 작업이 완료된 후 프로젝트 빌드를 다시 진행하면 수동 작업과 마찬가지로 변경된 앱 아이콘을 확인할 수 있다.&lt;/p&gt;</description>
      <category>개발/Flutter</category>
      <category>FLUTTER</category>
      <category>앱 아이콘 변경</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/163</guid>
      <comments>https://hyojun.tistory.com/entry/Flutter-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%8B%A4%ED%96%89-%EC%95%84%EC%9D%B4%EC%BD%98-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B8%B0-2-%ED%94%8C%EB%9F%AC%EA%B7%B8%EC%9D%B8-%EC%9D%B4%EC%9A%A9#entry163comment</comments>
      <pubDate>Thu, 25 May 2023 15:26:17 +0900</pubDate>
    </item>
    <item>
      <title>[Flutter] 어플리케이션 실행 아이콘 변경하기</title>
      <link>https://hyojun.tistory.com/entry/Flutter-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%8B%A4%ED%96%89-%EC%95%84%EC%9D%B4%EC%BD%98-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;플러터로 새로운 프로젝트를 만들고 실행하면 아래와 같은 플러터 아이콘이 기본 어플리케이션 아이콘으로 생성된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;앱아이콘 변경 - 0.png&quot; data-origin-width=&quot;51&quot; data-origin-height=&quot;51&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lR1t0/btshih57Ggc/8Kp4REkbMis0dBcoeMPL71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lR1t0/btshih57Ggc/8Kp4REkbMis0dBcoeMPL71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lR1t0/btshih57Ggc/8Kp4REkbMis0dBcoeMPL71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlR1t0%2Fbtshih57Ggc%2F8Kp4REkbMis0dBcoeMPL71%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;74&quot; height=&quot;74&quot; data-filename=&quot;앱아이콘 변경 - 0.png&quot; data-origin-width=&quot;51&quot; data-origin-height=&quot;51&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;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;이 사이트에서는 각 기기&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;환경에 맞는 어플리케이션 아이콘을 자동으로 생성해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.appicon.co/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.appicon.co/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1684939706911&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;App Icon Generator&quot; data-og-description=&quot;&quot; data-og-host=&quot;www.appicon.co&quot; data-og-source-url=&quot;https://www.appicon.co/&quot; data-og-url=&quot;https://www.appicon.co/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.appicon.co/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.appicon.co/&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;App Icon Generator&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.appicon.co&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사이트에 접속하여 왼쪽에 사용하고자 하는 이미지를 드래그 하고 오른쪽에서 생성하고자 하는 기기 종류를 선택하여 Generate 버튼을 클릭한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;앱아이콘 변경 - 2.png&quot; data-origin-width=&quot;1005&quot; data-origin-height=&quot;755&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wdszv/btshh8IumHm/LypCxDAP03h1SRK0m5ctYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wdszv/btshh8IumHm/LypCxDAP03h1SRK0m5ctYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wdszv/btshh8IumHm/LypCxDAP03h1SRK0m5ctYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwdszv%2Fbtshh8IumHm%2FLypCxDAP03h1SRK0m5ctYK%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;1005&quot; height=&quot;755&quot; data-filename=&quot;앱아이콘 변경 - 2.png&quot; data-origin-width=&quot;1005&quot; data-origin-height=&quot;755&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;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;앱아이콘 변경 - 3.png&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;452&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A0iog/btshihkMAju/6VYTLiIltwXVYSSxFKdiek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A0iog/btshihkMAju/6VYTLiIltwXVYSSxFKdiek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A0iog/btshihkMAju/6VYTLiIltwXVYSSxFKdiek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA0iog%2FbtshihkMAju%2F6VYTLiIltwXVYSSxFKdiek%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;963&quot; height=&quot;452&quot; data-filename=&quot;앱아이콘 변경 - 3.png&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;452&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;앱아이콘 변경 - 4.png&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;452&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cf1N5T/btshjEe9Ymg/G3GzeCgJVP8ZOkLcHPpgVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cf1N5T/btshjEe9Ymg/G3GzeCgJVP8ZOkLcHPpgVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cf1N5T/btshjEe9Ymg/G3GzeCgJVP8ZOkLcHPpgVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcf1N5T%2FbtshjEe9Ymg%2FG3GzeCgJVP8ZOkLcHPpgVK%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;963&quot; height=&quot;452&quot; data-filename=&quot;앱아이콘 변경 - 4.png&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;452&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;이제 안드로이드와 ios 각각의 앱 아이콘 경로를 찾아 파일을 교체 해준다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 안드로이드&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;android &amp;gt; app &amp;gt; src &amp;gt; main &amp;gt; res 경로에서 우클릭하여 파일 탐색기에 표시한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;앱아이콘 변경 - 5.png&quot; data-origin-width=&quot;486&quot; data-origin-height=&quot;621&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kW2VH/btshi7IKLYP/ECE9hnimTKHOxUi1JimnH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kW2VH/btshi7IKLYP/ECE9hnimTKHOxUi1JimnH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kW2VH/btshi7IKLYP/ECE9hnimTKHOxUi1JimnH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkW2VH%2Fbtshi7IKLYP%2FECE9hnimTKHOxUi1JimnH0%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;486&quot; height=&quot;621&quot; data-filename=&quot;앱아이콘 변경 - 5.png&quot; data-origin-width=&quot;486&quot; data-origin-height=&quot;621&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;탐색기에서 아래와 같은 5개의 폴더를 사이트에서 생성한 폴더로 교체해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;앱아이콘 변경 - 6.png&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;452&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kQpLE/btshkadP4AI/s331oNi8jnrP4MtTMg7uX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kQpLE/btshkadP4AI/s331oNi8jnrP4MtTMg7uX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kQpLE/btshkadP4AI/s331oNi8jnrP4MtTMg7uX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkQpLE%2FbtshkadP4AI%2Fs331oNi8jnrP4MtTMg7uX0%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;963&quot; height=&quot;452&quot; data-filename=&quot;앱아이콘 변경 - 6.png&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;452&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. ios&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ios 역시 안드로이드와 과정은 같다.&lt;br /&gt;ios &amp;gt; Runner Assets.xcassets 폴더를 파일 탐색기에 표시하고 Assets.xcassets 폴더를 사이트에서 생성한 폴더로 교체해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;앱아이콘 변경 - 7.png&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnjqSf/btshj4kqfi1/ykRVoOK4Ick8xSmstoLVw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnjqSf/btshj4kqfi1/ykRVoOK4Ick8xSmstoLVw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnjqSf/btshj4kqfi1/ykRVoOK4Ick8xSmstoLVw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnjqSf%2Fbtshj4kqfi1%2FykRVoOK4Ick8xSmstoLVw0%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;537&quot; height=&quot;526&quot; data-filename=&quot;앱아이콘 변경 - 7.png&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;526&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;앱아이콘 변경 - 8.png&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;452&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpJH4U/btshiGEwnuw/uz3YDAXbCko9do7cZnnC6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpJH4U/btshiGEwnuw/uz3YDAXbCko9do7cZnnC6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpJH4U/btshiGEwnuw/uz3YDAXbCko9do7cZnnC6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpJH4U%2FbtshiGEwnuw%2Fuz3YDAXbCko9do7cZnnC6k%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;963&quot; height=&quot;452&quot; data-filename=&quot;앱아이콘 변경 - 8.png&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;452&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;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;앱아이콘 변경 - 9.png&quot; data-origin-width=&quot;51&quot; data-origin-height=&quot;51&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zFfoB/btshkyFz8HD/8i3DMKafgXpxYwAkKPRWKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zFfoB/btshkyFz8HD/8i3DMKafgXpxYwAkKPRWKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zFfoB/btshkyFz8HD/8i3DMKafgXpxYwAkKPRWKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzFfoB%2FbtshkyFz8HD%2F8i3DMKafgXpxYwAkKPRWKk%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;67&quot; height=&quot;67&quot; data-filename=&quot;앱아이콘 변경 - 9.png&quot; data-origin-width=&quot;51&quot; data-origin-height=&quot;51&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* 플러그인을 이용하여 실행 아이콘 변경하기&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1684996014682&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Flutter] 어플리케이션 실행 아이콘 변경하기 2 - 플러그인 이용&quot; data-og-description=&quot;[Flutter] 어플리케이션 실행 아이콘 변경하기 플러터로 새로운 프로젝트를 만들고 실행하면 아래와 같은 플러터 아이콘이 기본 어플리케이션 아이콘으로 생성된다. 어플리케이션의 실행 아이콘&quot; data-og-host=&quot;hyojun.tistory.com&quot; data-og-source-url=&quot;https://hyojun.tistory.com/entry/Flutter-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%8B%A4%ED%96%89-%EC%95%84%EC%9D%B4%EC%BD%98-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B8%B0-2-%ED%94%8C%EB%9F%AC%EA%B7%B8%EC%9D%B8-%EC%9D%B4%EC%9A%A9&quot; data-og-url=&quot;https://hyojun.tistory.com/entry/Flutter-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%8B%A4%ED%96%89-%EC%95%84%EC%9D%B4%EC%BD%98-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B8%B0-2-%ED%94%8C%EB%9F%AC%EA%B7%B8%EC%9D%B8-%EC%9D%B4%EC%9A%A9&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dsQ4fC/hySKsP86GL/4qdLcvKJ9uhUVy9QhfoZqk/img.png?width=800&amp;amp;height=705&amp;amp;face=0_0_800_705,https://scrap.kakaocdn.net/dn/sO1Vh/hySKsWVYno/f1Hp3zRlmq8UXJwxwKwuck/img.png?width=800&amp;amp;height=705&amp;amp;face=0_0_800_705,https://scrap.kakaocdn.net/dn/XuERn/hySKwdX7xR/XJIVw5skkK2nUx7hFVp1i1/img.png?width=811&amp;amp;height=715&amp;amp;face=0_0_811_715&quot;&gt;&lt;a href=&quot;https://hyojun.tistory.com/entry/Flutter-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%8B%A4%ED%96%89-%EC%95%84%EC%9D%B4%EC%BD%98-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B8%B0-2-%ED%94%8C%EB%9F%AC%EA%B7%B8%EC%9D%B8-%EC%9D%B4%EC%9A%A9&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hyojun.tistory.com/entry/Flutter-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%8B%A4%ED%96%89-%EC%95%84%EC%9D%B4%EC%BD%98-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B8%B0-2-%ED%94%8C%EB%9F%AC%EA%B7%B8%EC%9D%B8-%EC%9D%B4%EC%9A%A9&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dsQ4fC/hySKsP86GL/4qdLcvKJ9uhUVy9QhfoZqk/img.png?width=800&amp;amp;height=705&amp;amp;face=0_0_800_705,https://scrap.kakaocdn.net/dn/sO1Vh/hySKsWVYno/f1Hp3zRlmq8UXJwxwKwuck/img.png?width=800&amp;amp;height=705&amp;amp;face=0_0_800_705,https://scrap.kakaocdn.net/dn/XuERn/hySKwdX7xR/XJIVw5skkK2nUx7hFVp1i1/img.png?width=811&amp;amp;height=715&amp;amp;face=0_0_811_715');&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;[Flutter] 어플리케이션 실행 아이콘 변경하기 2 - 플러그인 이용&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;[Flutter] 어플리케이션 실행 아이콘 변경하기 플러터로 새로운 프로젝트를 만들고 실행하면 아래와 같은 플러터 아이콘이 기본 어플리케이션 아이콘으로 생성된다. 어플리케이션의 실행 아이콘&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hyojun.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발/Flutter</category>
      <category>FLUTTER</category>
      <category>아이콘 변경</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/162</guid>
      <comments>https://hyojun.tistory.com/entry/Flutter-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%8B%A4%ED%96%89-%EC%95%84%EC%9D%B4%EC%BD%98-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B8%B0#entry162comment</comments>
      <pubDate>Thu, 25 May 2023 00:05:46 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 703. Kth Largest Element in a Stream - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-703-Kth-Largest-Element-in-a-Stream-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/kth-largest-element-in-a-stream/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/kth-largest-element-in-a-stream/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1684820932421&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;Kth Largest Element in a Stream - LeetCode&quot; data-og-description=&quot;Can you solve this real interview question? Kth Largest Element in a Stream - Design a class to find the kth largest element in a stream. Note that it is the kth largest element in the sorted order, not the kth distinct element. Implement KthLargest class:&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/kth-largest-element-in-a-stream/&quot; data-og-url=&quot;https://leetcode.com/problems/kth-largest-element-in-a-stream/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/coh5s5/hySJbtTRLR/xx8AYkLQPYMl6DmPtwWoLk/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/Dn45O/hySJkxBy04/BKq8Hf9mg6AjGMTlE9BIfk/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/kth-largest-element-in-a-stream/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/kth-largest-element-in-a-stream/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/coh5s5/hySJbtTRLR/xx8AYkLQPYMl6DmPtwWoLk/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/Dn45O/hySJkxBy04/BKq8Hf9mg6AjGMTlE9BIfk/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222');&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;Kth Largest Element in a Stream - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Can you solve this real interview question? Kth Largest Element in a Stream - Design a class to find the kth largest element in a stream. Note that it is the kth largest element in the sorted order, not the kth distinct element. Implement KthLargest class:&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;Design&amp;nbsp;a&amp;nbsp;class&amp;nbsp;to&amp;nbsp;find&amp;nbsp;the&amp;nbsp;kth&amp;nbsp;largest&amp;nbsp;element&amp;nbsp;in&amp;nbsp;a&amp;nbsp;stream.&amp;nbsp;Note&amp;nbsp;that&amp;nbsp;it&amp;nbsp;is&amp;nbsp;the&amp;nbsp;kth&amp;nbsp;largest&amp;nbsp;element&amp;nbsp;in&amp;nbsp;the&amp;nbsp;sorted&amp;nbsp;order,&amp;nbsp;not&amp;nbsp;the&amp;nbsp;kth&amp;nbsp;distinct&amp;nbsp;element. &lt;br /&gt;&lt;br /&gt;Implement KthLargest class:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;KthLargest(int k, int[] nums) Initializes the object with the integer k and the stream of integers nums.&lt;/li&gt;
&lt;li&gt;int add(int val) Appends the integer val to the stream and returns the element representing the kth largest element in the stream.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1684821171650&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input
[&quot;KthLargest&quot;, &quot;add&quot;, &quot;add&quot;, &quot;add&quot;, &quot;add&quot;, &quot;add&quot;]
[[3, [4, 5, 8, 2]], [3], [5], [10], [9], [4]]
Output
[null, 4, 5, 5, 8, 8]

Explanation
KthLargest kthLargest = new KthLargest(3, [4, 5, 8, 2]);
kthLargest.add(3);   // return 4
kthLargest.add(5);   // return 5
kthLargest.add(10);  // return 5
kthLargest.add(9);   // return 8
kthLargest.add(4);   // return 8&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1 &amp;lt;= k &amp;lt;= 104&lt;/li&gt;
&lt;li&gt;0&amp;nbsp;&amp;lt;=&amp;nbsp;nums.length&amp;nbsp;&amp;lt;=&amp;nbsp;104&lt;/li&gt;
&lt;li&gt;-104 &amp;lt;= nums[i] &amp;lt;= 104&lt;/li&gt;
&lt;li&gt;-104 &amp;lt;= val &amp;lt;= 104&lt;/li&gt;
&lt;li&gt;At most 104 calls will be made to add.&lt;/li&gt;
&lt;li&gt;It&amp;nbsp;is&amp;nbsp;guaranteed&amp;nbsp;that&amp;nbsp;there&amp;nbsp;will&amp;nbsp;be&amp;nbsp;at&amp;nbsp;least&amp;nbsp;k&amp;nbsp;elements&amp;nbsp;in&amp;nbsp;the&amp;nbsp;array&amp;nbsp;when&amp;nbsp;you&amp;nbsp;search&amp;nbsp;for&amp;nbsp;the&amp;nbsp;kth&amp;nbsp;element.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정수 k와 정수 배열 nums 배열이 주어지고 정수들을 추가할 때 k번째로 큰 숫자를 찾아내는 클래스를 구현해야 하는 문제이다.&lt;br /&gt;클래스에서 구현해야하는 함수는 인스턴스를 초기화하는 함수 KthLargest와 값을 추가해주는 add이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 클래스를 구현하기 위해서 우선순위큐를 사용하도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nums의 모든 요소와 추가되는 정수들을 우선순위큐에 담고 큐의 사이즈가 k를 초과하는 경우 마지막 요소를 제거하며 항상 k번째 큰 수가 다음에 나오도록 하는 방향으로 풀이한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 우선순위큐와 큐의 최대 사이즈가 될 변수를 전역변수로 선언한다,&lt;/p&gt;
&lt;pre id=&quot;code_1684821944770&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 크기 순으로 저장할 우선순위큐 선언
PriorityQueue&amp;lt;Integer&amp;gt; pq = new PriorityQueue&amp;lt;&amp;gt;();
// 큐에 저장할 최대 길이
int size;&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;인스턴스를 초기화 하는 함수에서는 전역변수 size에 k의 값을 저장해주고 nums 배열의 모든 요소를 큐에 저장한다.&lt;br /&gt;이 때 큐의 크기가 k보다 커지게 되는 경우에는 마지막 요소를 하나 제거한다.&lt;/p&gt;
&lt;pre id=&quot;code_1684822015450&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; public KthLargest(int k, int[] nums) {
    size = k;

    // nums 배열의 요소들을 큐에 저장
    for(int i : nums) {
        pq.offer(i);
        // 큐의 크기가 k보다 큰 경우 마지막 요소 제거
        if(pq.size() &amp;gt; k) pq.poll();
    }
}&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;수를 추가하는 add 함수에서는 전달받은 val값을 큐에 추가하고 마찬 가지로 길이 k를 초과하게 되는 경우에는 마지막 요소를 제거한다. 그 후 마지막에 있는 요소 값을 return 해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1684822078954&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public int add(int val) {
    // val 값을 큐에 추가
    pq.offer(val);
    // k길이를 초과하게되는 마지막 요소 제거
    if(pq.size() &amp;gt; size) pq.poll();

    // 마지막에 있는 요소를 return
    return pq.peek();
}&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1684820930274&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class KthLargest {
    // 크기 순으로 저장할 우선순위큐 선언
    PriorityQueue&amp;lt;Integer&amp;gt; pq = new PriorityQueue&amp;lt;&amp;gt;();
    // 큐에 저장할 최대 길이
    int size;

    public KthLargest(int k, int[] nums) {
        size = k;
        
        // nums 배열의 요소들을 큐에 저장
        for(int i : nums) {
            pq.offer(i);
            // 큐의 크기가 k보다 큰 경우 마지막 요소 제거
            if(pq.size() &amp;gt; k) pq.poll();
        }
    }
    
    public int add(int val) {
        // val 값을 큐에 추가
        pq.offer(val);
        // k길이를 초과하게되는 마지막 요소 제거
        if(pq.size() &amp;gt; size) pq.poll();
        
        // 마지막에 있는 요소를 return
        return pq.peek();
    }
}

/**
 * Your KthLargest object will be instantiated and called as such:
 * KthLargest obj = new KthLargest(k, nums);
 * int param_1 = obj.add(val);
 */&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>queue</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>자바</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/161</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-703-Kth-Largest-Element-in-a-Stream-Java#entry161comment</comments>
      <pubDate>Tue, 23 May 2023 15:08:06 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 2466. Count Ways To Build Good Strings</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-2466-Count-Ways-To-Build-Good-Strings</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/count-ways-to-build-good-strings/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/count-ways-to-build-good-strings/description/&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Given the integers zero, one, low, and high, we can construct a string by starting with an empty string, and then at each step perform either of the following:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Append the character '0' zero times.&lt;/li&gt;
&lt;li&gt;Append the character '1' one times.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;This&amp;nbsp;can&amp;nbsp;be&amp;nbsp;performed&amp;nbsp;any&amp;nbsp;number&amp;nbsp;of&amp;nbsp;times. &lt;br /&gt;&lt;br /&gt;A&amp;nbsp;good&amp;nbsp;string&amp;nbsp;is&amp;nbsp;a&amp;nbsp;string&amp;nbsp;constructed&amp;nbsp;by&amp;nbsp;the&amp;nbsp;above&amp;nbsp;process&amp;nbsp;having&amp;nbsp;a&amp;nbsp;length&amp;nbsp;between&amp;nbsp;low&amp;nbsp;and&amp;nbsp;high&amp;nbsp;(inclusive). &lt;br /&gt;&lt;br /&gt;Return the number of different good strings that can be constructed satisfying these properties. Since the answer can be large, return it modulo 10^9 + 7.&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;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1683997257611&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: low = 3, high = 3, zero = 1, one = 1
Output: 8
Explanation: 
One possible valid good string is &quot;011&quot;. 
It can be constructed as follows: &quot;&quot; -&amp;gt; &quot;0&quot; -&amp;gt; &quot;01&quot; -&amp;gt; &quot;011&quot;. 
All binary strings from &quot;000&quot; to &quot;111&quot; are good strings in this example.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1683997263419&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: low = 2, high = 3, zero = 1, one = 2
Output: 5
Explanation: The good strings are &quot;00&quot;, &quot;11&quot;, &quot;000&quot;, &quot;110&quot;, and &quot;011&quot;.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1&amp;nbsp;&amp;lt;=&amp;nbsp;low&amp;nbsp;&amp;lt;=&amp;nbsp;high&amp;nbsp;&amp;lt;=&amp;nbsp;105&lt;/li&gt;
&lt;li&gt;1 &amp;lt;= zero, one &amp;lt;= low&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;zero, one, low, high 4개의 정수 변수가 주어진다.&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;'0'을 zero번 붙인다.&lt;/li&gt;
&lt;li&gt;'1'을 one번 붙인다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 만들 수 있는 문자열 중 문자열의 길이가 low이상 high이하인 문자열을 good string으로 정의하며 good string의 총 개수를 구하는 문제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답이 매우 큰 수 일 수 있으므로 10^9 + 7로 나눈 나머지를 return한다.&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;dp를 이용하여 각 자리수마다 만들 수 있는 문자열의 경우의 수를 구하고 그 길이가 low이상 high이하인 경우의 수를 더한 값을 return하는 방식으로 풀이한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 자리수마다 만들어질 수 있는 경우의 수를 저장할 배열을 선언하고 첫 번째값을 1로 세팅한다.&lt;/p&gt;
&lt;pre id=&quot;code_1683997523483&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 각 자리수마다 만들어질 수 있는 경우의 수를 저장할 배열
int[] dp = new int[high + 1];
// 아무것도 만들수 없는 경우의 수 1
dp[0] = 1;&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;단어를 만들 수 있는 최소한의 길이는 zero와 one중 작은 값이다. 단어를 만들 수 있는 최소한의 길이보다 작은 경우에는 만들 수 있는 경우의 수가 존재하지 않으므로 이 최소 길이부터 탐색을 시작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 탐색중인 문자열 자리수가 0이 들어갈 개수 이상인 경우 zero만큼 이전 자리수의 경우의 수 만큼의 개수를 현재 인덱스 값에 추가한다.&lt;br /&gt;1이 들어갈 경우에 대해서도 같은 방법으로 탐색한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 현재 탐색중인 문자열 자리수가 good string이 되는 길이인 경우에는 정답에 현재 인덱스의 값을 추가한다.&lt;br /&gt;모든 탐색이 종료된 후 최종적으로 구해진 정답을 return한다.&lt;/p&gt;
&lt;pre id=&quot;code_1683997579467&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int answer = 0;
// 단어를 만들 수 있는 최소 길이
int minLength = Math.min(zero, one);
// 나머지 계산을 위한 수
int mod = 1000000007;

// 단어를 만들 수 있는 최소 길이부터 탐색
for(int i = minLength; i &amp;lt;= high; i++) {
    // 현재 탐색중인 문자열 자리수가 0이 들어갈 개수 이상인 경우
    if(i &amp;gt;= zero) {
        // 0의 개수 이전 자리수의 경우의 수 만큼 추가
        dp[i] = (dp[i] + dp[i - zero]) % mod;
    }
    // 현재 탐색중인 문자열 자리수가 1이 들어갈 개수 이상인 경우
    if(i &amp;gt;= one) {
        // 1의 개수 이전 자리수의 경우의 수 만큼 추가
        dp[i] = (dp[i] + dp[i - one]) % mod;
    }
    // 현재 탐색중인 문자열 자리수가 good string이 되는 길이인 경우
    if(i &amp;gt;= low) {
        // 정답 개수 추가
        answer = (answer + dp[i]) % mod;
    }
}

return answer;&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;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1683996391651&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int countGoodStrings(int low, int high, int zero, int one) {
        int answer = 0;
        
        // 단어를 만들 수 있는 최소 길이
        int minLength = Math.min(zero, one);
        // 나머지 계산을 위한 수
        int mod = 1000000007;
        // 각 자리수마다 만들어질 수 있는 경우의 수를 저장할 배열
        int[] dp = new int[high + 1];
        // 아무것도 만들수 없는 경우의 수 1
        dp[0] = 1;
        
        // 단어를 만들 수 있는 최소 길이부터 탐색
        for(int i = minLength; i &amp;lt;= high; i++) {
            // 현재 탐색중인 문자열 자리수가 0이 들어갈 개수 이상인 경우
            if(i &amp;gt;= zero) {
                // 0의 개수 이전 자리수의 경우의 수 만큼 추가
                dp[i] = (dp[i] + dp[i - zero]) % mod;
            }
            // 현재 탐색중인 문자열 자리수가 1이 들어갈 개수 이상인 경우
            if(i &amp;gt;= one) {
                // 1의 개수 이전 자리수의 경우의 수 만큼 추가
                dp[i] = (dp[i] + dp[i - one]) % mod;
            }
            // 현재 탐색중인 문자열 자리수가 good string이 되는 길이인 경우
            if(i &amp;gt;= low) {
                // 정답 개수 추가
                answer = (answer + dp[i]) % mod;
            }
        }

        return answer;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>자바</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/160</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-2466-Count-Ways-To-Build-Good-Strings#entry160comment</comments>
      <pubDate>Sun, 14 May 2023 02:09:15 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 59. Spiral Matrix II - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-59-Spiral-Matrix-II-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/spiral-matrix-ii/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/spiral-matrix-ii/description/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1683692515027&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;Spiral Matrix II - LeetCode&quot; data-og-description=&quot;Can you solve this real interview question? Spiral Matrix II - Given a positive integer n, generate an n x n matrix filled with elements from 1 to n2 in spiral order. &amp;nbsp; Example 1: [https://assets.leetcode.com/uploads/2020/11/13/spiraln.jpg] Input: n = 3 O&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/spiral-matrix-ii/description/&quot; data-og-url=&quot;https://leetcode.com/problems/spiral-matrix-ii/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cgTa9u/hySyn9X8Gi/zKbq67YmKFEYgN7dvzBFpk/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/beZasg/hySAguAnwI/tgIJ1sHB4mDi5jpa6FUX00/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222,https://scrap.kakaocdn.net/dn/PxIN8/hySz7LbUqk/6qYUawZLOjiQyuhGoAFgnk/img.jpg?width=242&amp;amp;height=242&amp;amp;face=0_0_242_242&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/spiral-matrix-ii/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/spiral-matrix-ii/description/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cgTa9u/hySyn9X8Gi/zKbq67YmKFEYgN7dvzBFpk/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/beZasg/hySAguAnwI/tgIJ1sHB4mDi5jpa6FUX00/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222,https://scrap.kakaocdn.net/dn/PxIN8/hySz7LbUqk/6qYUawZLOjiQyuhGoAFgnk/img.jpg?width=242&amp;amp;height=242&amp;amp;face=0_0_242_242');&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;Spiral Matrix II - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Can you solve this real interview question? Spiral Matrix II - Given a positive integer n, generate an n x n matrix filled with elements from 1 to n2 in spiral order. &amp;nbsp; Example 1: [https://assets.leetcode.com/uploads/2020/11/13/spiraln.jpg] Input: n = 3 O&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;Given a positive integer n, generate an n x n matrix filled with elements from 1 to n^2 in spiral order.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;242&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpahHt/btseF9okBVx/WcT6npIKbuKsEq0BnKKKd1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpahHt/btseF9okBVx/WcT6npIKbuKsEq0BnKKKd1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpahHt/btseF9okBVx/WcT6npIKbuKsEq0BnKKKd1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpahHt%2FbtseF9okBVx%2FWcT6npIKbuKsEq0BnKKKd1%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;242&quot; height=&quot;242&quot; data-origin-width=&quot;242&quot; data-origin-height=&quot;242&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1683692740352&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: n = 3
Output: [[1,2,3],[8,9,4],[7,6,5]]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1683692753256&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: n = 1
Output: [[1]]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1&amp;nbsp;&amp;lt;=&amp;nbsp;n&amp;nbsp;&amp;lt;=&amp;nbsp;20&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정수 n이 주어질 때 n x x크기의 이차원배열을 1부터 n^2까지 나선형으로 채워야하는 문제이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;풀이하는 과정은 &lt;a href=&quot;https://hyojun.tistory.com/entry/LeetCode-54-Spiral-Matrix-Java&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;54. Sprial Matrix&lt;/a&gt;와 같다.&lt;br /&gt;두 문제의 차이점은 Sprial Matrix는 이미 채워진 배열의 요소를 구하는 문제이고 Sprial Matrix II는 빈 배열을 처음부터 채워나가야 하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 최종적으로 return할 2차원 배열을 생성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1683692964488&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 정답 배열
int[][] answer = new int[n][n];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로 각 요소들의 위치를 판단하기 위한 변수들을 선언한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정수 dir은 현재 이동방향을 나타내는 변수이며 0, 1, 2, 3 순서대로 오른쪽, 아래, 왼쪽, 위를 나타낸다.&lt;br /&gt;정수 배열 dirR과 dirC는 각각 현재 이동방향에 대해서 행과 열의 이동 방향을 나타낸다.&lt;br /&gt;마지막으로 정수 row와 col은 현재 탐색중인 행과 열의 좌표를 나타낸다. 시작점은 0, 0으로 설정한다.&lt;/p&gt;
&lt;pre id=&quot;code_1683693014432&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 현재 이동방향 (오른쪽, 아래, 왼쪽, 위)
int dir = 0;
// Row의 이동방향
int[] dirR = {0, 1, 0, -1};
// Column의 이동방향
int[] dirC = {1, 0, -1, 0};
// 시작 Row
int row = 0;
// 시작 Col
int col = 0;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 변수들을 가지고 정답 배열의 길이만큼 반복하며 탐색을 진행한다.&lt;br /&gt;현재 행과 열에 1부터 차례대로 삽입하고 다음 이동할 좌표에 대해서 조건을 판단하여 이동방향을 변경해야한다.&lt;br /&gt;이동방향을 변경해야하는 경우는 다음 두 가지이다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;다음으로 이동할 좌표가 배열을 벗어난 경우&lt;/li&gt;
&lt;li&gt;이미 방문한 좌표인 경우&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 조건에 해당하는 경우 이동방향을 변경하고 최종적으로 행과 열의 좌표값을 갱신한다.&lt;/p&gt;
&lt;pre id=&quot;code_1683693210001&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 정답 배열의 길이만큼 반복
for(int i = 0; i &amp;lt; n * n; i++) {
    answer[row][col] = i + 1;

    // 다음으로 이동할 좌표가 배열을 벗어나거나 이미 방문한 요소인 경우 이동방향을 변경
    if(row + dirR[dir] &amp;lt; 0 || row + dirR[dir] &amp;gt;= n ||
       col + dirC[dir] &amp;lt; 0 || col + dirC[dir] &amp;gt;= n ||
       answer[row + dirR[dir]][col + dirC[dir]] != 0) {
        dir = (dir + 1) % 4;
    }

    // 현재 좌표를 갱신
    row += dirR[dir];
    col += dirC[dir];
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구해진 2차원 배열을 return한다.&lt;/p&gt;
&lt;pre id=&quot;code_1683693355272&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;return answer;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1683692776257&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int[][] generateMatrix(int n) {
        // 정답 배열
        int[][] answer = new int[n][n];
        // 현재 이동방향 (오른쪽, 아래, 왼쪽, 위)
        int dir = 0;
        // Row의 이동방향
        int[] dirR = {0, 1, 0, -1};
        // Column의 이동방향
        int[] dirC = {1, 0, -1, 0};
        // 시작 Row
        int row = 0;
        // 시작 Col
        int col = 0;
        
        // 정답 배열의 길이만큼 반복
        for(int i = 0; i &amp;lt; n * n; i++) {
            answer[row][col] = i + 1;
            
            // 다음으로 이동할 좌표가 배열을 벗어나거나 이미 방문한 요소인 경우 이동방향을 변경
            if(row + dirR[dir] &amp;lt; 0 || row + dirR[dir] &amp;gt;= n ||
               col + dirC[dir] &amp;lt; 0 || col + dirC[dir] &amp;gt;= n ||
               answer[row + dirR[dir]][col + dirC[dir]] != 0) {
                dir = (dir + 1) % 4;
            }
            
            // 현재 좌표를 갱신
            row += dirR[dir];
            col += dirC[dir];
        }

        return answer;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>Matrix</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/159</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-59-Spiral-Matrix-II-Java#entry159comment</comments>
      <pubDate>Wed, 10 May 2023 13:36:13 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 1572. Matrix Diagonal Sum - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-1572-Matrix-Diagonal-Sum-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/matrix-diagonal-sum/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/matrix-diagonal-sum/description/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1683549290308&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;Matrix Diagonal Sum - LeetCode&quot; data-og-description=&quot;Can you solve this real interview question? Matrix Diagonal Sum - Given a&amp;nbsp;square&amp;nbsp;matrix&amp;nbsp;mat, return the sum of the matrix diagonals. Only include the sum of all the elements on the primary diagonal and all the elements on the secondary diagonal that are&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/matrix-diagonal-sum/description/&quot; data-og-url=&quot;https://leetcode.com/problems/matrix-diagonal-sum/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dYzaBL/hySysCfWvj/xIszezj9yhds5nMozdmms1/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/ggJZ3/hySys956cg/EUrfr3mYFtKPpTpwi1HWX1/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222,https://scrap.kakaocdn.net/dn/c3P6TL/hySyfiCVm3/mKYuERXnCxQiAalNHkBWJK/img.png?width=448&amp;amp;height=232&amp;amp;face=0_0_448_232&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/matrix-diagonal-sum/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/matrix-diagonal-sum/description/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dYzaBL/hySysCfWvj/xIszezj9yhds5nMozdmms1/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/ggJZ3/hySys956cg/EUrfr3mYFtKPpTpwi1HWX1/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222,https://scrap.kakaocdn.net/dn/c3P6TL/hySyfiCVm3/mKYuERXnCxQiAalNHkBWJK/img.png?width=448&amp;amp;height=232&amp;amp;face=0_0_448_232');&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;Matrix Diagonal Sum - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Can you solve this real interview question? Matrix Diagonal Sum - Given a&amp;nbsp;square&amp;nbsp;matrix&amp;nbsp;mat, return the sum of the matrix diagonals. Only include the sum of all the elements on the primary diagonal and all the elements on the secondary diagonal that are&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;Given a&amp;nbsp;square&amp;nbsp;matrix&amp;nbsp;mat, return the sum of the matrix diagonals.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Only include the sum of all the elements on the primary diagonal and all the elements on the secondary diagonal that are not part of the primary diagonal.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 1:&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;448&quot; data-origin-height=&quot;232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E0DTB/btseqvsn9eu/1SvI9BagBKkdShgLLh1uq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E0DTB/btseqvsn9eu/1SvI9BagBKkdShgLLh1uq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E0DTB/btseqvsn9eu/1SvI9BagBKkdShgLLh1uq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE0DTB%2Fbtseqvsn9eu%2F1SvI9BagBKkdShgLLh1uq1%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;448&quot; height=&quot;232&quot; data-origin-width=&quot;448&quot; data-origin-height=&quot;232&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1683549338735&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: mat = [[1,2,3],
              [4,5,6],
              [7,8,9]]
Output: 25
Explanation: Diagonals sum: 1 + 5 + 9 + 3 + 7 = 25
Notice that element mat[1][1] = 5 is counted only once.&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1683549355878&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: mat = [[1,1,1,1],
              [1,1,1,1],
              [1,1,1,1],
              [1,1,1,1]]
Output: 8&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 3:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1683549367441&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: mat = [[5]]
Output: 5&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;n == mat.length == mat[i].length&lt;/li&gt;
&lt;li&gt;1 &amp;lt;= n &amp;lt;= 100&lt;/li&gt;
&lt;li&gt;1 &amp;lt;= mat[i][j] &amp;lt;= 100&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;길이가 n인 정사각형 모양의 2차원 배열 mat가 주어질 때 왼쪽 위부터 오른쪽 아래로 향하는 대각선상에 위치한 요소들과 오른쪽 위부터 왼쪽 아래로 향하는 대각선상에 위치한 요소들의 총합을 구하는 문제이다.&lt;br /&gt;단 두 대각선상에서 중복되는 요소는 한 번만 더하도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 총 합계를 저장할 변수와 배열의 길이를 저장할 변수를 선언하고 초기화한다.&lt;/p&gt;
&lt;pre id=&quot;code_1683549530018&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 대각선 요소의 총 합계
int sum = 0;

// 배열의 길이
int length = mat.length;&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;우선 배열의 길이가 1인 경우 요소는 하나만 존재하고 대각선으로 나타낼 경우 중복되어 한 번만 합계에 추가해야하기 때문에 해당 요소를 바로 return한다.&lt;/p&gt;
&lt;pre id=&quot;code_1683549608053&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 배열의 길이가 1인 경우 요소를 바로 return
if(length == 1) return mat[0][0];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열의 길이가 1보다 큰 경우에는 배열의 길이만큼 반복하며 각 행의 요소를 탐색한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 탐색중인 행이 n번째 행이라고 할 때 왼쪽 위에서 오른쪽 아래로 향하는 대각선에 해당하는 요소는 mat[n][n] 으로 나타낼 수 있다. 따라서 합계에 mat[n][n]을 더해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로 오른쪽 위에서 왼쪽 아래로 향하는 대각선에 해당하는 요소는 mat[n][배열의 길이 - n - 1]로 나타낼 수 있다.&lt;br /&gt;해당 요소 역시 합계에 더해주는데 두 대각선에서 중복되는 요소인 경우에는 더하지 않는다.&lt;br /&gt;배열의 길이가 홀수이면서 현재 탐색중인 행의 인덱스가 배열의 절반인 경우 중복되는 요소가 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1683549977104&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 배열의 길이만큼 반복
for(int i = 0; i &amp;lt; length; i++){
    // primary diagonal
    sum += mat[i][i];

    // secondary diagonal
    // 배열의 길이가 홀수 이면서 길이의 절반에 해당하는 인덱스인 경우
    // 중복된 요소가 선택되므로 탐색제외
    if(length % 2 == 1 &amp;amp;&amp;amp; i == length / 2) continue;
    // 이외의 경우 합계에 더함
    sum += mat[i][length - i - 1];
}&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;최종적으로 구해진 합계를 return한다.&lt;/p&gt;
&lt;pre id=&quot;code_1683549996044&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;return sum;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1683549308007&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int diagonalSum(int[][] mat) {
        // 대각선 요소의 총 합계
        int sum = 0;

        // 배열의 길이
        int length = mat.length;

        // 배열의 길이가 1인 경우 요소를 바로 return
        if(length == 1) return mat[0][0];

        // 배열의 길이만큼 반복
        for(int i = 0; i &amp;lt; length; i++){
            // primary diagonal
            sum += mat[i][i];

            // secondary diagonal
            // 배열의 길이가 홀수 이면서 길이의 절반에 해당하는 인덱스인 경우
            // 중복된 요소가 선택되므로 탐색제외
            if(length % 2 == 1 &amp;amp;&amp;amp; i == length / 2) continue;
            // 이외의 경우 합계에 더함
            sum += mat[i][length - i - 1];
        }

        return sum;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>Matrix</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>자바</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/158</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-1572-Matrix-Diagonal-Sum-Java#entry158comment</comments>
      <pubDate>Mon, 8 May 2023 21:46:44 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 1046. Last Stone Weight - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-1046-Last-Stone-Weight-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/last-stone-weight/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/last-stone-weight/description/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1682345058660&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;Last Stone Weight - LeetCode&quot; data-og-description=&quot;Can you solve this real interview question? Last Stone Weight - You are given an array of integers stones where stones[i] is the weight of the ith stone. We are playing a game with the stones. On each turn, we choose the heaviest two stones and smash them &quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/last-stone-weight/description/&quot; data-og-url=&quot;https://leetcode.com/problems/last-stone-weight/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bN2jsy/hySoECWw31/yqsoqxr4ca7DeWVtHshy30/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/cJKQ8R/hySosP1nOo/1HLXf1WKjhWgkQodpNhiy1/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/last-stone-weight/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/last-stone-weight/description/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bN2jsy/hySoECWw31/yqsoqxr4ca7DeWVtHshy30/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/cJKQ8R/hySosP1nOo/1HLXf1WKjhWgkQodpNhiy1/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222');&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;Last Stone Weight - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Can you solve this real interview question? Last Stone Weight - You are given an array of integers stones where stones[i] is the weight of the ith stone. We are playing a game with the stones. On each turn, we choose the heaviest two stones and smash them&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;You are given an array of integers&lt;span&gt;&amp;nbsp;&lt;/span&gt;stones&lt;span&gt;&amp;nbsp;&lt;/span&gt;where&lt;span&gt;&amp;nbsp;&lt;/span&gt;stones[i]&lt;span&gt;&amp;nbsp;&lt;/span&gt;is the weight of the&lt;span&gt;&amp;nbsp;&lt;/span&gt;ith&lt;span&gt;&amp;nbsp;&lt;/span&gt;stone.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;We are playing a game with the stones. On each turn, we choose the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;heaviest two stones&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;and smash them together. Suppose the heaviest two stones have weights&lt;span&gt;&amp;nbsp;&lt;/span&gt;x&lt;span&gt;&amp;nbsp;&lt;/span&gt;and&lt;span&gt;&amp;nbsp;&lt;/span&gt;y&lt;span&gt;&amp;nbsp;&lt;/span&gt;with&lt;span&gt;&amp;nbsp;&lt;/span&gt;x &amp;lt;= y. The result of this smash is:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;If&lt;span&gt;&amp;nbsp;&lt;/span&gt;x == y, both stones are destroyed, and&lt;/li&gt;
&lt;li&gt;If&lt;span&gt;&amp;nbsp;&lt;/span&gt;x != y, the stone of weight&lt;span&gt;&amp;nbsp;&lt;/span&gt;x&lt;span&gt;&amp;nbsp;&lt;/span&gt;is destroyed, and the stone of weight&lt;span&gt;&amp;nbsp;&lt;/span&gt;y&lt;span&gt;&amp;nbsp;&lt;/span&gt;has new weight&lt;span&gt;&amp;nbsp;&lt;/span&gt;y - x.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;At the end of the game, there is&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;at most one&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;stone left.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Return&lt;span&gt;&amp;nbsp;&lt;/span&gt;the weight of the last remaining stone. If there are no stones left, return&lt;span&gt;&amp;nbsp;&lt;/span&gt;0.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1682345091141&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: stones = [2,7,4,1,8,1]
Output: 1
Explanation: 
We combine 7 and 8 to get 1 so the array converts to [2,4,1,1,1] then,
we combine 2 and 4 to get 2 so the array converts to [2,1,1,1] then,
we combine 2 and 1 to get 1 so the array converts to [1,1,1] then,
we combine 1 and 1 to get 0 so the array converts to [1] then that's the value of the last stone.&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1682345102792&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: stones = [1]
Output: 1&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1 &amp;lt;= stones.length &amp;lt;= 30&lt;/li&gt;
&lt;li&gt;1 &amp;lt;= stones[i] &amp;lt;= 1000&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1~30개 사이의 돌들의 무게가 담겨있는 배열 stones가 주어지고 주어진 돌들을 이용하여 게임을 진행한다.&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;두 개의 돌을 각각 x, y라고 할 때 x &amp;lt;= y 이다.&lt;/li&gt;
&lt;li&gt;x와 y의 무게 같은 경우 두 개의 돌을 모두 파괴한다.&lt;/li&gt;
&lt;li&gt;만약 x와 y의 무게가 같지 않은 경우 x를 파괴하고 y - x무게 만큼의 새로운 돌의 무게를 배열에 다시 추가한다.&lt;/li&gt;
&lt;li&gt;마지막 남은 돌의 무게를 return 한다, 남은 돌이 없는 경우에는 0을 return한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 배열의 길이가 1인 경우에는 해당 돌의 무게값을 바로 return한다.&lt;/p&gt;
&lt;pre id=&quot;code_1682345459244&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 돌의 개수가 한 개인 경우 해당 돌의 무게를 바로 return
if(stones.length == 1) return stones[0];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무게별로 순차적으로 탐색하고 새로운 돌의 무게가 추가되는 경우가 있으므로 우선순위 큐를 이용한다.&lt;br /&gt;가장 무거운 돌을 비교하므로 높은 값이 우선순위를 갖도록 큐를 선언해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1682345508404&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 돌의 무게를 무거운 순으로 저장할 우선순위 큐
PriorityQueue&amp;lt;Integer&amp;gt; pq = new PriorityQueue&amp;lt;&amp;gt;(Collections.reverseOrder());&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열에 있는 모든 값을 큐에 삽입한다.&lt;/p&gt;
&lt;pre id=&quot;code_1682345551741&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 모든 돌을 우선순위 큐에 삽입
for(int i : stones) pq.offer(i);&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;큐에 남은 값이 1개 이하가 될 때까지 탐색을 반복한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건에 맞도록 우선순위가 높은 두 개의 값을 각각 x, y로 큐에서 추출하고 두 값이 같지 않은 경우 y - x의 값을 다시 우선순위 큐에 삽입한다.&lt;/p&gt;
&lt;pre id=&quot;code_1682345660492&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 우선순위큐에 남은 돌의 개수가 한 개 이하가 될 때까지 반복
while(pq.size() &amp;gt; 1){
    // 가장 무거운 돌 두 개 꺼냄
    int y = pq.poll();
    int x = pq.poll();

    // x와 y의 무게가 같지 않은 경우 y-x의 무게를 다시 우선순위 큐에 삽입
    if(x != y) pq.offer(y - x);
}&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;큐에 남아있는 값이 있는 경우 해당 값을 return 하고 남아있는 값이 없는 경우에는 0을 return 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1682345700589&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 우선순위큐에 남은 값이 있는 경우 해당 값을 return
// 남은 값이 없는 경우 0을 return
return pq.size() == 0 ? 0 : pq.poll();&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1682345118889&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int lastStoneWeight(int[] stones) {
        // 돌의 개수가 한 개인 경우 해당 돌의 무게를 바로 return
        if(stones.length == 1) return stones[0];

        // 돌의 무게를 무거운 순으로 저장할 우선순위 큐
        PriorityQueue&amp;lt;Integer&amp;gt; pq = new PriorityQueue&amp;lt;&amp;gt;(Collections.reverseOrder());

        // 모든 돌을 우선순위 큐에 삽입
        for(int i : stones) pq.offer(i);

        // 우선순위큐에 남은 돌의 개수가 한 개 이하가 될 때까지 반복
        while(pq.size() &amp;gt; 1){
            // 가장 무거운 돌 두 개 꺼냄
            int y = pq.poll();
            int x = pq.poll();

            // x와 y의 무게가 같지 않은 경우 y-x의 무게를 다시 우선순위 큐에 삽입
            if(x != y) pq.offer(y - x);
        }

        // 우선순위큐에 남은 값이 있는 경우 해당 값을 return
        // 남은 값이 없는 경우 0을 return
        return pq.size() == 0 ? 0 : pq.poll();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>Java</category>
      <category>Last Stone Weight</category>
      <category>leetcoe</category>
      <category>priority queue</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>우선순위큐</category>
      <category>자바</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/157</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-1046-Last-Stone-Weight-Java#entry157comment</comments>
      <pubDate>Mon, 24 Apr 2023 23:15:20 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 2390. Removing Stars From a String - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-2390-Removing-Stars-From-a-String-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/removing-stars-from-a-string/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/removing-stars-from-a-string/description/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1681187953054&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;Removing Stars From a String - LeetCode&quot; data-og-description=&quot;Can you solve this real interview question? Removing Stars From a String - You are given a string s, which contains stars *. In one operation, you can: * Choose a star in s. * Remove the closest non-star character to its left, as well as remove the star it&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/removing-stars-from-a-string/description/&quot; data-og-url=&quot;https://leetcode.com/problems/removing-stars-from-a-string/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bOEv2t/hySeXWKisA/HAzLslY3HxLRc5mM2WxcO0/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/cUbzBy/hySe4auKvG/ITsxlbVJLheoYFusakHMJk/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/removing-stars-from-a-string/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/removing-stars-from-a-string/description/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bOEv2t/hySeXWKisA/HAzLslY3HxLRc5mM2WxcO0/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/cUbzBy/hySe4auKvG/ITsxlbVJLheoYFusakHMJk/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222');&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;Removing Stars From a String - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Can you solve this real interview question? Removing Stars From a String - You are given a string s, which contains stars *. In one operation, you can: * Choose a star in s. * Remove the closest non-star character to its left, as well as remove the star it&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;You are given a string&lt;span&gt;&amp;nbsp;&lt;/span&gt;s, which contains stars&lt;span&gt;&amp;nbsp;&lt;/span&gt;*.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;In one operation, you can:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Choose a star in&lt;span&gt;&amp;nbsp;&lt;/span&gt;s.&lt;/li&gt;
&lt;li&gt;Remove the closest&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;non-star&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;character to its&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;left&lt;/b&gt;, as well as remove the star itself.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Return&lt;span&gt;&amp;nbsp;&lt;/span&gt;the string after&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;all&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;stars have been removed.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Note:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;The input will be generated such that the operation is always possible.&lt;/li&gt;
&lt;li&gt;It can be shown that the resulting string will always be unique.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1681187975713&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: s = &quot;leet**cod*e&quot;
Output: &quot;lecoe&quot;
Explanation: Performing the removals from left to right:
- The closest character to the 1st star is 't' in &quot;leet**cod*e&quot;. s becomes &quot;lee*cod*e&quot;.
- The closest character to the 2nd star is 'e' in &quot;lee*cod*e&quot;. s becomes &quot;lecod*e&quot;.
- The closest character to the 3rd star is 'd' in &quot;lecod*e&quot;. s becomes &quot;lecoe&quot;.
There are no more stars, so we return &quot;lecoe&quot;.&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1681187993443&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: s = &quot;erase*****&quot;
Output: &quot;&quot;
Explanation: The entire string is removed, so we return an empty string.&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #262626; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1 &amp;lt;= s.length &amp;lt;= 105&lt;/li&gt;
&lt;li&gt;s&lt;span&gt;&amp;nbsp;&lt;/span&gt;consists of lowercase English letters and stars&lt;span&gt;&amp;nbsp;&lt;/span&gt;*.&lt;/li&gt;
&lt;li&gt;The operation above can be performed on&lt;span&gt;&amp;nbsp;&lt;/span&gt;s.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알파벳 소문자와 '*'로 이루어진 문자열 s가 주어질 때 다음 과정을 거쳐서 만들어지는 문자열을 구하는 문제이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자열 내의 '*' 하나를 선택한다.&lt;/li&gt;
&lt;li&gt;선택한 '*'의 왼쪽에 있는 알파벳 중 가장 가까운 알파벳 하나와 선택한 '*'을 제거한다.&lt;/li&gt;
&lt;/ul&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_1681188286360&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Stack&amp;lt;Character&amp;gt; stack = new Stack&amp;lt;&amp;gt;();

// 문자열의 모든 글자 탐색
for(int i = 0; i &amp;lt; s.length(); i++){
    // 현재 탐색중인 글자
    char c = s.charAt(i);

    // 현재 탐색중인 글자가 '*'인 경우 스택의 가장 마지막 글자를 제거
    if(c == '*') stack.pop();
    // 현재 탐색중인 글자가 알파벳인 경우 스택에 추가
    else stack.push(c);
}&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;모든 제거 과정이 끝나고 남은 문자열을 return하면 되는데 stack에서 꺼내는 순서는 문자열의 역순이 되므로 앞쪽에서부터 문자를 삽입하여 정답 문자열을 만들어 return해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1681188345242&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 정답 문자열을 만들기 위한 stringBuilder
StringBuilder sb = new StringBuilder();

// 스택에 남아있는 모든 글자 탐색
while(stack.size() &amp;gt; 0){
    // 스택에서 꺼낸 문자열을 앞쪽에 삽입
    sb.insert(0, stack.pop());
}

return sb.toString();&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1681188003541&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public String removeStars(String s) {
        Stack&amp;lt;Character&amp;gt; stack = new Stack&amp;lt;&amp;gt;();

        // 문자열의 모든 글자 탐색
        for(int i = 0; i &amp;lt; s.length(); i++){
            // 현재 탐색중인 글자
            char c = s.charAt(i);

            // 현재 탐색중인 글자가 '*'인 경우 스택의 가장 마지막 글자를 제거
            if(c == '*') stack.pop();
            // 현재 탐색중인 글자가 알파벳인 경우 스택에 추가
            else stack.push(c);
        }

        // 정답 문자열을 만들기 위한 stringBuilder
        StringBuilder sb = new StringBuilder();

        // 스택에 남아있는 모든 글자 탐색
        while(stack.size() &amp;gt; 0){
            // 스택에서 꺼낸 문자열을 앞쪽에 삽입
            sb.insert(0, stack.pop());
        }

        return sb.toString();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>stack</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>자바</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/156</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-2390-Removing-Stars-From-a-String-Java#entry156comment</comments>
      <pubDate>Tue, 11 Apr 2023 13:45:53 +0900</pubDate>
    </item>
    <item>
      <title>[Flutter] flutter windows version 이슈 해결하기</title>
      <link>https://hyojun.tistory.com/entry/Flutter-flutter-windows-version-%EC%9D%B4%EC%8A%88-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오랜만에 플러터 공부를 위해 플러터 환경설정을 확인하던 중 flutter doctor 에서 아래와 같이 windows version에서 문제가 발생하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;flutter doctor - 1.png&quot; data-origin-width=&quot;819&quot; data-origin-height=&quot;233&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkDQRK/btr9kO3PzCC/LVAiv6wYz0u0bNXHtaqZBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkDQRK/btr9kO3PzCC/LVAiv6wYz0u0bNXHtaqZBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkDQRK/btr9kO3PzCC/LVAiv6wYz0u0bNXHtaqZBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkDQRK%2Fbtr9kO3PzCC%2FLVAiv6wYz0u0bNXHtaqZBK%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;819&quot; height=&quot;233&quot; data-filename=&quot;flutter doctor - 1.png&quot; data-origin-width=&quot;819&quot; data-origin-height=&quot;233&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;p data-ke-size=&quot;size16&quot;&gt;1. 플러터가 최신 버전이 아닌 경우 플러터 업그레이드&lt;/p&gt;
&lt;pre id=&quot;code_1681099274431&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;flutter upgrade&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;flutter doctor - 2.png&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V1fUA/btr8MoTZXKj/BMCygtRWsjSSChmsXfwCZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V1fUA/btr8MoTZXKj/BMCygtRWsjSSChmsXfwCZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V1fUA/btr8MoTZXKj/BMCygtRWsjSSChmsXfwCZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV1fUA%2Fbtr8MoTZXKj%2FBMCygtRWsjSSChmsXfwCZ1%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;622&quot; height=&quot;116&quot; data-filename=&quot;flutter doctor - 2.png&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;116&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;2. 플러터 채널을 master로 변경&lt;/p&gt;
&lt;pre id=&quot;code_1681099323526&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;flutter channel master&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;flutter doctor - 3.png&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;110&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNKGzl/btr8OVcIMmh/hczHF3eq8Y8L9HOwzB1dvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNKGzl/btr8OVcIMmh/hczHF3eq8Y8L9HOwzB1dvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNKGzl/btr8OVcIMmh/hczHF3eq8Y8L9HOwzB1dvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNKGzl%2Fbtr8OVcIMmh%2FhczHF3eq8Y8L9HOwzB1dvk%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;673&quot; height=&quot;110&quot; data-filename=&quot;flutter doctor - 3.png&quot; data-origin-width=&quot;673&quot; data-origin-height=&quot;110&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;3. 다시 한번 flutter doctor를 실행하여 환경설정을 확인하면 모든 항목이 초록색 체크로 표시되어있는 편안한 화면을 볼 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1681099364782&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;flutter doctor -v&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;flutter doctor - 4.png&quot; data-origin-width=&quot;965&quot; data-origin-height=&quot;975&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YyTjv/btr8MpeiQP5/c8BAHenmZv4pncxMOyqDbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YyTjv/btr8MpeiQP5/c8BAHenmZv4pncxMOyqDbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YyTjv/btr8MpeiQP5/c8BAHenmZv4pncxMOyqDbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYyTjv%2Fbtr8MpeiQP5%2Fc8BAHenmZv4pncxMOyqDbk%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;965&quot; height=&quot;975&quot; data-filename=&quot;flutter doctor - 4.png&quot; data-origin-width=&quot;965&quot; data-origin-height=&quot;975&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>개발/Flutter</category>
      <category>FLUTTER</category>
      <category>flutter doctor</category>
      <category>flutter windows version</category>
      <category>플러터</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/155</guid>
      <comments>https://hyojun.tistory.com/entry/Flutter-flutter-windows-version-%EC%9D%B4%EC%8A%88-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0#entry155comment</comments>
      <pubDate>Mon, 10 Apr 2023 13:03:47 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 1020. Number of Enclaves - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-1020-Number-of-Enclaves-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/number-of-enclaves/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/number-of-enclaves/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1680842610546&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;Number of Enclaves - LeetCode&quot; data-og-description=&quot;Can you solve this real interview question? Number of Enclaves - You are given an m x n binary matrix grid, where 0 represents a sea cell and 1 represents a land cell. A move consists of walking from one land cell to another adjacent (4-directionally) land&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/number-of-enclaves/&quot; data-og-url=&quot;https://leetcode.com/problems/number-of-enclaves/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bMtBbY/hySctOP9kk/9CI1BB6KhVLvwNk09CkP3K/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/Xn1WO/hySaV0vp9a/7q80mCKEOuKiEBWOZydRy0/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222,https://scrap.kakaocdn.net/dn/eViq1/hyScGUWU5j/sti9l8J1sBKVORU6GJozuK/img.jpg?width=333&amp;amp;height=333&amp;amp;face=0_0_333_333&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/number-of-enclaves/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/number-of-enclaves/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bMtBbY/hySctOP9kk/9CI1BB6KhVLvwNk09CkP3K/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/Xn1WO/hySaV0vp9a/7q80mCKEOuKiEBWOZydRy0/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222,https://scrap.kakaocdn.net/dn/eViq1/hyScGUWU5j/sti9l8J1sBKVORU6GJozuK/img.jpg?width=333&amp;amp;height=333&amp;amp;face=0_0_333_333');&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;Number of Enclaves - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Can you solve this real interview question? Number of Enclaves - You are given an m x n binary matrix grid, where 0 represents a sea cell and 1 represents a land cell. A move consists of walking from one land cell to another adjacent (4-directionally) land&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h2&gt;
&lt;div style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot;&gt;
&lt;div data-track-load=&quot;qd_description_content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;You are given an&lt;span&gt;&amp;nbsp;&lt;/span&gt;m x n&lt;span&gt;&amp;nbsp;&lt;/span&gt;binary matrix&lt;span&gt;&amp;nbsp;&lt;/span&gt;grid, where&lt;span&gt;&amp;nbsp;&lt;/span&gt;0&lt;span&gt;&amp;nbsp;&lt;/span&gt;represents a sea cell and&lt;span&gt;&amp;nbsp;&lt;/span&gt;1&lt;span&gt;&amp;nbsp;&lt;/span&gt;represents a land cell.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;move&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;consists of walking from one land cell to another adjacent (&lt;b&gt;4-directionally&lt;/b&gt;) land cell or walking off the boundary of the&lt;span&gt;&amp;nbsp;&lt;/span&gt;grid.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Return&lt;span&gt;&amp;nbsp;&lt;/span&gt;the number of land cells in&lt;span&gt;&amp;nbsp;&lt;/span&gt;grid&lt;span&gt;&amp;nbsp;&lt;/span&gt;for which we cannot walk off the boundary of the grid in any number of&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;moves&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;333&quot; data-origin-height=&quot;333&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dbTvDh/btr8A4f1eWd/14U0tXKt41moIoSmNd9Bw1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dbTvDh/btr8A4f1eWd/14U0tXKt41moIoSmNd9Bw1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dbTvDh/btr8A4f1eWd/14U0tXKt41moIoSmNd9Bw1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdbTvDh%2Fbtr8A4f1eWd%2F14U0tXKt41moIoSmNd9Bw1%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;333&quot; height=&quot;333&quot; data-origin-width=&quot;333&quot; data-origin-height=&quot;333&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1680842655236&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: grid = [[0,0,0,0],[1,0,1,0],[0,1,1,0],[0,0,0,0]]
Output: 3
Explanation: There are three 1s that are enclosed by 0s, and one 1 that is not enclosed because its on the boundary.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;333&quot; data-origin-height=&quot;333&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KrhcD/btr8A3g3q7N/ga4JpOyO1IA83iZUUcKauK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KrhcD/btr8A3g3q7N/ga4JpOyO1IA83iZUUcKauK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KrhcD/btr8A3g3q7N/ga4JpOyO1IA83iZUUcKauK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKrhcD%2Fbtr8A3g3q7N%2Fga4JpOyO1IA83iZUUcKauK%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;333&quot; height=&quot;333&quot; data-origin-width=&quot;333&quot; data-origin-height=&quot;333&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1680842678548&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: grid = [[0,1,1,0],[0,0,1,0],[0,0,1,0],[0,0,0,0]]
Output: 0
Explanation: All 1s are either on the boundary or can reach the boundary.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;m == grid.length&lt;/li&gt;
&lt;li&gt;n == grid[i].length&lt;/li&gt;
&lt;li&gt;1 &amp;lt;= m, n &amp;lt;= 500&lt;/li&gt;
&lt;li&gt;grid[i][j]&lt;span&gt;&amp;nbsp;&lt;/span&gt;is either&lt;span&gt;&amp;nbsp;&lt;/span&gt;0&lt;span&gt;&amp;nbsp;&lt;/span&gt;or&lt;span&gt;&amp;nbsp;&lt;/span&gt;1.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #262626; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&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;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 셀이 바다(0)와 땅(1)으로 이루어진 m x n 크기의 2차원 배열 grid가 주어질 때 사방이 바다로 둘러 쌓인 땅 타일의 개수를 구하는 문제이다.&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;br /&gt;우선 탐색 대상 좌표가 그리드를 벗어나는 경우에는 바로 탐색을 종료한다.&lt;br /&gt;탐색 대상 좌표가 그리드 내에 있는 경우에는 현재 타일이 땅 타일인지 여부를 판단한다.&lt;br /&gt;땅 타일인 경우에는 현재 타일을 바다로 변경하고 바다로 쌓여 있는지 여부에 따라 정답카운트를 증가시킨다.&lt;br /&gt;그 후 상하좌우에 연결되어있는 타일을 탐색하며 모든 인접한 땅타일을 바다로 변경하며 같은 과정을 반복한다.&lt;/p&gt;
&lt;pre id=&quot;code_1680843611035&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/**
 * @param grid  탐색 대상 그리드
 * @param row   현재 탐색중인 행의 인덱스
 * @param col   현재 탐색중인 열의 인덱스
 * @param inEnclosed 현재 탐색중인 타일이 물로 쌓여있는지 여부
 * @return
 */
public void dfs(int[][] grid, int row, int col, boolean isEnclosed){
    // 좌표가 그리드를 벗어나는 경우 탐색 종료
    if(row &amp;lt; 0 || col &amp;lt; 0 || row &amp;gt;= grid.length || col &amp;gt;= grid[0].length) return;
    // 방문한 타일이 땅(1)인 경우 물(0)로 변경
    // 물로 둘러 쌓여있는 땅 타일인 경우 정답 카운트 증가
    // 상하좌우 타일 탐색하며 모든 인접한 땅타일을 물로 변경
    if(grid[row][col] == 1){
        grid[row][col] = 0;
        if(isEnclosed) answer++;
        dfs(grid, row, col+1, isEnclosed);
        dfs(grid, row, col-1, isEnclosed);
        dfs(grid, row+1, col, isEnclosed);
        dfs(grid, row-1, col, isEnclosed);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 함수를 사용하여 그리드의 모든 셀을 탐색하는데 땅타일이 그리드의 가장자리까지 연결되어있는 경우 연결된 땅 타일들은 바다로 둘러쌓여있지 않는것으로 간주되므로 우선 그리드의 가장자리부터 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;isEnclosed를 false로&lt;/span&gt;&amp;nbsp;탐색하여 바다로 둘러쌓여있지 않은 경우들을 제거한다.&lt;/p&gt;
&lt;pre id=&quot;code_1680843344512&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 그리드의 가장자리에 땅이 있는 경우 해당 타일과 연결된 땅은 물에 둘러쌓여있지 않게되므로
// 가장자리를 우선 탐색하여 연결된 모든 땅 타일을 물 타일로 변경
for(int i = 0; i &amp;lt; n; i++){
    // 가장 윗줄 탐색
    dfs(grid, 0, i, false);
    // 가장 아랫줄 탐색
    dfs(grid, m - 1, i, false);
}
for(int i = 1; i &amp;lt; m - 1; i++){
    // 가장 왼쪽줄 탐색
    dfs(grid, i, 0, false);
    // 가장 오른쪽줄 탐색
    dfs(grid, i, n - 1, 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;그 후 남아있는 안쪽 셀을 대상으로 탐색을 하게 되면 이때 남아있는 땅 타일들은 모두 바다로 둘러 쌓여있는 타일들이므로 isEnclosed를 true로 탐색하며 땅타일들에 대한 개수를 탐색한다.&lt;/p&gt;
&lt;pre id=&quot;code_1680843563526&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 나머지 안쪽 셀들을 탐색
for(int i = 1; i &amp;lt; m - 1; i++){
    for(int j = 1; j &amp;lt; n - 1; j++){
        dfs(grid, i, j, true);
    }
}&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;탐색이 종료된 후 구해진 정답을 return한다.&lt;/p&gt;
&lt;pre id=&quot;code_1680843543692&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;return answer;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1680842695906&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    int answer = 0;

    public int numEnclaves(int[][] grid) {
        // 그리드 행 개수
        int m = grid.length;
        // 그리드 열 개수
        int n = grid[0].length;

        // 그리드의 가장자리에 땅이 있는 경우 해당 타일과 연결된 땅은 물에 둘러쌓여있지 않게되므로
        // 가장자리를 우선 탐색하여 연결된 모든 땅 타일을 물 타일로 변경
        for(int i = 0; i &amp;lt; n; i++){
            // 가장 윗줄 탐색
            dfs(grid, 0, i, false);
            // 가장 아랫줄 탐색
            dfs(grid, m - 1, i, false);
        }
        for(int i = 1; i &amp;lt; m - 1; i++){
            // 가장 왼쪽줄 탐색
            dfs(grid, i, 0, false);
            // 가장 오른쪽줄 탐색
            dfs(grid, i, n - 1, false);
        }
        // 나머지 안쪽 셀들을 탐색
        for(int i = 1; i &amp;lt; m - 1; i++){
            for(int j = 1; j &amp;lt; n - 1; j++){
                dfs(grid, i, j, true);
            }
        }

        return answer;
    }

    /**
     * @param grid  탐색 대상 그리드
     * @param row   현재 탐색중인 행의 인덱스
     * @param col   현재 탐색중인 열의 인덱스
     * @param inEnclosed 현재 탐색중인 타일이 물로 쌓여있는지 여부
     * @return
     */
    public void dfs(int[][] grid, int row, int col, boolean isEnclosed){
        // 좌표가 그리드를 벗어나는 경우 탐색 종료
        if(row &amp;lt; 0 || col &amp;lt; 0 || row &amp;gt;= grid.length || col &amp;gt;= grid[0].length) return;
        // 방문한 타일이 땅(1)인 경우 물(0)로 변경
        // 물로 둘러 쌓여있는 땅 타일인 경우 정답 카운트 증가
        // 상하좌우 타일 탐색하며 모든 인접한 땅타일을 물로 변경
        if(grid[row][col] == 1){
            grid[row][col] = 0;
            if(isEnclosed) answer++;
            dfs(grid, row, col+1, isEnclosed);
            dfs(grid, row, col-1, isEnclosed);
            dfs(grid, row+1, col, isEnclosed);
            dfs(grid, row-1, col, isEnclosed);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>Number of Enclaves</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>자바</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/154</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-1020-Number-of-Enclaves-Java#entry154comment</comments>
      <pubDate>Fri, 7 Apr 2023 14:00:45 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 2405. Optimal Partition of String - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-2405-Optimal-Partition-of-String-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/optimal-partition-of-string/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/optimal-partition-of-string/description/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1680581345168&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;Optimal Partition of String - LeetCode&quot; data-og-description=&quot;Can you solve this real interview question? Optimal Partition of String - Given a string s, partition the string into one or more substrings such that the characters in each substring are unique. That is, no letter appears in a single substring more than o&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/optimal-partition-of-string/description/&quot; data-og-url=&quot;https://leetcode.com/problems/optimal-partition-of-string/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/45S6h/hyR9GH5015/FTQORJWkex0K2EEGZwOOUK/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/beKGeT/hyR9B05n3k/zYQqW88KZuJ6SySACOMYTK/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/optimal-partition-of-string/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/optimal-partition-of-string/description/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/45S6h/hyR9GH5015/FTQORJWkex0K2EEGZwOOUK/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/beKGeT/hyR9B05n3k/zYQqW88KZuJ6SySACOMYTK/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222');&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;Optimal Partition of String - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Can you solve this real interview question? Optimal Partition of String - Given a string s, partition the string into one or more substrings such that the characters in each substring are unique. That is, no letter appears in a single substring more than o&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;Given&amp;nbsp;a&amp;nbsp;string&amp;nbsp;&lt;b&gt;s&lt;/b&gt;,&amp;nbsp;partition&amp;nbsp;the&amp;nbsp;string&amp;nbsp;into&amp;nbsp;one&amp;nbsp;or&amp;nbsp;more&amp;nbsp;&lt;b&gt;substrings&amp;nbsp;&lt;/b&gt;such&amp;nbsp;that&amp;nbsp;the&amp;nbsp;characters&amp;nbsp;in&amp;nbsp;each&amp;nbsp;substring&amp;nbsp;are&amp;nbsp;&lt;b&gt;unique&lt;/b&gt;.&amp;nbsp;That&amp;nbsp;is,&amp;nbsp;no&amp;nbsp;letter&amp;nbsp;appears&amp;nbsp;in&amp;nbsp;a&amp;nbsp;single&amp;nbsp;substring&amp;nbsp;more&amp;nbsp;than&amp;nbsp;once. &lt;br /&gt;&lt;br /&gt;Return&amp;nbsp;the&amp;nbsp;&lt;b&gt;&lt;i&gt;minimum&amp;nbsp;&lt;/i&gt;&lt;/b&gt;number&amp;nbsp;of&amp;nbsp;substrings&amp;nbsp;in&amp;nbsp;such&amp;nbsp;a&amp;nbsp;partition. &lt;br /&gt;&lt;br /&gt;Note&amp;nbsp;that&amp;nbsp;each&amp;nbsp;character&amp;nbsp;should&amp;nbsp;belong&amp;nbsp;to&amp;nbsp;exactly&amp;nbsp;one&amp;nbsp;substring&amp;nbsp;in&amp;nbsp;a&amp;nbsp;partition.&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;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1680581450821&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: s = &quot;abacaba&quot;
Output: 4
Explanation:
Two possible partitions are (&quot;a&quot;,&quot;ba&quot;,&quot;cab&quot;,&quot;a&quot;) and (&quot;ab&quot;,&quot;a&quot;,&quot;ca&quot;,&quot;ba&quot;).
It can be shown that 4 is the minimum number of substrings needed.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1680581468694&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: s = &quot;ssssss&quot;
Output: 6
Explanation:
The only valid partition is (&quot;s&quot;,&quot;s&quot;,&quot;s&quot;,&quot;s&quot;,&quot;s&quot;,&quot;s&quot;).&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1 &amp;lt;= s.length &amp;lt;= 105&lt;/li&gt;
&lt;li&gt;s&amp;nbsp;consists&amp;nbsp;of&amp;nbsp;only&amp;nbsp;English&amp;nbsp;lowercase&amp;nbsp;letters.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알파벳 소문자로 이루어진 문자열 s가 주어질 때 문자열을 부분문자열들로 나누어 각 부분문자열에 중복된 글자가 존재하지 않는 부분문자열의 최소 개수를 구하는 문제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답을 저장할 변수를 선언하고 문자열의 길이가 최소 1이상이므로 1로 초기화한다.&lt;/p&gt;
&lt;pre id=&quot;code_1680581684929&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 최소 부분 문자열의 개수
// 문자열의 길이가 1이상이므로 1로 초기화
int answer = 1;&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;문자열을 부분문자열로 나눌 때 중복 사용된 글자를 판단하기 위해 Map을 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1680581720754&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 문자열 탐색중 사용된 글자를 저장할 Map
Map&amp;lt;Character, Boolean&amp;gt; used = new HashMap&amp;lt;&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;문자열을 처음부터 탐색하며 각 글자를 Map에다 저장하고 Map에 저장된 글자가 사용된 경우, 즉 중복된 글자가 사용되는 경우에 그 부분에서 문자열을 나누고 정답 카운트를 증가시킨다.&lt;br /&gt;모든 탐색이 종료된 후 구해진 정답을 return 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1680581639465&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 문자열의 모든 글자를 탐색
for(int i = 0; i &amp;lt; s.length(); i++) {
    char c = s.charAt(i);
    // 현재 탐색중인 글자가 Map에 포함되어 있는 경우 
    if(used.containsKey(c)){
        // 정답 카운트 증가
        answer++;
        // Map을 초기화 하고 현재 글자 추가
        used.clear();
        used.put(c, true);
    }
    // 현재 탐색중인 글자가 Map에 포함되어 있는 경우 
    else {
        // Map에 현재 글자 추가
        used.put(c, true);
    }
}

return answer;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1680581351196&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int partitionString(String s) {
        // 최소 부분 문자열의 개수
        // 문자열의 길이가 1이상이므로 1로 초기화
        int answer = 1;
        // 문자열 탐색중 사용된 글자를 저장할 Map
        Map&amp;lt;Character, Boolean&amp;gt; used = new HashMap&amp;lt;&amp;gt;();
        
        // 문자열의 모든 글자를 탐색
        for(int i = 0; i &amp;lt; s.length(); i++) {
            char c = s.charAt(i);
            // 현재 탐색중인 글자가 Map에 포함되어 있는 경우 
            if(used.containsKey(c)){
                // 정답 카운트 증가
                answer++;
                // Map을 초기화 하고 현재 글자 추가
                used.clear();
                used.put(c, true);
            }
            // 현재 탐색중인 글자가 Map에 포함되어 있는 경우 
            else {
                // Map에 현재 글자 추가
                used.put(c, true);
            }
        }

        return answer;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>Optimal Partition of String</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>자바</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/153</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-2405-Optimal-Partition-of-String-Java#entry153comment</comments>
      <pubDate>Tue, 4 Apr 2023 13:15:49 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 881. Boats to Save People - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-881-Boats-to-Save-People-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/boats-to-save-people/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/boats-to-save-people/description/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1680530546052&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;Boats to Save People - LeetCode&quot; data-og-description=&quot;Can you solve this real interview question? Boats to Save People - You are given an array people where people[i] is the weight of the ith person, and an infinite number of boats where each boat can carry a maximum weight of limit. Each boat carries at most&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/boats-to-save-people/description/&quot; data-og-url=&quot;https://leetcode.com/problems/boats-to-save-people/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bBD38E/hyR9EQggUy/HRhlDGkSE1UMWHnC6M0N71/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/eGMa2/hyR9Af1txA/VkHTwDLUDZX7qvUQRBubs1/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/boats-to-save-people/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/boats-to-save-people/description/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bBD38E/hyR9EQggUy/HRhlDGkSE1UMWHnC6M0N71/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/eGMa2/hyR9Af1txA/VkHTwDLUDZX7qvUQRBubs1/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222');&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;Boats to Save People - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Can you solve this real interview question? Boats to Save People - You are given an array people where people[i] is the weight of the ith person, and an infinite number of boats where each boat can carry a maximum weight of limit. Each boat carries at most&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;You&amp;nbsp;are&amp;nbsp;given&amp;nbsp;an&amp;nbsp;array&amp;nbsp;people&amp;nbsp;where&amp;nbsp;people[i]&amp;nbsp;is&amp;nbsp;the&amp;nbsp;weight&amp;nbsp;of&amp;nbsp;the&amp;nbsp;ith&amp;nbsp;person,&amp;nbsp;and&amp;nbsp;an&amp;nbsp;infinite&amp;nbsp;number&amp;nbsp;of&amp;nbsp;boats&amp;nbsp;where&amp;nbsp;each&amp;nbsp;boat&amp;nbsp;can&amp;nbsp;carry&amp;nbsp;a&amp;nbsp;maximum&amp;nbsp;weight&amp;nbsp;of&amp;nbsp;limit.&amp;nbsp;Each&amp;nbsp;boat&amp;nbsp;carries&amp;nbsp;at&amp;nbsp;most&amp;nbsp;two&amp;nbsp;people&amp;nbsp;at&amp;nbsp;the&amp;nbsp;same&amp;nbsp;time,&amp;nbsp;provided&amp;nbsp;the&amp;nbsp;sum&amp;nbsp;of&amp;nbsp;the&amp;nbsp;weight&amp;nbsp;of&amp;nbsp;those&amp;nbsp;people&amp;nbsp;is&amp;nbsp;at&amp;nbsp;most&amp;nbsp;limit. &lt;br /&gt;&lt;br /&gt;Return&amp;nbsp;the&amp;nbsp;minimum&amp;nbsp;number&amp;nbsp;of&amp;nbsp;boats&amp;nbsp;to&amp;nbsp;carry&amp;nbsp;every&amp;nbsp;given&amp;nbsp;person.&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;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1680581856571&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: people = [1,2], limit = 3
Output: 1
Explanation: 1 boat (1, 2)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1680581864043&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: people = [3,2,2,1], limit = 3
Output: 3
Explanation: 3 boats (1, 2), (2) and (3)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 3:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1680581872676&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: people = [3,5,3,4], limit = 5
Output: 4
Explanation: 4 boats (3), (3), (4), (5)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1 &amp;lt;= people.length &amp;lt;= 5 * 104&lt;/li&gt;
&lt;li&gt;1&amp;nbsp;&amp;lt;=&amp;nbsp;people[i]&amp;nbsp;&amp;lt;=&amp;nbsp;limit&amp;nbsp;&amp;lt;=&amp;nbsp;3&amp;nbsp;*&amp;nbsp;104&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사람들의 몸무게가 담긴 배열 people과 보트에 한번에 탈 수 있는 최대 무게 limit가 주어질 때 모든 사람이 타기위해 필요한 보트의 최소 개수를 구하는 문제이다.&lt;br /&gt;보트에는 동시에 두 사람까지 탑승할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 적은 보트를 사용하기 위해서는 사람들을 몸무게 순으로 정렬하여 몸무게가 많이 나가는 사람이 탑승할 때 가능한 경우 가벼운 사람이 함께 탑승하는 것이 가장 효율적이다.&lt;br /&gt;따라서 사람들을 먼저 무게순으로 정렬하고 양쪽끝에서 부터 비교를 하도록한다.&lt;/p&gt;
&lt;pre id=&quot;code_1680530717465&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int answer = 0;
        
// 사람들을 무게순으로 정렬
Arrays.sort(people);

// 왼쪽 인덱스
int left = 0;
// 오른쪽 인덱스
int right = people.length - 1;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왼쪽 인덱스와 오른쪽 인덱스가 교차할 때 까지 반복하며 탐색할 때마다 보트의 수를 하나씩 증가시키고 &lt;br /&gt;오른쪽 사람의 무게와 왼쪽 사람의 무게 합이 limit 이하인 경우 양쪽 인덱스를 모두 안쪽으로 한 칸씩 이동,&lt;br /&gt;오른쪽 사람의 무게와 왼쪽 사람의 무게 합이 limit 초과하는 경우 오른쪽 인덱스만 이동한다.&lt;br /&gt;왼쪽과 오른쪽 인덱스가 같은 경우에는 남은 사람이 한 사람이므로 보트 개수를 증가시키고 탐색을 바로 종료한다.&lt;/p&gt;
&lt;pre id=&quot;code_1680530794521&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 왼쪽과 오른쪽 인덱스가 교차할 때까지 반복
while(left &amp;lt;= right) {
    answer++;

    // 왼쪽과 오른쪽 인덱스가 같은 경우 탐색 종료
    if(left == right) break;

    // 오른쪽 사람의 무게와 왼쪽 사람의 무게 합이 limit 이하인 경우 양쪽인덱스를 모두 이동
    if(people[right] + people[left] &amp;lt;= limit) {
        right--;
        left++;
    }
    // 오른쪽 사람의 무게와 왼쪽 사람의 무게 합이 limit 초과하는 경우 오른쪽 인덱스만 이동
    else right--;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종적으로 구해진 보트의 개수를 return 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1680530808480&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;return answer;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1680530552002&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int numRescueBoats(int[] people, int limit) {
        int answer = 0;
        
        // 사람들을 무게순으로 정렬
        Arrays.sort(people);
        
        // 왼쪽 인덱스
        int left = 0;
        // 오른쪽 인덱스
        int right = people.length - 1;
        
        // 왼쪽과 오른쪽 인덱스가 교차할 때까지 반복
        while(left &amp;lt;= right) {
            answer++;
            
            // 왼쪽과 오른쪽 인덱스가 같은 경우 탐색 종료
            if(left == right) break;
            
            // 오른쪽 사람의 무게와 왼쪽 사람의 무게 합이 limit 이하인 경우 양쪽인덱스를 모두 이동
            if(people[right] + people[left] &amp;lt;= limit) {
                right--;
                left++;
            }
            // 오른쪽 사람의 무게와 왼쪽 사람의 무게 합이 limit 초과하는 경우 오른쪽 인덱스만 이동
            else right--;;
        }

        return answer;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>Boats to Save People</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>자바</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/152</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-881-Boats-to-Save-People-Java#entry152comment</comments>
      <pubDate>Mon, 3 Apr 2023 23:06:53 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 2300. Successful Pairs of Spells and Potions - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-2300-Successful-Pairs-of-Spells-and-Potions-Java-%EC%9E%91%EC%84%B1%EC%A4%91</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/successful-pairs-of-spells-and-potions/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/successful-pairs-of-spells-and-potions/description/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1680446224806&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;Successful Pairs of Spells and Potions - LeetCode&quot; data-og-description=&quot;Can you solve this real interview question? Successful Pairs of Spells and Potions - You are given two positive integer arrays spells and potions, of length n and m respectively, where spells[i] represents the strength of the ith spell and potions[j] repre&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/successful-pairs-of-spells-and-potions/description/&quot; data-og-url=&quot;https://leetcode.com/problems/successful-pairs-of-spells-and-potions/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/jWWnE/hyR7AA58J2/K114RrfyTUaBLvyseKTKO1/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/blY7hz/hyR7A2apcJ/FZJUHC3hgxupSztuRCpoJk/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/successful-pairs-of-spells-and-potions/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/successful-pairs-of-spells-and-potions/description/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/jWWnE/hyR7AA58J2/K114RrfyTUaBLvyseKTKO1/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/blY7hz/hyR7A2apcJ/FZJUHC3hgxupSztuRCpoJk/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222');&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;Successful Pairs of Spells and Potions - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Can you solve this real interview question? Successful Pairs of Spells and Potions - You are given two positive integer arrays spells and potions, of length n and m respectively, where spells[i] represents the strength of the ith spell and potions[j] repre&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;You&amp;nbsp;are&amp;nbsp;given&amp;nbsp;two&amp;nbsp;positive&amp;nbsp;integer&amp;nbsp;arrays&amp;nbsp;spells&amp;nbsp;and&amp;nbsp;potions,&amp;nbsp;of&amp;nbsp;length&amp;nbsp;n&amp;nbsp;and&amp;nbsp;m&amp;nbsp;respectively,&amp;nbsp;where&amp;nbsp;spells[i]&amp;nbsp;represents&amp;nbsp;the&amp;nbsp;strength&amp;nbsp;of&amp;nbsp;the&amp;nbsp;ith&amp;nbsp;spell&amp;nbsp;and&amp;nbsp;potions[j]&amp;nbsp;represents&amp;nbsp;the&amp;nbsp;strength&amp;nbsp;of&amp;nbsp;the&amp;nbsp;jth&amp;nbsp;potion. &lt;br /&gt;&lt;br /&gt;You&amp;nbsp;are&amp;nbsp;also&amp;nbsp;given&amp;nbsp;an&amp;nbsp;integer&amp;nbsp;success.&amp;nbsp;A&amp;nbsp;spell&amp;nbsp;and&amp;nbsp;potion&amp;nbsp;pair&amp;nbsp;is&amp;nbsp;considered&amp;nbsp;successful&amp;nbsp;if&amp;nbsp;the&amp;nbsp;product&amp;nbsp;of&amp;nbsp;their&amp;nbsp;strengths&amp;nbsp;is&amp;nbsp;at&amp;nbsp;least&amp;nbsp;success. &lt;br /&gt;&lt;br /&gt;Return&amp;nbsp;an&amp;nbsp;integer&amp;nbsp;array&amp;nbsp;pairs&amp;nbsp;of&amp;nbsp;length&amp;nbsp;n&amp;nbsp;where&amp;nbsp;pairs[i]&amp;nbsp;is&amp;nbsp;the&amp;nbsp;number&amp;nbsp;of&amp;nbsp;potions&amp;nbsp;that&amp;nbsp;will&amp;nbsp;form&amp;nbsp;a&amp;nbsp;successful&amp;nbsp;pair&amp;nbsp;with&amp;nbsp;the&amp;nbsp;ith&amp;nbsp;spell. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1680581933116&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: spells = [5,1,3], potions = [1,2,3,4,5], success = 7
Output: [4,0,3]
Explanation:
- 0th spell: 5 * [1,2,3,4,5] = [5,10,15,20,25]. 4 pairs are successful.
- 1st spell: 1 * [1,2,3,4,5] = [1,2,3,4,5]. 0 pairs are successful.
- 2nd spell: 3 * [1,2,3,4,5] = [3,6,9,12,15]. 3 pairs are successful.
Thus, [4,0,3] is returned.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1680581940236&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: spells = [3,1,2], potions = [8,5,8], success = 16
Output: [2,0,2]
Explanation:
- 0th spell: 3 * [8,5,8] = [24,15,24]. 2 pairs are successful.
- 1st spell: 1 * [8,5,8] = [8,5,8]. 0 pairs are successful. 
- 2nd spell: 2 * [8,5,8] = [16,10,16]. 2 pairs are successful. 
Thus, [2,0,2] is returned.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;n == spells.length&lt;/li&gt;
&lt;li&gt;m == potions.length&lt;/li&gt;
&lt;li&gt;1 &amp;lt;= n, m &amp;lt;= 105&lt;/li&gt;
&lt;li&gt;1 &amp;lt;= spells[i], potions[i] &amp;lt;= 105&lt;/li&gt;
&lt;li&gt;1&amp;nbsp;&amp;lt;=&amp;nbsp;success&amp;nbsp;&amp;lt;=&amp;nbsp;1010&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 정수 배열 spells와 potions가 주어질 때 spells의 i번째 요소와 potions배열의 값의 곱이 success 이상이 되는 개수를 구하여 배열로 return 하는 문제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이분 탐색을 이용하여 풀이한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 이분탐색을 이용하기 위해 potions 배열을 오름차순으로 정렬한다.&lt;/p&gt;
&lt;pre id=&quot;code_1680446502908&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// potions 배열 오름차순으로 정렬
Arrays.sort(potions);&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;spells 배열의 모든 요소를 탐색하며 이분탐색을 실행하고 spells[i]의 값과 potions 배열의 각 요소의 곱이 success 이상이 되는 개수를 구하여 spells 배열에 업데이트한다.&lt;br /&gt;spells배열의 모든 요소의 탐색이 끝나면 spells 배열을 return한다.&lt;/p&gt;
&lt;pre id=&quot;code_1680446618996&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// spells 배열의 모든 요소 탐색
for(int i = 0; i &amp;lt; spells.length; i++) {
    // 이진 탐색으로 개수를 구하여 spells 배열에 값 업데이트
    spells[i] = binarySearch(spells[i], potions, success);
}

// 업데이트된 spells 배열을 return
return spells;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이분탐색에 사용하는 함수는 다음과 같다.&lt;br /&gt;현재 탐색중인 spells 배열의 요소와 potions 배열, 그리고 구하고자 하는 값의 기준이 되는 target 변수를 인자로 받는다.&lt;/p&gt;
&lt;pre id=&quot;code_1680446706269&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 이분 탐색
public int binarySearch(int spell, int[] potions, long target) {

}&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;정렬된 potions 배열의 마지막 요소와 spell의 곱이 target보다 작은 경우 조건을 만족하는 경우가 없으므로 바로 0을 return한다.&lt;/p&gt;
&lt;pre id=&quot;code_1680446741796&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 정렬된 potions 배열의 마지막 요소와 spell의 곱이 target보다 작은 경우 0을 return
if((long)potions[potions.length - 1] * spell &amp;lt; target) return 0;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 정렬된 potions 배열의 첫번째 요소와 spell의 곱이 target 이상인 경우 모든 요소가 조건을 만족하므로 potions 배열 길이를 return 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1680446773028&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 정렬된 potions 배열의 첫번째 요소와 spell의 곱이 target 이상인 경우 potions 배열 길이를 return
if((long)potions[0] * spell &amp;gt;= target) return potions.length;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 이분탐색에 사용할 변수들을 선언한다.&lt;/p&gt;
&lt;pre id=&quot;code_1680446791228&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// target 이상이 되는 potions 요소의 개수
int result = 0;
// 시작지점 인덱스
int start = 0;
// 종료지점 인덱스
int end = potions.length - 1;
// 중간지점 인덱스
int mid;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중간지점의 인덱스를 계산하고 세 가지 경우로 나누어 탐색한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;1. potions의 중간지점의 값과 spell의 곱이 target보다 크거나 같고, potions의 중간지점의 이전 값과 spell의 곱이 target보다 작은 경우&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우 중간지점이 문제에서 제시하는 조건을 만족하는 가장 작은값을 가진 지점이므로 중간 지점부터 배열의 끝까지의 길이를 결과값에 담고 탐색을 종료한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;2. potions의&amp;nbsp;중간지점의&amp;nbsp;값과&amp;nbsp;spell의&amp;nbsp;곱이&amp;nbsp;target보다&amp;nbsp;작은&amp;nbsp;경우&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번째 경우에는 문제에서 제시한 조건에 도달하기 위해서는 아직 중간지점 뒤로 이동하여야하므로 시작지점을 중간지점의 뒤로 이동한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;3. 나머지&amp;nbsp;경우&lt;/blockquote&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;탐색이 종료될 때까지 조건을 만족하는 지점을 찾지 못한경우 0을 return&lt;/p&gt;
&lt;pre id=&quot;code_1680447108820&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 시작지점과 종료지점이 교차할 때 까지 반복
while(start &amp;lt;= end) {
    // 중간지점 인덱스 계산
    mid = (start + end) / 2;

    // potions의 중간지점의 값과 spell의 곱이 target보다 크거나 같고
    // potions의 중간지점의 이전 값과 spell의 곱이 target보다 작은 경우
    // 중간 지점부터 끝까지의 값을 result에 저장하고 탐색 종료
    if((long)potions[mid] * spell &amp;gt;= target &amp;amp;&amp;amp; (long)potions[mid - 1] * spell &amp;lt; target) {
        result = potions.length - mid;
        break;
    }
    // potions의 중간지점의 값과 spell의 곱이 target보다 작은 경우
    // 시작지점을 중간지점 뒤로 설정
    else if((long)potions[mid] * spell &amp;lt; target) {
        start = mid + 1;
    }
    // 나머지 경우 종료지점을 중간지점 앞으로 설정
    else {
        end = mid - 1;
    }
}

return 0;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1680446302934&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int[] successfulPairs(int[] spells, int[] potions, long success) {
        // potions 배열 오름차순으로 정렬
        Arrays.sort(potions);
        
        // spells 배열의 모든 요소 탐색
        for(int i = 0; i &amp;lt; spells.length; i++) {
            // 이진 탐색으로 개수를 구하여 spells 배열에 값 업데이트
            spells[i] = binarySearch(spells[i], potions, success);
        }

        // 업데이트된 spells 배열을 return
        return spells;
    }

    // 이분 탐색
    public int binarySearch(int spell, int[] potions, long target) {
        // 정렬된 potions 배열의 마지막 요소와 spell의 곱이 target보다 작은 경우 0을 return
        if((long)potions[potions.length - 1] * spell &amp;lt; target) return 0;
        // 정렬된 potions 배열의 첫번째 요소와 spell의 곱이 target 이상인 경우 potions 배열 길이를 return
        if((long)potions[0] * spell &amp;gt;= target) return potions.length;

        // target 이상이 되는 potions 요소의 개수
        int result = 0;
        // 시작지점 인덱스
        int start = 0;
        // 종료지점 인덱스
        int end = potions.length - 1;
        // 중간지점 인덱스
        int mid;
        
        // 시작지점과 종료지점이 교차할 때 까지 반복
        while(start &amp;lt;= end) {
            // 중간지점 인덱스 계산
            mid = (start + end) / 2;
            
            // potions의 중간지점의 값과 spell의 곱이 target보다 크거나 같고
            // potions의 중간지점의 이전 값과 spell의 곱이 target보다 작은 경우
            // 중간 지점부터 끝까지의 값을 return
            if((long)potions[mid] * spell &amp;gt;= target &amp;amp;&amp;amp; (long)potions[mid - 1] * spell &amp;lt; target) {
                return potions.length - mid;
            }
            // potions의 중간지점의 값과 spell의 곱이 target보다 작은 경우
            // 시작지점을 중간지점 뒤로 설정
            else if((long)potions[mid] * spell &amp;lt; target) {
                start = mid + 1;
            }
            // 나머지 경우 종료지점을 중간지점 앞으로 설정
            else {
                end = mid - 1;
            }
        }
        
        return 0;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>binary search</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>이진탐색</category>
      <category>자바</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/151</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-2300-Successful-Pairs-of-Spells-and-Potions-Java-%EC%9E%91%EC%84%B1%EC%A4%91#entry151comment</comments>
      <pubDate>Sun, 2 Apr 2023 23:53:54 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 1402. Reducing Dishes - Java/Dart</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-1402-Reducing-Dishes-JavaDart</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/reducing-dishes/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/reducing-dishes/description/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1680055276106&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;Reducing Dishes - LeetCode&quot; data-og-description=&quot;Can you solve this real interview question? Reducing Dishes - A chef has collected data on the satisfaction level of his n dishes. Chef can cook any dish in 1 unit of time. Like-time coefficient of a dish is defined as the time taken to cook that dish incl&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/reducing-dishes/description/&quot; data-og-url=&quot;https://leetcode.com/problems/reducing-dishes/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cg6Ocx/hyR5oAgpTP/7RnVU314k8waxZRJdnUkl0/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/tuucX/hyR5lDxmAD/2KAQcasUYtfG4vepoH9Kq1/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/reducing-dishes/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/reducing-dishes/description/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cg6Ocx/hyR5oAgpTP/7RnVU314k8waxZRJdnUkl0/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/tuucX/hyR5lDxmAD/2KAQcasUYtfG4vepoH9Kq1/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222');&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;Reducing Dishes - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Can you solve this real interview question? Reducing Dishes - A chef has collected data on the satisfaction level of his n dishes. Chef can cook any dish in 1 unit of time. Like-time coefficient of a dish is defined as the time taken to cook that dish incl&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;A chef has collected data on the&lt;span&gt;&amp;nbsp;&lt;/span&gt;satisfaction&lt;span&gt;&amp;nbsp;&lt;/span&gt;level of his&lt;span&gt;&amp;nbsp;&lt;/span&gt;n&lt;span&gt;&amp;nbsp;&lt;/span&gt;dishes. Chef can cook any dish in 1 unit of time.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Like-time coefficient&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;of a dish is defined as the time taken to cook that dish including previous dishes multiplied by its satisfaction level i.e.&lt;span&gt;&amp;nbsp;&lt;/span&gt;time[i] * satisfaction[i].&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Return&lt;span&gt;&amp;nbsp;&lt;/span&gt;the maximum sum of&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;like-time coefficient&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;that the chef can obtain after dishes preparation.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dishes can be prepared in&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;any&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;order and the chef can discard some dishes to get this maximum value.&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;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Input: satisfaction = [-1,-8,0,5,-9]
Output: 14
Explanation: After Removing the second and last dish, the maximum total like-time coefficient will be equal to (-1*1 + 0*2 + 5*3 = 14).
Each dish is prepared in one unit of time.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Input: satisfaction = [4,3,2]
Output: 20
Explanation: Dishes can be prepared in any order, (2*1 + 3*2 + 4*3 = 20)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 3:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;Input: satisfaction = [-1,-4,-5]
Output: 0
Explanation: People do not like the dishes. No dish is prepared.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;n == satisfaction.length&lt;/li&gt;
&lt;li&gt;1 &amp;lt;= n &amp;lt;= 500&lt;/li&gt;
&lt;li&gt;-1000 &amp;lt;= satisfaction[i] &amp;lt;= 1000&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요리사가 만드는 요리의 만족도가 담긴 배열 satisfaction이 주어지고 하나의 요리를 준비하는데 1만큼의 시간이 소요된다. 이때&amp;nbsp; 요리사가 요리를 준비하는데 필요한 &lt;b&gt;Like-time coefficient &lt;/b&gt;값의 최대합을 구하는 문제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제에서 요구하는 &lt;b&gt;Like-time coefficient&lt;/b&gt;는 n번째 요리를 준비할 때 현재까지 요리를 준비하는데 걸리는 시간과 현재 요리의 만족도의 곱을 의미한다. 예를 들어 3번째로 준비하는 요리의 만족도가 3이라면 이 요리의 &lt;b&gt;Like-time coefficient&lt;/b&gt;는 3(시간) x 3(만족도) = 9가 된다. 따라서 n개의 요리를 준비할 때 각 요리의 &lt;b&gt;Like-time coefficient &lt;/b&gt;값의 합이 최대가 되는 값을 구하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요리를 준비하는 순서는 상관이 없으며 최대값을 만들기 위하여 요리를 제외시키는 것도 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;풀이 과정은 다음과 같다.&lt;br /&gt;먼저 요리의 만족도가 담겨있는 배열 satisfaction를 오름차순으로 정렬하여 큰 값 부터 낮은 값 순으로 탐색한다.&lt;br /&gt;n번째 까지의 음식의 만족도의 합을 갱신하며 최대값에 더해나간다. &lt;br /&gt;단 n번째 까지의 음식의 만족도의 합이 0 이하가 되는 경우 이 지점부터는 최대값이 줄어들게 되므로 그 지점에서의 최대값을 return한다. &lt;br /&gt;탐색이 끝까지 종료되는 경우에도 마찬가지로 최대값을 return 해준다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Java&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1680055299659&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int maxSatisfaction(int[] satisfaction) {
        // 최종적으로 반환할 최대값
        int maxSum = 0;
        
        // satisfaction 배열을 오름차순으로 정렬
        Arrays.sort(satisfaction);
        
        // 가장 높은 만족도 값이 음수인 경우 음식을 준비할 필요가 없으므로 0을 바로 return
        if(satisfaction[satisfaction.length - 1] &amp;lt; 0) return 0;
        
        // 지금까지 탐색한 각 음식의 만족도의 합
        int sum = 0;
        
        // 마지막 인덱스 부터 반대로 탐색
        for(int i = satisfaction.length -1; i &amp;gt;= 0; i--) {
            // 현재 음식의 만족도를 합계에 추가
            sum += satisfaction[i];
            
            // 현재까지 음식의 만족도의 합이 음수가 되는 경우
            // 이 지점부터는 최대값이 줄어들게 되므로 현재까지 탐색한 최대값을 return
            if(sum &amp;lt;= 0)  return maxSum;
            // 현재까지 음식의 만족도의 합이 양수가 되는 경우
            // 최대값에 만족도의 합을 추가
            else maxSum += sum;
        }

        return maxSum;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Dart&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1680055323282&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
  int maxSatisfaction(List&amp;lt;int&amp;gt; satisfaction) {
    // 최종적으로 반환할 최대값
    var maxSum = 0;
    
    // satisfaction 리스트를 오름차순으로 정렬
    satisfaction.sort();
    
    // 가장 높은 만족도 값이 음수인 경우 음식을 준비할 필요가 없으므로 0을 return
    if(satisfaction[satisfaction.length - 1] &amp;lt; 0) return 0;
    
    // 지금까지 탐색한 각 음식의 만족도의 합
    var sum = 0;
    
    for(var i = satisfaction.length - 1; i &amp;gt;= 0; i--){
        // 현재 음식의 만족도를 합계에 추가
        sum += satisfaction[i];
        
        if(sum &amp;lt;= 0) return maxSum;
        else maxSum += sum;
    }
    
    return maxSum;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>dart</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>Reducing Dishes</category>
      <category>다트</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>자바</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/150</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-1402-Reducing-Dishes-JavaDart#entry150comment</comments>
      <pubDate>Wed, 29 Mar 2023 11:16:50 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 983. Minimum Cost For Tickets - Java/Dart</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-983-Minimum-Cost-For-Tickets-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/minimum-cost-for-tickets/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/minimum-cost-for-tickets/description/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1679970232625&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;Minimum Cost For Tickets - LeetCode&quot; data-og-description=&quot;Can you solve this real interview question? Minimum Cost For Tickets - You have planned some train traveling one year in advance. The days of the year in which you will travel are given as an integer array days. Each day is an integer from 1 to 365. Train &quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/minimum-cost-for-tickets/description/&quot; data-og-url=&quot;https://leetcode.com/problems/minimum-cost-for-tickets/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/FLMLb/hyR5ozAALh/RROkPDXnA0bEMGc1IQjgTk/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/3RiVB/hyR33cL5Wf/xbcVNB1YPBzPfbAZk0akd1/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/minimum-cost-for-tickets/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/minimum-cost-for-tickets/description/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/FLMLb/hyR5ozAALh/RROkPDXnA0bEMGc1IQjgTk/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/3RiVB/hyR33cL5Wf/xbcVNB1YPBzPfbAZk0akd1/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222');&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;Minimum Cost For Tickets - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Can you solve this real interview question? Minimum Cost For Tickets - You have planned some train traveling one year in advance. The days of the year in which you will travel are given as an integer array days. Each day is an integer from 1 to 365. Train&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;You have planned some train traveling one year in advance. The days of the year in which you will travel are given as an integer array&lt;span&gt;&amp;nbsp;&lt;/span&gt;days. Each day is an integer from&lt;span&gt;&amp;nbsp;&lt;/span&gt;1&lt;span&gt;&amp;nbsp;&lt;/span&gt;to&lt;span&gt;&amp;nbsp;&lt;/span&gt;365.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Train tickets are sold in&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;three different ways&lt;/b&gt;:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;a&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;1-day&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;pass is sold for&lt;span&gt;&amp;nbsp;&lt;/span&gt;costs[0]&lt;span&gt;&amp;nbsp;&lt;/span&gt;dollars,&lt;/li&gt;
&lt;li&gt;a&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;7-day&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;pass is sold for&lt;span&gt;&amp;nbsp;&lt;/span&gt;costs[1]&lt;span&gt;&amp;nbsp;&lt;/span&gt;dollars, and&lt;/li&gt;
&lt;li&gt;a&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;30-day&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;pass is sold for&lt;span&gt;&amp;nbsp;&lt;/span&gt;costs[2]&lt;span&gt;&amp;nbsp;&lt;/span&gt;dollars.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The passes allow that many days of consecutive travel.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;For example, if we get a&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;7-day&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;pass on day&lt;span&gt;&amp;nbsp;&lt;/span&gt;2, then we can travel for&lt;span&gt;&amp;nbsp;&lt;/span&gt;7&lt;span&gt;&amp;nbsp;&lt;/span&gt;days:&lt;span&gt;&amp;nbsp;&lt;/span&gt;2,&lt;span&gt;&amp;nbsp;&lt;/span&gt;3,&lt;span&gt;&amp;nbsp;&lt;/span&gt;4,&lt;span&gt;&amp;nbsp;&lt;/span&gt;5,&lt;span&gt;&amp;nbsp;&lt;/span&gt;6,&lt;span&gt;&amp;nbsp;&lt;/span&gt;7, and&lt;span&gt;&amp;nbsp;&lt;/span&gt;8.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Return&lt;span&gt;&amp;nbsp;&lt;/span&gt;the minimum number of dollars you need to travel every day in the given list of days.&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;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Input: days = [1,4,6,7,8,20], costs = [2,7,15]
Output: 11
Explanation: For example, here is one way to buy passes that lets you travel your travel plan:
On day 1, you bought a 1-day pass for costs[0] = $2, which covered day 1.
On day 3, you bought a 7-day pass for costs[1] = $7, which covered days 3, 4, ..., 9.
On day 20, you bought a 1-day pass for costs[0] = $2, which covered day 20.
In total, you spent $11 and covered all the days of your travel.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Input: days = [1,2,3,4,5,6,7,8,9,10,30,31], costs = [2,7,15]
Output: 17
Explanation: For example, here is one way to buy passes that lets you travel your travel plan:
On day 1, you bought a 30-day pass for costs[2] = $15 which covered days 1, 2, ..., 30.
On day 31, you bought a 1-day pass for costs[0] = $2 which covered day 31.
In total, you spent $17 and covered all the days of your travel.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1 &amp;lt;= days.length &amp;lt;= 365&lt;/li&gt;
&lt;li&gt;1 &amp;lt;= days[i] &amp;lt;= 365&lt;/li&gt;
&lt;li&gt;days&lt;span&gt;&amp;nbsp;&lt;/span&gt;is in strictly increasing order.&lt;/li&gt;
&lt;li&gt;costs.length == 3&lt;/li&gt;
&lt;li&gt;1 &amp;lt;= costs[i] &amp;lt;= 1000&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여행일이 담긴 배열 days 와 1-day pass, 7-day pass, 30-day pass의 가격이 담긴 costs 배열이 주어질 때 days 배열의 날짜를 모두 여행하기 위해 구매해야하는 pass의 최소 가격을 구하는 문제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dp를 이용하여 1일 부터 마지막 날짜까지 각 날짜에 들어가는 최소 비용을 구해나가도록 풀이한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 각 여행일의 최소 비용을 저장할 배열을 선언하고 days 배열의 마지막 날짜까지 탐색할 수 있도록 크기를 초기화한다.&lt;/p&gt;
&lt;pre id=&quot;code_1679978386795&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 각 여행일의 최소 비용을 저장할 배열을 선언하고
// days 배열의 마지막 날짜 + 1 크기로 초기화한다
int[] costSum = new int[days[days.length - 1] + 1];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 여행일에 해당하지 않는 날의 경우에는 비용이 발생하지 않으므로 전날까지의 비용을 그대로 가지고 있으면 된다.&lt;br /&gt;실제 여행일을 판단하기 위해서 마찬가지로 days 배열의 마지막 날짜 + 1 크기의 boolean 배열을 선언하고 days 배열의 값에 해당하는 날짜들을 true로 세팅해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1679978567934&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 실제 여행일에 해당하는 날짜를 저장하기위한 배열 선언 및
// days 배열에 해당하는 날짜 true로 세팅
boolean[] travelDay = new boolean[days[days.length - 1] + 1];

for(int day : days) {
    travelDay[day] = true;
}&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;1일부터 여행의 마지막 날까지 탐색하며 각 날짜에 필요한 최소 비용을 업데이트 한다.&lt;br /&gt;현재 탐색중인 날짜가 실제 여행한 날짜에 포함되지 않는 경우는 이전 날짜의 비용을 유지하고 다음 탐색으로 넘어간다.&lt;br /&gt;현재 탐색중인 날짜가 실제 여행한 날짜인 경우 다음 세 가지의 값 중 최소값으로 값을 업데이트한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1일 전과 1-day pass 비용의 합&lt;/li&gt;
&lt;li&gt;7일 전과 7-day pass 비용의 합&lt;/li&gt;
&lt;li&gt;30일 전과 30-day pass 비용의 합&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1679978611253&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for(int i = 1; i &amp;lt; costSum.length; i++) {
// 여행한 날짜에 포함되지 않는 경우
if(!travelDay[i]) {
    // 전일 비용을 유지하고 탐색을 계속
    costSum[i] = costSum[i - 1];
    continue;
}

// 1일 전과 1-day 패스 비용의 합
// 7일 전과 7-day 패스 비용의 합
// 30일 전과 30-day 패스 비용의 합 중 가장 작은 값을 현재 비용으로 저장 
costSum[i] = costSum[i - 1] + costs[0];
costSum[i] = Math.min(costSum[i], costSum[Math.max(0, i - 7)] + costs[1]);
costSum[i] = Math.min(costSum[i], costSum[Math.max(0, i - 30)] + costs[2]);
}&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;탐색이 종료된 후 여행의 마지막 날짜에 해당하는 값을 return 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1679978716952&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 마지막 일자의 비용을 return
return costSum[costSum.length - 1];&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Java&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1679970240358&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int mincostTickets(int[] days, int[] costs) {
        // 각 여행일의 최소 비용을 저장할 배열을 선언하고
        // days 배열의 마지막 날짜 + 1 크기로 초기화한다
        int[] costSum = new int[days[days.length - 1] + 1];
        // 실제 여행일에 해당하는 날짜를 저장하기위한 배열 선언 및
        // days 배열에 해당하는 날짜 true로 세팅
        boolean[] travelDay = new boolean[days[days.length - 1] + 1];
        
        for(int day : days) {
            travelDay[day] = true;
        }
        
        for(int i = 1; i &amp;lt; costSum.length; i++) {
            // 여행한 날짜에 포함되지 않는 경우
            if(!travelDay[i]) {
                // 전일 비용을 유지하고 탐색을 계속
                costSum[i] = costSum[i - 1];
                continue;
            }
            
            // 1일 전과 1-day 패스 비용의 합
            // 7일 전과 7-day 패스 비용의 합
            // 30일 전과 30-day 패스 비용의 합 중 가장 작은 값을 현재 비용으로 저장 
            costSum[i] = costSum[i - 1] + costs[0];
            costSum[i] = Math.min(costSum[i], costSum[Math.max(0, i - 7)] + costs[1]);
            costSum[i] = Math.min(costSum[i], costSum[Math.max(0, i - 30)] + costs[2]);
        }
        
        // 마지막 일자의 비용을 return
        return costSum[costSum.length - 1];
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Dart&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1679988419772&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
  int mincostTickets(List&amp;lt;int&amp;gt; days, List&amp;lt;int&amp;gt; costs) {
    // 각 여행일의 최소 비용을 저장할 리스트를 선언하고
    // days 배열의 마지막 날짜 + 1 크기로 초기화한다
    List&amp;lt;int&amp;gt; costSum = List&amp;lt;int&amp;gt;.filled(days[days.length - 1] + 1, 0);
    // 실제 여행일에 해당하는 날짜를 저장하기위한 배열 선언 및
    // days 배열에 해당하는 날짜 true로 세팅
    List&amp;lt;bool&amp;gt; travelDay = List&amp;lt;bool&amp;gt;.filled(days[days.length - 1] + 1, false);
    
    for(var day in days){
        travelDay[day] = true;
    }
    
    for(var i = 1; i &amp;lt; costSum.length; i++){
        // 여행한 날짜에 포함되지 않는 경우
        if(!travelDay[i]){
        // 전일 비용을 유지하고 탐색을 계속
        costSum[i] = costSum[i - 1];
        continue;
        }
        
        // 1일 전과 1-day 패스 비용의 합
        // 7일 전과 7-day 패스 비용의 합
        // 30일 전과 30-day 패스 비용의 합 중 가장 작은 값을 현재 비용으로 저장 
        costSum[i] = costSum[i - 1] + costs[0];
        costSum[i] = min(costSum[i], costSum[max(0, i - 7)] + costs[1]);
        costSum[i] = min(costSum[i], costSum[max(0, i - 30)] + costs[2]);
    }
    
    // 마지막 일자의 비용을 return
    return costSum[costSum.length - 1];
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>DP</category>
      <category>Dynamic Programming</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>자바</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/149</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-983-Minimum-Cost-For-Tickets-Java#entry149comment</comments>
      <pubDate>Tue, 28 Mar 2023 13:45:22 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 64. Minimum Path Sum - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-64-Minimum-Path-Sum-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/minimum-path-sum/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/minimum-path-sum/description/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1679881044095&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;Minimum Path Sum - LeetCode&quot; data-og-description=&quot;Can you solve this real interview question? Minimum Path Sum - Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right, which minimizes the sum of all numbers along its path. Note: You can only move either down or rig&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/minimum-path-sum/description/&quot; data-og-url=&quot;https://leetcode.com/problems/minimum-path-sum/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dNeb2J/hyR2V0ClnD/4dl2nv0Jfak4kUOIf9Yno1/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/bwpRPr/hyR2H88emD/45CeHmOqIxBYR8aWCP2EEk/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222,https://scrap.kakaocdn.net/dn/bPs7en/hyR2HOQ6Lz/Jkgz7fu4JUKQWSZCRGpWJK/img.jpg?width=242&amp;amp;height=242&amp;amp;face=0_0_242_242&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/minimum-path-sum/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/minimum-path-sum/description/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dNeb2J/hyR2V0ClnD/4dl2nv0Jfak4kUOIf9Yno1/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/bwpRPr/hyR2H88emD/45CeHmOqIxBYR8aWCP2EEk/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222,https://scrap.kakaocdn.net/dn/bPs7en/hyR2HOQ6Lz/Jkgz7fu4JUKQWSZCRGpWJK/img.jpg?width=242&amp;amp;height=242&amp;amp;face=0_0_242_242');&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;Minimum Path Sum - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Can you solve this real interview question? Minimum Path Sum - Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right, which minimizes the sum of all numbers along its path. Note: You can only move either down or rig&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;Given a&lt;span&gt;&amp;nbsp;&lt;/span&gt;m x n&lt;span&gt;&amp;nbsp;&lt;/span&gt;grid&lt;span&gt;&amp;nbsp;&lt;/span&gt;filled with non-negative numbers, find a path from top left to bottom right, which minimizes the sum of all numbers along its path.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Note:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;You can only move either down or right at any point in time.&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;Example 1:&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;242&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nmlTS/btr5RRYmhMa/bFgW5E0JZstnFOOXAK70wK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nmlTS/btr5RRYmhMa/bFgW5E0JZstnFOOXAK70wK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nmlTS/btr5RRYmhMa/bFgW5E0JZstnFOOXAK70wK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnmlTS%2Fbtr5RRYmhMa%2FbFgW5E0JZstnFOOXAK70wK%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;242&quot; height=&quot;242&quot; data-origin-width=&quot;242&quot; data-origin-height=&quot;242&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Input: grid = [[1,3,1],[1,5,1],[4,2,1]]
Output: 7
Explanation: Because the path 1 &amp;rarr; 3 &amp;rarr; 1 &amp;rarr; 1 &amp;rarr; 1 minimizes the sum.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Input: grid = [[1,2,3],[4,5,6]]
Output: 12
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;m == grid.length&lt;/li&gt;
&lt;li&gt;n == grid[i].length&lt;/li&gt;
&lt;li&gt;1 &amp;lt;= m, n &amp;lt;= 200&lt;/li&gt;
&lt;li&gt;0 &amp;lt;= grid[i][j] &amp;lt;= 100&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;양수값으로 이루어진 m x n 크기의 그리드가 주어졌을 때 왼쪽 상단지점에서 출발하여 오른쪽 하단에 도착하면서 지나는 지점들의 최소합을 구하는 문제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 지점으로 이동하기 위해서는 오른쪽이나 아래쪽으로만 이동이 가능하다. 따라서 (a, b)지점으로 이동할 때의 경로 최소값은 왼쪽 지점 (a, b - 1)의 값과 위쪽 지점 (a - 1, b)의 값 중 최소값과 현재 지점의 값의 합이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 현재 탐색 지점이 가장 위쪽에 있는 경우에는 비교할 위쪽 지점이 없으므로 현재 지점의 값과 왼쪽 지점의 값의 합이 되고, 현재 탐색 지점이 가장 왼쪽에 있는 경우에는 비교할 왼쪽 지점이 없으므로 현재 지점의 값과 위쪽 지점의 값의 합이된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시작점(0, 0)부터 한 줄씩 탐색하며 값을 갱신하여 최종적으로 오른쪽 아래 지점의 값을 return 해준다.&lt;br /&gt;1번 예시의 탐색과정을 그림으로 나타내면 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 시작점은 변하지 않는 값이므로 탐색에서 제외한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;236&quot; data-origin-height=&quot;235&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Z07ix/btr6g9C7tOF/AABPb1HGX1aYkbTGSEhsN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Z07ix/btr6g9C7tOF/AABPb1HGX1aYkbTGSEhsN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Z07ix/btr6g9C7tOF/AABPb1HGX1aYkbTGSEhsN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZ07ix%2Fbtr6g9C7tOF%2FAABPb1HGX1aYkbTGSEhsN0%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;236&quot; height=&quot;235&quot; data-origin-width=&quot;236&quot; data-origin-height=&quot;235&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;br /&gt;현재 행의 나머지 지점에 대해서도 같은 탐색을 통해 값을 저장한다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;239&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qWVZY/btr53EX6xyS/AOmnaEs53RYUn8Ytr4xjR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qWVZY/btr53EX6xyS/AOmnaEs53RYUn8Ytr4xjR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qWVZY/btr53EX6xyS/AOmnaEs53RYUn8Ytr4xjR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqWVZY%2Fbtr53EX6xyS%2FAOmnaEs53RYUn8Ytr4xjR0%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;239&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;239&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;br /&gt;두 번째 줄의 첫 번째 지점의 경우 가장 왼쪽에 존재하는 지점이므로 현재 지점의 값과 위쪽 지점의 값의 합을 현재 지점의 값으로 저장한다.&lt;br /&gt;두 번째 지점의 경우에는 왼쪽 지점과 위쪽 지점이 모두 존재하므로 두 지점의 값 중 최소값과 현재 지점의 값을 더하여 현재 지점의 값으로 저장한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/by28pB/btr6eVLNhYU/LTei8hVndJA8Gdtvi40kPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/by28pB/btr6eVLNhYU/LTei8hVndJA8Gdtvi40kPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/by28pB/btr6eVLNhYU/LTei8hVndJA8Gdtvi40kPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fby28pB%2Fbtr6eVLNhYU%2FLTei8hVndJA8Gdtvi40kPk%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;846&quot; height=&quot;240&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;240&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;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;239&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPg995/btr5PRY7Ybn/iW2Q7WN1aXYLMa9AxcdXdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPg995/btr5PRY7Ybn/iW2Q7WN1aXYLMa9AxcdXdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPg995/btr5PRY7Ybn/iW2Q7WN1aXYLMa9AxcdXdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPg995%2Fbtr5PRY7Ybn%2FiW2Q7WN1aXYLMa9AxcdXdk%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;846&quot; height=&quot;239&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;239&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;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1679881042356&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int minPathSum(int[][] grid) {
        // (0,0) 지점부터 오른쪽 방향으로 탐색
        for(int i = 0; i &amp;lt; grid.length; i++) {
            // 오른쪽 방향 탐색이 끝나면 아래쪽 방향 탐색
            for(int j = 0; j &amp;lt; grid[0].length; j++) {
                // (0,0) 지점은 탐색 제외
                if(i == 0 &amp;amp;&amp;amp; j == 0) continue;
                
                // 가장 위쪽 지점 탐색중인 경우
                if(i == 0) {
                    // 현재 지점의 값과 왼쪽 지점의 값의 합을 현재 지점에 저장
                    grid[i][j] += grid[i][j - 1];
                }
                // 가장 왼쪽 지점를 탐색중인 경우
                else if(j == 0) {
                    // 현재 지점의 값과 위쪽 지점의 값의 합을 현재 지점에 저장
                    grid[i][j] += grid[i - 1][j];
                }
                // 그 외의 경우
                else {
                    // 왼쪽 지점의 값과 위쪽 지점의 값 중 최소값을 현재 지점의 값과 더하여 저장
                    grid[i][j] += Math.min(grid[i][j - 1], grid[i - 1][j]);
                }
            }
        }

		// 도착점의 값을 return
        return grid[grid.length - 1][grid[0].length - 1];
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>DP</category>
      <category>Dynamic Programming</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>동적계획법</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>자바</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/148</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-64-Minimum-Path-Sum-Java#entry148comment</comments>
      <pubDate>Mon, 27 Mar 2023 11:19:31 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 105. Construct Binary Tree from Preorder and Inorder Traversal - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-105-Construct-Binary-Tree-from-Preorder-and-Inorder-Traversal-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/description/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1679624757613&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;Construct Binary Tree from Preorder and Inorder Traversal - LeetCode&quot; data-og-description=&quot;Can you solve this real interview question? Construct Binary Tree from Preorder and Inorder Traversal - Given two integer arrays preorder and inorder where preorder is the preorder traversal of a binary tree and inorder is the inorder traversal of the same&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/description/&quot; data-og-url=&quot;https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/mRwe6/hyR17sIOCK/hPZG7PpAI92aW1SFjsiCY1/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/FOwmh/hyR2N7eetv/eagYk00yDggMBMPiyt5EhK/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222,https://scrap.kakaocdn.net/dn/wcfgn/hyR2RBM1Gh/i4kMKAGEVQMvBQbFko1KX0/img.jpg?width=277&amp;amp;height=302&amp;amp;face=0_0_277_302&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/description/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/mRwe6/hyR17sIOCK/hPZG7PpAI92aW1SFjsiCY1/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/FOwmh/hyR2N7eetv/eagYk00yDggMBMPiyt5EhK/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222,https://scrap.kakaocdn.net/dn/wcfgn/hyR2RBM1Gh/i4kMKAGEVQMvBQbFko1KX0/img.jpg?width=277&amp;amp;height=302&amp;amp;face=0_0_277_302');&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;Construct Binary Tree from Preorder and Inorder Traversal - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Can you solve this real interview question? Construct Binary Tree from Preorder and Inorder Traversal - Given two integer arrays preorder and inorder where preorder is the preorder traversal of a binary tree and inorder is the inorder traversal of the same&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;Given two integer arrays&lt;span&gt;&amp;nbsp;&lt;/span&gt;preorder&lt;span&gt;&amp;nbsp;&lt;/span&gt;and&lt;span&gt;&amp;nbsp;&lt;/span&gt;inorder&lt;span&gt;&amp;nbsp;&lt;/span&gt;where&lt;span&gt;&amp;nbsp;&lt;/span&gt;preorder&lt;span&gt;&amp;nbsp;&lt;/span&gt;is the preorder traversal of a binary tree and&lt;span&gt;&amp;nbsp;&lt;/span&gt;inorder&lt;span&gt;&amp;nbsp;&lt;/span&gt;is the inorder traversal of the same tree, construct and return&lt;span&gt;&amp;nbsp;&lt;/span&gt;the binary tree.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 1:&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;277&quot; data-origin-height=&quot;302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ehO5Uk/btr5DUAnSf8/0uLSaFkjGoL3iswRTp4ksK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ehO5Uk/btr5DUAnSf8/0uLSaFkjGoL3iswRTp4ksK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ehO5Uk/btr5DUAnSf8/0uLSaFkjGoL3iswRTp4ksK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FehO5Uk%2Fbtr5DUAnSf8%2F0uLSaFkjGoL3iswRTp4ksK%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;277&quot; height=&quot;302&quot; data-origin-width=&quot;277&quot; data-origin-height=&quot;302&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Input: preorder = [-1], inorder = [-1]
Output: [-1]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1 &amp;lt;= preorder.length &amp;lt;= 3000&lt;/li&gt;
&lt;li&gt;inorder.length == preorder.length&lt;/li&gt;
&lt;li&gt;-3000 &amp;lt;= preorder[i], inorder[i] &amp;lt;= 3000&lt;/li&gt;
&lt;li&gt;preorder&lt;span&gt;&amp;nbsp;&lt;/span&gt;and&lt;span&gt;&amp;nbsp;&lt;/span&gt;inorder&lt;span&gt;&amp;nbsp;&lt;/span&gt;consist of&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;unique&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;values.&lt;/li&gt;
&lt;li&gt;Each value of&lt;span&gt;&amp;nbsp;&lt;/span&gt;inorder&lt;span&gt;&amp;nbsp;&lt;/span&gt;also appears in&lt;span&gt;&amp;nbsp;&lt;/span&gt;preorder.&lt;/li&gt;
&lt;li&gt;preorder&lt;span&gt;&amp;nbsp;&lt;/span&gt;is&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;guaranteed&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;to be the preorder traversal of the tree.&lt;/li&gt;
&lt;li&gt;inorder&lt;span&gt;&amp;nbsp;&lt;/span&gt;is&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;guaranteed&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;to be the inorder traversal of the tree.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이진 트리의 전위 순회 배열 preorder와 같은 트리의 중위 순회 배열 inorder배열이 주어졌을 때, 원래의 이진 트리를 구하는 문제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 이진트리의 전위 순회와 중위 순회의 특징에 대해서 살펴보면&lt;br /&gt;전위 순회의 경우 부모 노드 -&amp;gt; 왼쪽 노드 -&amp;gt; 오른쪽 노드 순으로 탐색을 하게 되고&lt;br /&gt;중위 순회의 경위 왼쪽 노드 -&amp;gt; 부모 노드 -&amp;gt; 오른쪽 노드 순으로 탐색을 하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 전위 순회의 첫 노드는 이진트리의 root 노드가 되고 중위 순회 배열에서 이 root 노드를 기준으로 왼쪽에 있는 값들은 root 노드의 왼쪽 노드 값, 오른쪽에 있는 값들은 root 노드의 오른쪽 노드 값이 된다.&lt;br /&gt;그림으로 살펴보면 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;785&quot; data-origin-height=&quot;851&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kxx0p/btr5BUV185n/H4xHfUKU6b0wKX4knEd8hk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kxx0p/btr5BUV185n/H4xHfUKU6b0wKX4knEd8hk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kxx0p/btr5BUV185n/H4xHfUKU6b0wKX4knEd8hk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fkxx0p%2Fbtr5BUV185n%2FH4xHfUKU6b0wKX4knEd8hk%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;785&quot; height=&quot;851&quot; data-origin-width=&quot;785&quot; data-origin-height=&quot;851&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후에 왼쪽 노드와 오른쪽 노드에 대해서 같은 과정을 재귀 탐색하면 최종적으로 원래의 이진트리의 모습을 구할 수 있다.&lt;br /&gt;해당 과정을 구현하는 과정과 코드는 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재귀 탐색을 위한 함수를 생성한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1679634312003&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/**
    * @param preorder      전위 순회 배열
    * @param inorder       중위 순회 배열
    * @param preIndex      preorder 배열에서 현재 노드의 인덱스
    * @param inStart       현재 탐색중인 inorder 배열의 시작 인덱스
    * @param inEnd         현재 탐색중인 inorder 배열의 종료 인덱스
    * @return              TreeNode
    */
    public TreeNode makeTree(int[] preorder, int[] inorder, int preIndex, int inStart, int inEnd) {
    
    }&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;우선 preorder 배열에서 현재 노드의 인덱스가 배열의 크기를 벗어나거나 inorder 배열의 시작 인덱스가 종료 인덱스보다 큰 경우 더 이상 하위 노드가 존재하지 않으므로 null을 return하여 탐색을 종료한다.&lt;/p&gt;
&lt;pre id=&quot;code_1679634371804&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// preorder 배열에서 현재 노드의 인덱스가 배열의 크기를 벗어나거나
// inorder 배열의 시작 인덱스가 종료 인덱스보다 큰 경우 더 이상 노드가 존재하지 않으므로 null을 return
if(preIndex &amp;gt; preorder.length || inStart &amp;gt; inEnd) return null;&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;그렇지 않은 경우 preorder 배열에서 현재 노드의 인덱스 값에 해당하는 값으로 새 노드를 생성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1679634489524&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 새로운 트리노드 생성
TreeNode node = new TreeNode(preorder[preIndex]);&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;현재 노드의 값을 기준으로 inorder 배열에서 현재 노드값에 해당하는 인덱스를 탐색한다. 이 인덱스를 기준으로 왼쪽과 오른쪽에 들어갈 노드를 나누게 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1679634550724&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// inorder 배열에서 현재 노드의 인덱스 탐색
// 해당 인덱스를 기준으로 노드를 좌우로 나눔
int inIndex = 0;

for(int i = inStart; i &amp;lt;= inEnd; i++) {
    if(node.val == inorder[i]) {
        inIndex = i;
        break;
    }
}&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;현재 노드의 왼쪽 오른쪽 노드에 해당하는 노드를 만들기 위해 함수를 재귀 호출하고 현재 노드를 return 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1679634596116&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 현재 노드의 좌우 노드 추가
// 왼쪽 노드의 인덱스 = preorder 배열에서 현재 노드의 다음 인덱스
// 왼쪽 노드의 시작 인덱스 = inorder 배열의 시작 인덱스
// 왼쪽 노드의 종료 인덱스 = inorder 배열에서 현재 노드의 인덱스 - 1
node.left = makeTree(preorder, inorder, preIndex + 1, inStart, inIndex - 1);
// 오른쪽 노드의 시작 인덱스 = preorder 배열에서 현재 노드의 인덱스(preIndex) + inorder 배열에서 왼쪽 노드의 수(inIndex - inStart + 1)
// 오른쪽 노드의 시작 인덱스 = inorder 배열에서 현재 노드의 인덱스 + 1
// 오른쪽 노드의 종료 인덱스 = inorder 배열의 종료 인덱스
node.right = makeTree(preorder, inorder, preIndex + inIndex - inStart + 1, inIndex + 1, inEnd);

return node;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1679624771703&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        return makeTree(preorder, inorder, 0, 0, inorder.length - 1);
    }

    /**
    * @param preorder      전위 순회 배열
    * @param inorder       중위 순회 배열
    * @param preIndex      preorder 배열에서 현재 노드의 인덱스
    * @param inStart       현재 탐색중인 inorder 배열의 시작 인덱스
    * @param inEnd         현재 탐색중인 inorder 배열의 종료 인덱스
    * @return              TreeNode
    */
    public TreeNode makeTree(int[] preorder, int[] inorder, int preIndex, int inStart, int inEnd) {
        
        // preorder 배열에서 현재 노드의 인덱스가 배열의 크기를 벗어나거나
        // inorder 배열의 시작 인덱스가 종료 인덱스보다 큰 경우 더 이상 하위 노드가 존재하지 않으므로 null을 return
        if(preIndex &amp;gt; preorder.length || inStart &amp;gt; inEnd) return null;
        
        // 새로운 트리노드 생성
        TreeNode node = new TreeNode(preorder[preIndex]);
        
        // inorder 배열에서 현재 노드의 인덱스 탐색
        // 해당 인덱스를 기준으로 노드를 좌우로 나눔
        int inIndex = 0;
        
        for(int i = inStart; i &amp;lt;= inEnd; i++) {
            if(node.val == inorder[i]) {
                inIndex = i;
                break;
            }
        }
        
        // 현재 노드의 좌우 노드 추가
        // 왼쪽 노드의 인덱스 = preorder 배열에서 현재 노드의 다음 인덱스
        // 왼쪽 노드의 시작 인덱스 = inorder 배열의 시작 인덱스
        // 왼쪽 노드의 종료 인덱스 = inorder 배열에서 현재 노드의 인덱스 - 1
        node.left = makeTree(preorder, inorder, preIndex + 1, inStart, inIndex - 1);
        // 오른쪽 노드의 시작 인덱스 = preorder 배열에서 현재 노드의 인덱스(preIndex) + inorder 배열에서 왼쪽 노드의 수(inIndex - inStart + 1)
        // 오른쪽 노드의 시작 인덱스 = inorder 배열에서 현재 노드의 인덱스 + 1
        // 오른쪽 노드의 종료 인덱스 = inorder 배열의 종료 인덱스
        node.right = makeTree(preorder, inorder, preIndex + inIndex - inStart + 1, inIndex + 1, inEnd);
        
        return node;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>inorder</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>preorder</category>
      <category>tree</category>
      <category>알고리즘</category>
      <category>전위순회</category>
      <category>중위순회</category>
      <category>트리</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/146</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-105-Construct-Binary-Tree-from-Preorder-and-Inorder-Traversal-Java#entry146comment</comments>
      <pubDate>Fri, 24 Mar 2023 14:12:12 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 1319. Number of Operations to Make Network Connected - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-1319-Number-of-Operations-to-Make-Network-Connected-Java-%EC%9E%91%EC%84%B1%EC%A4%91</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/number-of-operations-to-make-network-connected/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/number-of-operations-to-make-network-connected/description/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1679561217227&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;Number of Operations to Make Network Connected - LeetCode&quot; data-og-description=&quot;Can you solve this real interview question? Number of Operations to Make Network Connected - There are n computers numbered from 0 to n - 1 connected by ethernet cables connections forming a network where connections[i] = [ai, bi] represents a connection b&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/number-of-operations-to-make-network-connected/description/&quot; data-og-url=&quot;https://leetcode.com/problems/number-of-operations-to-make-network-connected/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/OtheK/hyR1ZOgi8c/TzhzfuvNtL9o54P9vxevC0/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/cDHKRj/hyR1VykYVD/h0BWbwjDpSkQXyaOlqFdn1/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222,https://scrap.kakaocdn.net/dn/OIiiu/hyR19wAYmu/ZCyUcyXlHk11CdlErKOPRK/img.png?width=878&amp;amp;height=226&amp;amp;face=0_0_878_226&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/number-of-operations-to-make-network-connected/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/number-of-operations-to-make-network-connected/description/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/OtheK/hyR1ZOgi8c/TzhzfuvNtL9o54P9vxevC0/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/cDHKRj/hyR1VykYVD/h0BWbwjDpSkQXyaOlqFdn1/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222,https://scrap.kakaocdn.net/dn/OIiiu/hyR19wAYmu/ZCyUcyXlHk11CdlErKOPRK/img.png?width=878&amp;amp;height=226&amp;amp;face=0_0_878_226');&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;Number of Operations to Make Network Connected - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Can you solve this real interview question? Number of Operations to Make Network Connected - There are n computers numbered from 0 to n - 1 connected by ethernet cables connections forming a network where connections[i] = [ai, bi] represents a connection b&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;There are&lt;span&gt;&amp;nbsp;&lt;/span&gt;n&lt;span&gt;&amp;nbsp;&lt;/span&gt;computers numbered from&lt;span&gt;&amp;nbsp;&lt;/span&gt;0&lt;span&gt;&amp;nbsp;&lt;/span&gt;to&lt;span&gt;&amp;nbsp;&lt;/span&gt;n - 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;connected by ethernet cables&lt;span&gt;&amp;nbsp;&lt;/span&gt;connections&lt;span&gt;&amp;nbsp;&lt;/span&gt;forming a network where&lt;span&gt;&amp;nbsp;&lt;/span&gt;connections[i] = [ai, bi]&lt;span&gt;&amp;nbsp;&lt;/span&gt;represents a connection between computers&lt;span&gt;&amp;nbsp;&lt;/span&gt;ai&lt;span&gt;&amp;nbsp;&lt;/span&gt;and&lt;span&gt;&amp;nbsp;&lt;/span&gt;bi. Any computer can reach any other computer directly or indirectly through the network.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;You are given an initial computer network&lt;span&gt;&amp;nbsp;&lt;/span&gt;connections. You can extract certain cables between two directly connected computers, and place them between any pair of disconnected computers to make them directly connected.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Return&lt;span&gt;&amp;nbsp;&lt;/span&gt;the minimum number of times you need to do this in order to make all the computers connected. If it is not possible, return&lt;span&gt;&amp;nbsp;&lt;/span&gt;-1.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 1:&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;759&quot; data-origin-height=&quot;224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MeXlP/btr5BLJ0ypL/IaUG0zwq6TLRk3pFqp0SY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MeXlP/btr5BLJ0ypL/IaUG0zwq6TLRk3pFqp0SY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MeXlP/btr5BLJ0ypL/IaUG0zwq6TLRk3pFqp0SY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMeXlP%2Fbtr5BLJ0ypL%2FIaUG0zwq6TLRk3pFqp0SY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;759&quot; height=&quot;224&quot; data-origin-width=&quot;759&quot; data-origin-height=&quot;224&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Input: n = 4, connections = [[0,1],[0,2],[1,2]]
Output: 1
Explanation: Remove cable between computer 1 and 2 and place between computers 1 and 3.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmcAuf/btr5ABaiJ3y/trWzeWCEdMpaam4G6Q0Ro1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmcAuf/btr5ABaiJ3y/trWzeWCEdMpaam4G6Q0Ro1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmcAuf/btr5ABaiJ3y/trWzeWCEdMpaam4G6Q0Ro1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmcAuf%2Fbtr5ABaiJ3y%2FtrWzeWCEdMpaam4G6Q0Ro1%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;878&quot; height=&quot;226&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;226&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Input: n = 6, connections = [[0,1],[0,2],[0,3],[1,2],[1,3]]
Output: 2
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 3:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Input: n = 6, connections = [[0,1],[0,2],[0,3],[1,2]]
Output: -1
Explanation: There are not enough cables.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1 &amp;lt;= n &amp;lt;= 105&lt;/li&gt;
&lt;li&gt;1 &amp;lt;= connections.length &amp;lt;= min(n * (n - 1) / 2, 105)&lt;/li&gt;
&lt;li&gt;connections[i].length == 2&lt;/li&gt;
&lt;li&gt;0 &amp;lt;= ai, bi &amp;lt; n&lt;/li&gt;
&lt;li&gt;ai != bi&lt;/li&gt;
&lt;li&gt;There are no repeated connections.&lt;/li&gt;
&lt;li&gt;No two computers are connected by more than one cable.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0부터 n번까지의 컴퓨터가 있고 각 컴퓨터간의 연결 관계를 나타내는 2차원 배열 connections가 주어질 때 모든 컴퓨터가 연결 되기 위해서 케이블을 옮기는 과정의 최소 횟수를 구하는 문제이다. 만약 모든 컴퓨터를 연결하는 것이 불가능하다면 -1를 return한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제에서 어떤 케이블을 어디에서 어디로 옮겨야 하는지는 크게 중요하지 않다.&lt;br /&gt;n개의 노드를 모두 연결 시키기 위해서는 최소 n - 1개의 간선이 필요하다. 그렇기 때문에 만약 케이블의 개수를 나타내는 connections 배열의 길이가 n - 1보다 작은 경우에는 모든 컴퓨터를 연결하는 것이 불가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 케이블의 개수가 n - 1개 이상이라면 모든 컴퓨터를 연결하는 것이 가능하고 몇 번의 케이블 이동이 필요한지는 연결되어있지 않은 노드들의 개수만 파악하면 된다. 즉 비연결 그래프안에서 연결 그래프가 몇개나 있는지 탐색하는 것으로 생각하면 쉽게 풀이할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 탐색을 위해 사용할 변수를 선언해준다.&lt;br /&gt;graph는 각 노드간의 연결관계를 저장할 리스트 변수이고 visited는 특정 노드에 방문을 했는지 여부를 저장하기 위한 배열이다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1679619053127&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;List&amp;lt;ArrayList&amp;lt;Integer&amp;gt;&amp;gt; graph = new ArrayList&amp;lt;&amp;gt;();
boolean[] visited;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;케이블의 개수가 n - 1개보다 적다면 연결이 불가능하므로 바로 -1을 return 해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1679619129454&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// n개의 컴퓨터를 모두 연결하기 위한 케이블의 최소 개수는 n - 1개
// 케이블의 개수가 n - 1개보다 적다면 연결이 불가하므로 -1을 return
if(connections.length &amp;lt; n - 1) return answer;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;visited와 graph 변수를 각각 초기화 해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1679619161623&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 각 노드의 방문 여부를 저장할 배열
visited = new boolean[n];

// 각 컴퓨터별 노드 생성
for(int i = 0; i &amp;lt; n; i++) {
    graph.add(new ArrayList&amp;lt;&amp;gt;());
}

// 각 케이블의 연결 관계를 저장
for(int[] connection : connections) {
    graph.get(connection[0]).add(connection[1]);
    graph.get(connection[1]).add(connection[0]);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 노드를 순회하며 방문 여부를 탐색하고 현재 노드와 연결된 모든 노드를 방문하며 방문 여부를 업데이트 한다.&lt;br /&gt;만약 현재 노드가 처음 방문한 노드인 경우에는 다른 노드와 연결되어있지 않았던 경우이므로 정답 카운트를 증가시켜준다. 단. 최초 탐색인 경우에는 항상 방문 여부가 false로 시작하므로 정답 카운트 변수는 -1부터 시작한다.&lt;/p&gt;
&lt;pre id=&quot;code_1679619177959&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int answer = -1;

// 각 노드를 탐색
for(int i = 0; i &amp;lt; n; i++) {
    // 처음 방문 한 노드인 경우 다른 노드와 연결되어 있지 않았던 경우이므로 정답 카운트 증가
    // 단, 최초 탐색인 경우 항상 방문 여부가 false이므로 정답 카운트는 -1부터 시작
    // 현재 노드는 방문 처리하고 현재 노드와 연결된 모든 노드 탐색
    if(!visited[i]) {
        answer++;
        visited[i] = true;
        dfs(i);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 노드와 연결되어있는 다른 노드들을 탐색하는데는 다음 함수를 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1679619439363&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public void dfs(int node) {
    // 현재 노드와 연결되어 있는 이웃 노드 탐색
    for(int neighbor : graph.get(node)) {
        // 처음 방문하는 노드인 경우 방문여부를 true로 바꾸고 다음 노드 탐색
        if(!visited[neighbor]) {
            visited[neighbor] = true;
            dfs(neighbor);
        }
    }
}&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;최종적으로 구해진 정답을 return 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1679619473667&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;return answer;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1679561241230&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    List&amp;lt;ArrayList&amp;lt;Integer&amp;gt;&amp;gt; graph = new ArrayList&amp;lt;&amp;gt;();
    boolean[] visited;

    public int makeConnected(int n, int[][] connections) {
        int answer = -1;

        // n개의 컴퓨터를 모두 연결하기 위한 케이블의 최소 개수는 n - 1개
        // 케이블의 개수가 n - 1개보다 적다면 연결이 불가하므로 -1을 return
        if(connections.length &amp;lt; n - 1) return answer;

        // 각 노드의 방문 여부를 저장할 배열
        visited = new boolean[n];
        
        // 각 컴퓨터별 노드 생성
        for(int i = 0; i &amp;lt; n; i++) {
            graph.add(new ArrayList&amp;lt;&amp;gt;());
        }
        
        // 각 케이블의 연결 관계를 저장
        for(int[] connection : connections) {
            graph.get(connection[0]).add(connection[1]);
            graph.get(connection[1]).add(connection[0]);
        }
        
        // 각 노드를 탐색
        for(int i = 0; i &amp;lt; n; i++) {
            // 처음 방문 한 노드인 경우 다른 노드와 연결되어 있지 않았던 경우이므로 정답 카운트 증가
            // 단, 최초 탐색인 경우 항상 방문 여부가 false이므로 정답 카운트는 -1부터 시작
            // 현재 노드는 방문 처리하고 현재 노드와 연결된 모든 노드 탐색
            if(!visited[i]) {
                answer++;
                visited[i] = true;
                dfs(i);
            }
        }

        return answer;
    }

    public void dfs(int node) {
        // 현재 노드와 연결되어 있는 이웃 노드 탐색
        for(int neighbor : graph.get(node)) {
            // 처음 방문하는 노드인 경우 방문여부를 true로 바꾸고 다음 노드 탐색
            if(!visited[neighbor]) {
                visited[neighbor] = true;
                dfs(neighbor);
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>graph</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>그래프</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>자바</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/145</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-1319-Number-of-Operations-to-Make-Network-Connected-Java-%EC%9E%91%EC%84%B1%EC%A4%91#entry145comment</comments>
      <pubDate>Fri, 24 Mar 2023 09:58:04 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 2348. Number of Zero-Filled Subarrays - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-2348-Number-of-Zero-Filled-Subarrays-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/number-of-zero-filled-subarrays/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/number-of-zero-filled-subarrays/description/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1679373032897&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;Number of Zero-Filled Subarrays - LeetCode&quot; data-og-description=&quot;Can you solve this real interview question? Number of Zero-Filled Subarrays - Given an integer array nums, return the number of subarrays filled with 0. A subarray is a contiguous non-empty sequence of elements within an array. &amp;nbsp; Example 1: Input: nums = &quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/number-of-zero-filled-subarrays/description/&quot; data-og-url=&quot;https://leetcode.com/problems/number-of-zero-filled-subarrays/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/G8REh/hyRY8FHUCX/KGVzrLSapSit0SuHx1kFKk/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/zYx4G/hyRY5vrDWP/lleVQrwC7pSXyElppWp2Bk/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/number-of-zero-filled-subarrays/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/number-of-zero-filled-subarrays/description/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/G8REh/hyRY8FHUCX/KGVzrLSapSit0SuHx1kFKk/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/zYx4G/hyRY5vrDWP/lleVQrwC7pSXyElppWp2Bk/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222');&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;Number of Zero-Filled Subarrays - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Can you solve this real interview question? Number of Zero-Filled Subarrays - Given an integer array nums, return the number of subarrays filled with 0. A subarray is a contiguous non-empty sequence of elements within an array. &amp;nbsp; Example 1: Input: nums =&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;Given&amp;nbsp;an&amp;nbsp;integer&amp;nbsp;array&amp;nbsp;nums,&amp;nbsp;return&amp;nbsp;the&amp;nbsp;number&amp;nbsp;of&amp;nbsp;&lt;b&gt;&lt;i&gt;subarrays&amp;nbsp;&lt;/i&gt;&lt;/b&gt;filled&amp;nbsp;with&amp;nbsp;0. &lt;br /&gt;&lt;br /&gt;A&amp;nbsp;subarray&amp;nbsp;is&amp;nbsp;a&amp;nbsp;contiguous&amp;nbsp;non-empty&amp;nbsp;sequence&amp;nbsp;of&amp;nbsp;elements&amp;nbsp;within&amp;nbsp;an&amp;nbsp;array.&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;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679373075044&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: nums = [1,3,0,0,2,0,0,4]
Output: 6
Explanation: 
There are 4 occurrences of [0] as a subarray.
There are 2 occurrences of [0,0] as a subarray.
There is no occurrence of a subarray with a size more than 2 filled with 0. Therefore, we return 6.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679373089732&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: nums = [0,0,0,2,0,0]
Output: 9
Explanation:
There are 5 occurrences of [0] as a subarray.
There are 3 occurrences of [0,0] as a subarray.
There is 1 occurrence of [0,0,0] as a subarray.
There is no occurrence of a subarray with a size more than 3 filled with 0. Therefore, we return 9.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 3:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679373095372&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: nums = [2,10,2019]
Output: 0
Explanation: There is no subarray filled with 0. Therefore, we return 0.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1 &amp;lt;= nums.length &amp;lt;= 105&lt;/li&gt;
&lt;li&gt;-109&amp;nbsp;&amp;lt;=&amp;nbsp;nums[i]&amp;nbsp;&amp;lt;=&amp;nbsp;109&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-109 부터 109 까지의 정수로 이루어진 배열 nums가 주어질 때 0으로 채워진 부분배열의 총 개수를 구하는 문제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;길이가 N인 배열의 부분배열의 개수는 1부터 N까지의 합을 구하는 것과 같다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 87px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;배열&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;부분배열의 개수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;[0]&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;[0, 0]&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;[0, 0, 0]&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 16px;&quot;&gt;[0, 0, 0, 0]&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 16px;&quot;&gt;10&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;따라서 nums 배열의 요소를 순차적으로 탐색하며 0으로 이루어진 부분배열의 길이를 구해가며 그 길이를 정답에 계속 더해나간다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1679373032554&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public long zeroFilledSubarray(int[] nums) {
        long answer = 0;

        // 0으로 채워진 배열의 길이
        long length = 0;
        
        // nums 배열의 모든 요소 탐색
        for(int i = 0; i &amp;lt; nums.length; i++) {
            // 현재 탐색 요소가 0인 경우
            // 0으로 채워진 배열의 길이 증가 및 길이만큼 정답 카운트 증가
            if(nums[i] == 0) {
                length++;
                answer += length;
            }
            // 현재 탐색 요소가 0이 아닌 경우 0으로 채워진 배열의 길이 초기화
            else length = 0;
        }

        return answer;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>자바</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/144</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-2348-Number-of-Zero-Filled-Subarrays-Java#entry144comment</comments>
      <pubDate>Tue, 21 Mar 2023 13:36:51 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 605. Can Place Flowers - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-605-Can-Place-Flowers-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/can-place-flowers/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/can-place-flowers/description/&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;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;You&amp;nbsp;have&amp;nbsp;a&amp;nbsp;long&amp;nbsp;flowerbed&amp;nbsp;in&amp;nbsp;which&amp;nbsp;some&amp;nbsp;of&amp;nbsp;the&amp;nbsp;plots&amp;nbsp;are&amp;nbsp;planted,&amp;nbsp;and&amp;nbsp;some&amp;nbsp;are&amp;nbsp;not.&amp;nbsp;However,&amp;nbsp;flowers&amp;nbsp;cannot&amp;nbsp;be&amp;nbsp;planted&amp;nbsp;in&amp;nbsp;&lt;b&gt;adjacent&amp;nbsp;&lt;/b&gt;plots. &lt;br /&gt;&lt;br /&gt;Given&amp;nbsp;an&amp;nbsp;integer&amp;nbsp;array&amp;nbsp;flowerbed&amp;nbsp;containing&amp;nbsp;0's&amp;nbsp;and&amp;nbsp;1's,&amp;nbsp;where&amp;nbsp;0&amp;nbsp;means&amp;nbsp;empty&amp;nbsp;and&amp;nbsp;1&amp;nbsp;means&amp;nbsp;not&amp;nbsp;empty,&amp;nbsp;and&amp;nbsp;an&amp;nbsp;integer&amp;nbsp;n,&amp;nbsp;return&amp;nbsp;if&amp;nbsp;n&amp;nbsp;new&amp;nbsp;flowers&amp;nbsp;can&amp;nbsp;be&amp;nbsp;planted&amp;nbsp;in&amp;nbsp;the&amp;nbsp;flowerbed&amp;nbsp;without&amp;nbsp;violating&amp;nbsp;the&amp;nbsp;no-adjacent-flowers&amp;nbsp;rule.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679319208339&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: flowerbed = [1,0,0,0,1], n = 1
Output: true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679319214547&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input: flowerbed = [1,0,0,0,1], n = 2
Output: 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;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1 &amp;lt;= flowerbed.length &amp;lt;= 2 * 104&lt;/li&gt;
&lt;li&gt;flowerbed[i] is 0 or 1.&lt;/li&gt;
&lt;li&gt;There are no two adjacent flowers in flowerbed.&lt;/li&gt;
&lt;li&gt;0&amp;nbsp;&amp;lt;=&amp;nbsp;n&amp;nbsp;&amp;lt;=&amp;nbsp;flowerbed.length&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;꽃이 심어져 있거나 비어있는 화단의 배열 flowerbed와 심어야할 꽃의 개수 n이 주어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연속한 화단에 꽃을 심을 수 없다고 할 때 현재 화단에 주어진 개수 만큼의 꽃을 심을 수 있는지 구하는 문제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 심어야 할 꽃이 없는 경우에는 바로 true를 return해 준다.&lt;/p&gt;
&lt;pre id=&quot;code_1679318523789&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 심어야 할 꽃이 없는 경우 바로 true를 return
if(n == 0) return true;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 화단을 차례대로 탐색한다.&lt;br /&gt;현재 화단이 비어있는 경우는 다음 세가지 경우에 따라 꽃을 심을 수 있는지 없는지 체크한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 첫 번째 화단인 경우&lt;br /&gt;flowerbed의 길이가 1이거나 오른쪽 화단이 비어있는 경우 꽃을 심을 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1679318649916&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 첫 화단인 경우
if(i == 0) {
    // flowerbed의 길이가 1이거나 오른쪽 화단이 비어있는 경우
    if(flowerbed.length == 1 || flowerbed[i + 1] == 0) {
        // 현재 화단에 꽃을 심음
        flowerbed[i] = 1;
        // 심어야할 꽃의 수 감소
        n--;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 마지막 화단인 경우&lt;br /&gt;왼쪽 화단이 비어있는 겨웅 꽃을 심을 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1679318674116&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 마지막 화단인 경우
else if(i == flowerbed.length - 1) {
    // 왼쪽 화단이 비어있는 경우
    if(flowerbed[i - 1] == 0) {
    /// 현재 화단에 꽃을 심음
        flowerbed[i] = 1;
        // 심어야할 꽃의 수 감소
        n--;
    }
}&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;3. 나머지 화단인 경우&lt;br /&gt;좌우의 화단이 모두 비어있는 경우 꽃을 심을 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1679318707228&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 나머지 화단인 경우
else {
    // 좌우의 화단이 모두 비어있는경우
    if(flowerbed[i - 1] == 0 &amp;amp;&amp;amp; flowerbed[i + 1] == 0) {
        // 현재 화단에 꽃을 심음
        flowerbed[i] = 1;
        // 심어야할 꽃의 수 감소
        n--;
    }
}&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;현재 화단을 탐색한 후 심어야 할 꽃의 수가 0이 되는 경우 true를 return한다.&lt;/p&gt;
&lt;pre id=&quot;code_1679318751812&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 심어야할 꽃의 수가 0이 되는 경우 true를 return
if(n == 0) return true;&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;모든 탐색이 종료된 후 남은 꽃의 수가 0인 경우에는 true, 0보다 큰 경우에는 false를 return 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1679318824628&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 남은 꽃의 수가 0인 경우 true, 0보다 큰 경우 false를 return
return (n == 0) ? true : false;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1679318355509&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public boolean canPlaceFlowers(int[] flowerbed, int n) {
        // 심어야 할 꽃이 없는 경우 바로 true를 return
        if(n == 0) return true;

        for(int i = 0; i &amp;lt; flowerbed.length; i++) {
            // 현재 화단이 비어있는 경우
            if(flowerbed[i] == 0){
                // 첫 화단인 경우
                if(i == 0) {
                    // flowerbed의 길이가 1이거나 오른쪽 화단이 비어있는 경우
                    if(flowerbed.length == 1 || flowerbed[i + 1] == 0) {
                        // 현재 화단에 꽃을 심음
                        flowerbed[i] = 1;
                        // 심어야할 꽃의 수 감소
                        n--;
                    }
                }
                // 마지막 화단인 경우
                else if(i == flowerbed.length - 1) {
                    // 왼쪽 화단이 비어있는 경우
                    if(flowerbed[i - 1] == 0) {
                    /// 현재 화단에 꽃을 심음
                        flowerbed[i] = 1;
                        // 심어야할 꽃의 수 감소
                        n--;
                    }
                }
                // 나머지 화단인 경우
                else {
                    // 좌우의 화단이 모두 비어있는경우
                    if(flowerbed[i - 1] == 0 &amp;amp;&amp;amp; flowerbed[i + 1] == 0) {
                        // 현재 화단에 꽃을 심음
                        flowerbed[i] = 1;
                        // 심어야할 꽃의 수 감소
                        n--;
                    }
                }
            }
            // 심어야할 꽃의 수가 0이 되는 경우 true를 return
            if(n == 0) return true;
        }

        // 남은 꽃의 수가 0인 경우 true, 0보다 큰 경우 false를 return
        return (n == 0) ? true : false;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>자바</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/143</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-605-Can-Place-Flowers-Java#entry143comment</comments>
      <pubDate>Mon, 20 Mar 2023 22:27:12 +0900</pubDate>
    </item>
    <item>
      <title>[Programmers] 점프와 순간 이동 - Java</title>
      <link>https://hyojun.tistory.com/entry/Programmers-%EC%A0%90%ED%94%84%EC%99%80-%EC%88%9C%EA%B0%84-%EC%9D%B4%EB%8F%99-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12980&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/12980&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1679014327101&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;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12980&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cGDDok/hyRXrcyT0c/BK8efcz0MM8f7sUYboBqwK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bj9F2k/hyRXAtN95U/keYYFKPZffJJywJ3KCRKHk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12980&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12980&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cGDDok/hyRXrcyT0c/BK8efcz0MM8f7sUYboBqwK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bj9F2k/hyRXAtN95U/keYYFKPZffJJywJ3KCRKHk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;b&gt;문제&amp;nbsp;설명&lt;/b&gt; &lt;br /&gt;OO 연구소는 한 번에 K 칸을 앞으로 점프하거나, (현재까지 온 거리) x 2 에 해당하는 위치로 순간이동을 할 수 있는 특수한 기능을 가진 아이언 슈트를 개발하여 판매하고 있습니다. 이 아이언 슈트는 건전지로 작동되는데, 순간이동을 하면 건전지 사용량이 줄지 않지만, 앞으로 K 칸을 점프하면 K 만큼의 건전지 사용량이 듭니다. 그러므로 아이언 슈트를 착용하고 이동할 때는 순간 이동을 하는 것이 더 효율적입니다. 아이언 슈트 구매자는 아이언 슈트를 착용하고 거리가 N 만큼 떨어져 있는 장소로 가려고 합니다. 단, 건전지 사용량을 줄이기 위해 점프로 이동하는 것은 최소로 하려고 합니다. 아이언 슈트 구매자가 이동하려는 거리 N이 주어졌을 때, 사용해야 하는 건전지 사용량의 최솟값을 return하는 solution 함수를 만들어 주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;예를&amp;nbsp;들어&amp;nbsp;거리가&amp;nbsp;5만큼&amp;nbsp;떨어져&amp;nbsp;있는&amp;nbsp;장소로&amp;nbsp;가려고&amp;nbsp;합니다. &lt;br /&gt;아이언 슈트를 입고 거리가 5만큼 떨어져 있는 장소로 갈 수 있는 경우의 수는 여러 가지입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;처음 위치 0 에서 5 칸을 앞으로 점프하면 바로 도착하지만, 건전지 사용량이 5 만큼 듭니다.&lt;/li&gt;
&lt;li&gt;처음 위치 0 에서 2 칸을 앞으로 점프한 다음 순간이동 하면 (현재까지 온 거리 : 2) x 2에 해당하는 위치로 이동할 수 있으므로 위치 4로 이동합니다. 이때 1 칸을 앞으로 점프하면 도착하므로 건전지 사용량이 3 만큼 듭니다.&lt;/li&gt;
&lt;li&gt;처음 위치 0 에서 1 칸을 앞으로 점프한 다음 순간이동 하면 (현재까지 온 거리 : 1) x 2에 해당하는 위치로 이동할 수 있으므로 위치 2로 이동됩니다. 이때 다시 순간이동 하면 (현재까지 온 거리 : 2) x 2 만큼 이동할 수 있으므로 위치 4로 이동합니다. 이때 1 칸을 앞으로 점프하면 도착하므로 건전지 사용량이 2 만큼 듭니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 3가지 경우 거리가 5만큼 떨어져 있는 장소로 가기 위해서 3번째 경우가 건전지 사용량이 가장 적으므로 답은 2가 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;제한 사항&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;숫자 N: 1 이상 10억 이하의 자연수&lt;/li&gt;
&lt;li&gt;숫자&amp;nbsp;K:&amp;nbsp;1&amp;nbsp;이상의&amp;nbsp;자연수&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;입출력 예&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;N&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;Result&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;5000&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;입출력 예 설명&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입출력&amp;nbsp;예&amp;nbsp;#1 &lt;br /&gt;위의&amp;nbsp;예시와&amp;nbsp;같습니다. &lt;br /&gt;&lt;br /&gt;입출력&amp;nbsp;예&amp;nbsp;#2 &lt;br /&gt;처음&amp;nbsp;위치&amp;nbsp;0&amp;nbsp;에서&amp;nbsp;1&amp;nbsp;칸을&amp;nbsp;앞으로&amp;nbsp;점프한&amp;nbsp;다음&amp;nbsp;순간이동&amp;nbsp;하면&amp;nbsp;(현재까지&amp;nbsp;온&amp;nbsp;거리&amp;nbsp;:&amp;nbsp;1)&amp;nbsp;x&amp;nbsp;2에&amp;nbsp;해당하는&amp;nbsp;위치로&amp;nbsp;이동할&amp;nbsp;수&amp;nbsp;있으므로&amp;nbsp;위치&amp;nbsp;2로&amp;nbsp;이동합니다.&amp;nbsp;이때&amp;nbsp;1&amp;nbsp;칸을&amp;nbsp;앞으로&amp;nbsp;점프하면&amp;nbsp;위치3으로&amp;nbsp;이동합니다.&amp;nbsp;이때&amp;nbsp;다시&amp;nbsp;순간이동&amp;nbsp;하면&amp;nbsp;(현재까지&amp;nbsp;온&amp;nbsp;거리&amp;nbsp;:&amp;nbsp;3)&amp;nbsp;x&amp;nbsp;2&amp;nbsp;이동할&amp;nbsp;수&amp;nbsp;있으므로&amp;nbsp;위치&amp;nbsp;6에&amp;nbsp;도착합니다.&amp;nbsp;이&amp;nbsp;경우가&amp;nbsp;건전지&amp;nbsp;사용량이&amp;nbsp;가장&amp;nbsp;적으므로&amp;nbsp;2를&amp;nbsp;반환해주면&amp;nbsp;됩니다. &lt;br /&gt;&lt;br /&gt;입출력&amp;nbsp;예&amp;nbsp;#3 &lt;br /&gt;위와&amp;nbsp;같은&amp;nbsp;방식으로&amp;nbsp;합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;점프를 하여 이동하는 경우에만 건전지를 사용하므로 최대한 점프를 하지 않고 순간이동으로만 이동을 하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순간이동을 하는 경우에는 현재 거리의 두 배만큼 이동을 하기 때문에 순간이동을 하면 항상 짝수위치에만 도착하게 된다.&lt;br /&gt;따라서 도착 지점부터 반대로 탐색하며 현재 위치가 짝수인 경우 그 절반의 위치로 순간이동 하고 홀수인 경우에는 한 칸만 점프로 이동하여 거리가 0이 될 때까지 반복하며 탐색한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1679014508851&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Solution {
    public int solution(int n) {
        int ans = 0;

        // 도착 지점부터 반대로 탐색
        // 거리가 0이 될 때까지 반복
        while(n &amp;gt; 0) {
            // 현재 위치가 짝수인 경우 절반위치로 순간이동
            if(n % 2 == 0) {
                n /= 2;
            }
            // 현재 위치가 홀수인 경우 한 칸 전으로 점프, 건전지 사용량 1 증가
            else {
                n--;
                ans++;
            }
        }

        return ans;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/프로그래머스</category>
      <category>Java</category>
      <category>programmers</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>자바</category>
      <category>프로그래머스</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/142</guid>
      <comments>https://hyojun.tistory.com/entry/Programmers-%EC%A0%90%ED%94%84%EC%99%80-%EC%88%9C%EA%B0%84-%EC%9D%B4%EB%8F%99-Java#entry142comment</comments>
      <pubDate>Fri, 17 Mar 2023 09:58:13 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 211. Design Add and Search Words Data Structure - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-211-Design-Add-and-Search-Words-Data-Structure-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/design-add-and-search-words-data-structure/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/design-add-and-search-words-data-structure/description/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1677421272148&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;Design Add and Search Words Data Structure - LeetCode&quot; data-og-description=&quot;Can you solve this real interview question? Design Add and Search Words Data Structure - Design a data structure that supports adding new words and finding if a string matches any previously added string. Implement the WordDictionary class: * WordDictionar&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/design-add-and-search-words-data-structure/description/&quot; data-og-url=&quot;https://leetcode.com/problems/design-add-and-search-words-data-structure/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/OtvBB/hyRKVTsSCt/xvixud6whZ8rQmb5n5RNL1/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/b35A8k/hyRKKxCEY5/rbrZHJkvoCm4Msh28jhyg0/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/design-add-and-search-words-data-structure/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/design-add-and-search-words-data-structure/description/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/OtvBB/hyRKVTsSCt/xvixud6whZ8rQmb5n5RNL1/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/b35A8k/hyRKKxCEY5/rbrZHJkvoCm4Msh28jhyg0/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222');&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;Design Add and Search Words Data Structure - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Can you solve this real interview question? Design Add and Search Words Data Structure - Design a data structure that supports adding new words and finding if a string matches any previously added string. Implement the WordDictionary class: * WordDictionar&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;Design a data structure that supports adding new words and finding if a string matches any previously added string.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Implement the&lt;span&gt;&amp;nbsp;&lt;/span&gt;WordDictionary&lt;span&gt;&amp;nbsp;&lt;/span&gt;class:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;WordDictionary()&amp;nbsp;Initializes the object.&lt;/li&gt;
&lt;li&gt;void addWord(word)&lt;span&gt;&amp;nbsp;&lt;/span&gt;Adds&lt;span&gt;&amp;nbsp;&lt;/span&gt;word&lt;span&gt;&amp;nbsp;&lt;/span&gt;to the data structure, it can be matched later.&lt;/li&gt;
&lt;li&gt;bool search(word)&amp;nbsp;Returns&lt;span&gt;&amp;nbsp;&lt;/span&gt;true&lt;span&gt;&amp;nbsp;&lt;/span&gt;if there is any string in the data structure that matches&lt;span&gt;&amp;nbsp;&lt;/span&gt;word&amp;nbsp;or&lt;span&gt;&amp;nbsp;&lt;/span&gt;false&lt;span&gt;&amp;nbsp;&lt;/span&gt;otherwise.&lt;span&gt;&amp;nbsp;&lt;/span&gt;word&lt;span&gt;&amp;nbsp;&lt;/span&gt;may contain dots&lt;span&gt;&amp;nbsp;&lt;/span&gt;'.'&lt;span&gt;&amp;nbsp;&lt;/span&gt;where dots can be matched with any letter.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;Input
[&quot;WordDictionary&quot;,&quot;addWord&quot;,&quot;addWord&quot;,&quot;addWord&quot;,&quot;search&quot;,&quot;search&quot;,&quot;search&quot;,&quot;search&quot;]
[[],[&quot;bad&quot;],[&quot;dad&quot;],[&quot;mad&quot;],[&quot;pad&quot;],[&quot;bad&quot;],[&quot;.ad&quot;],[&quot;b..&quot;]]
Output
[null,null,null,null,false,true,true,true]

Explanation
WordDictionary wordDictionary = new WordDictionary();
wordDictionary.addWord(&quot;bad&quot;);
wordDictionary.addWord(&quot;dad&quot;);
wordDictionary.addWord(&quot;mad&quot;);
wordDictionary.search(&quot;pad&quot;); // return False
wordDictionary.search(&quot;bad&quot;); // return True
wordDictionary.search(&quot;.ad&quot;); // return True
wordDictionary.search(&quot;b..&quot;); // return True
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1 &amp;lt;= word.length &amp;lt;= 25&lt;/li&gt;
&lt;li&gt;word&lt;span&gt;&amp;nbsp;&lt;/span&gt;in&lt;span&gt;&amp;nbsp;&lt;/span&gt;addWord&lt;span&gt;&amp;nbsp;&lt;/span&gt;consists of lowercase English letters.&lt;/li&gt;
&lt;li&gt;word&lt;span&gt;&amp;nbsp;&lt;/span&gt;in&lt;span&gt;&amp;nbsp;&lt;/span&gt;search&lt;span&gt;&amp;nbsp;&lt;/span&gt;consist of&lt;span&gt;&amp;nbsp;&lt;/span&gt;'.'&lt;span&gt;&amp;nbsp;&lt;/span&gt;or lowercase English letters.&lt;/li&gt;
&lt;li&gt;There will be at most&lt;span&gt;&amp;nbsp;&lt;/span&gt;3&lt;span&gt;&amp;nbsp;&lt;/span&gt;dots in&lt;span&gt;&amp;nbsp;&lt;/span&gt;word&lt;span&gt;&amp;nbsp;&lt;/span&gt;for&lt;span&gt;&amp;nbsp;&lt;/span&gt;search&lt;span&gt;&amp;nbsp;&lt;/span&gt;queries.&lt;/li&gt;
&lt;li&gt;At most&lt;span&gt;&amp;nbsp;&lt;/span&gt;104&lt;span&gt;&amp;nbsp;&lt;/span&gt;calls will be made to&lt;span&gt;&amp;nbsp;&lt;/span&gt;addWord&lt;span&gt;&amp;nbsp;&lt;/span&gt;and&lt;span&gt;&amp;nbsp;&lt;/span&gt;search.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제에서 주어진 조건에 따라 단어를 저장하고 단어를 찾아내는 사전 프로그램을 작성하는 문제이다.&lt;br /&gt;바로 이전에 풀이했던 208. Implement Trie (Prefix Tree) 와 유사한 문제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hyojun.tistory.com/entry/LeetCode-208-Implement-Trie-Prefix-Tree-Java-%EC%9E%91%EC%84%B1%EC%A4%91&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://hyojun.tistory.com/entry/LeetCode-208-Implement-Trie-Prefix-Tree-Java-%EC%9E%91%EC%84%B1%EC%A4%91&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1677421713732&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[LeetCode] 208. Implement Trie (Prefix Tree) - Java&quot; data-og-description=&quot;https://leetcode.com/problems/implement-trie-prefix-tree/ Implement Trie (Prefix Tree) - LeetCode Can you solve this real interview question? Implement Trie (Prefix Tree) - A trie [https://en.wikipedia.org/wiki/Trie] (pronounced as &amp;quot;try&amp;quot;) or prefix tree is&quot; data-og-host=&quot;hyojun.tistory.com&quot; data-og-source-url=&quot;https://hyojun.tistory.com/entry/LeetCode-208-Implement-Trie-Prefix-Tree-Java-%EC%9E%91%EC%84%B1%EC%A4%91&quot; data-og-url=&quot;https://hyojun.tistory.com/entry/LeetCode-208-Implement-Trie-Prefix-Tree-Java-%EC%9E%91%EC%84%B1%EC%A4%91&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b6kzzQ/hyRKOfIDHs/okPYKdHukSuiZJhkATRkbk/img.png?width=599&amp;amp;height=468&amp;amp;face=0_0_599_468,https://scrap.kakaocdn.net/dn/CNZzs/hyRKLiYWpr/GZV4Bkk9zZWZ5teC46sqKk/img.png?width=599&amp;amp;height=468&amp;amp;face=0_0_599_468,https://scrap.kakaocdn.net/dn/6TGu8/hyRKONAohC/6c1SLAi6KMNBBYk7IC5Lv0/img.png?width=599&amp;amp;height=468&amp;amp;face=0_0_599_468&quot;&gt;&lt;a href=&quot;https://hyojun.tistory.com/entry/LeetCode-208-Implement-Trie-Prefix-Tree-Java-%EC%9E%91%EC%84%B1%EC%A4%91&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hyojun.tistory.com/entry/LeetCode-208-Implement-Trie-Prefix-Tree-Java-%EC%9E%91%EC%84%B1%EC%A4%91&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b6kzzQ/hyRKOfIDHs/okPYKdHukSuiZJhkATRkbk/img.png?width=599&amp;amp;height=468&amp;amp;face=0_0_599_468,https://scrap.kakaocdn.net/dn/CNZzs/hyRKLiYWpr/GZV4Bkk9zZWZ5teC46sqKk/img.png?width=599&amp;amp;height=468&amp;amp;face=0_0_599_468,https://scrap.kakaocdn.net/dn/6TGu8/hyRKONAohC/6c1SLAi6KMNBBYk7IC5Lv0/img.png?width=599&amp;amp;height=468&amp;amp;face=0_0_599_468');&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;[LeetCode] 208. Implement Trie (Prefix Tree) - Java&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;https://leetcode.com/problems/implement-trie-prefix-tree/ Implement Trie (Prefix Tree) - LeetCode Can you solve this real interview question? Implement Trie (Prefix Tree) - A trie [https://en.wikipedia.org/wiki/Trie] (pronounced as &quot;try&quot;) or prefix tree is&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hyojun.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 객체를 생성하고 단어를 추가하는 과정은 Implement Trie를 구현하는 과정과 동일하다.&lt;/p&gt;
&lt;pre id=&quot;code_1677421981467&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Node {
    // 현재 노드까지가 단어인지 아닌지 판단할 변수
    boolean isWord;
    // 현재 노드의 자식노드를 저장할 Map
    Map&amp;lt;Character, Node&amp;gt; children = new HashMap&amp;lt;&amp;gt;();
}

class WordDictionary {
    // 노드 변수 선언
    Node root;
    
    public WordDictionary() {
        // 새로운 루트 노드 생성
        root = new Node();
    }
    
    public void addWord(String word) {
        // 트리 최상위 노드
        Node node = root;

        // 문자열 끝까지 탐색
        for(int i = 0; i &amp;lt; word.length(); i++){
            // 현재 탐색중인 문자
            Character c = word.charAt(i);
            // 자식 노드에 현재 탐색중인 문자가 없는 경우
            if(!node.children.containsKey(c)){
                // 노드를 새로 생성하고 자식노드에 삽입
                node.children.put(c, new Node());
            } 

            // 노드를 갱신
            node = node.children.get(c);
            // 문자열을 끝까지 탐색한 경우 단어 여부 업데이트
            if(i == word.length() - 1){
                node.isWord = true;
            }
        }
    }&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;Implement Trie와 다른 점은 문자를 찾는 search 함수에서 문자가 알파벳이 아닌 '.' 이 주어질 수 있다는 점인데 '.'은 모든 알파벳에 대응될 수 있는 것으로 간주한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇기 때문에 '.'이 오는 경우 DFS를 통하여 모든 자식 노드들을 탐색해 볼수 있도록 search 함수만 약간의 수정을 해주도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DFS 탐색을 할 수 있도록 함수를 하나 생성해주고 현재 탐색중인 노드와, 찾고자 하는 단어, 그리고 현재 탐색중인 인덱스를 파라미터로 전달한다.&lt;/p&gt;
&lt;pre id=&quot;code_1677422049298&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; public boolean dfs(Node root, String word, int idx) {
 
 }&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;문자열을 끝까지 탐색한 경우 단어 여부에 따라 결과값을 return한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1677422111298&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 문자열을 끝까지 탐색한 경우 단어 여부에 따라 결과값을 return
if(idx == word.length()) return root.isWord;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후 현재 탐색중인 문자에 따라 두 가지 경우로 나누어 탐색을 진행한다.&lt;br /&gt;먼저 현재 탐색중인 문자가 '.'인 경우, 현재 노드의 자식노드들을 인덱스를 증가시키며 재귀탐색하여 true가 되는 경우가 존재한다면 true를 return한다.&lt;/p&gt;
&lt;pre id=&quot;code_1677422172602&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 현재 탐색중인 문자
Character c = word.charAt(idx);

// 현재 탐색중인 문자가 '.'인 경우
if(c == '.') {
    // 현재 노드의 자식노드들을 탐색하여 true가 되는 경우 true를 return
    for(Character key : root.children.keySet()) {
       if(dfs(root.children.get(key), word, idx + 1)) return true;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로 현재 탐색중인 문자가 알파벳인 경우, 자식노드에 현재 탐색중인 문자가 존재하는지 여부를 확인한다.&lt;br /&gt;만약 현재 탐색중인 문자가 존재하지 않는다면 false를 return하고, 탐색중인 문자가 존재한다면 마찬가지로 인덱스를 증가시키며 자식노드를 탐색한다.&lt;/p&gt;
&lt;pre id=&quot;code_1677422263588&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 현재 탐색중인 문자가 알파벳인 경우
else {
    // 자식노드에 현재 탐색중인 문자가 존재하지 않는 경우 false를 return
    if(root.children.get(c) == null) return false;
    // 자식노드에 현재 탐색중인 문자가 존재하는 경우 다음 레벨을 탐색
    return dfs(root.children.get(c), word, idx + 1);
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1677421278939&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Node {
    // 현재 노드까지가 단어인지 아닌지 판단할 변수
    boolean isWord;
    // 현재 노드의 자식노드를 저장할 Map
    Map&amp;lt;Character, Node&amp;gt; children = new HashMap&amp;lt;&amp;gt;();
}

class WordDictionary {
    // 노드 변수 선언
    Node root;
    
    public WordDictionary() {
        // 새로운 루트 노드 생성
        root = new Node();
    }
    
    public void addWord(String word) {
        // 트리 최상위 노드
        Node node = root;

        // 문자열 끝까지 탐색
        for(int i = 0; i &amp;lt; word.length(); i++){
            // 현재 탐색중인 문자
            Character c = word.charAt(i);
            // 자식 노드에 현재 탐색중인 문자가 없는 경우
            if(!node.children.containsKey(c)){
                // 노드를 새로 생성하고 자식노드에 삽입
                node.children.put(c, new Node());
            } 

            // 노드를 갱신
            node = node.children.get(c);
            // 문자열을 끝까지 탐색한 경우 단어 여부 업데이트
            if(i == word.length() - 1){
                node.isWord = true;
            }
        }
    }
    
    public boolean search(String word) {
        return dfs(root, word, 0);
    }
    
    public boolean dfs(Node root, String word, int idx) {
        // 문자열을 끝까지 탐색한 경우 단어 여부에 따라 결과값을 return
        if(idx == word.length()) return root.isWord;
        
        // 현재 탐색중인 문자
        Character c = word.charAt(idx);
        
        // 현재 탐색중인 문자가 '.'인 경우
        if(c == '.') {
            // 현재 노드의 자식노드들을 탐색하여 true가 되는 경우 true를 return
            for(Character key : root.children.keySet()) {
               if(dfs(root.children.get(key), word, idx + 1)) return true;
            }
        }
        // 현재 탐색중인 문자가 알파벳인 경우
        else {
            // 자식노드에 현재 탐색중인 문자가 존재하지 않는 경우 false를 return
            if(root.children.get(c) == null) return false;
            // 자식노드에 현재 탐색중인 문자가 존재하는 경우 다음 레벨을 탐색
            return dfs(root.children.get(c), word, idx + 1);
        }
        
        return false;
    }
}

/**
 * Your WordDictionary object will be instantiated and called as such:
 * WordDictionary obj = new WordDictionary();
 * obj.addWord(word);
 * boolean param_2 = obj.search(word);
 */&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>Design Add and Search Words Data Structure</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>prefix tree</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>자바</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/141</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-211-Design-Add-and-Search-Words-Data-Structure-Java#entry141comment</comments>
      <pubDate>Sun, 26 Feb 2023 23:37:58 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 208. Implement Trie (Prefix Tree) - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-208-Implement-Trie-Prefix-Tree-Java-%EC%9E%91%EC%84%B1%EC%A4%91</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/implement-trie-prefix-tree/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/implement-trie-prefix-tree/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1676447962508&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;Implement Trie (Prefix Tree) - LeetCode&quot; data-og-description=&quot;Can you solve this real interview question? Implement Trie (Prefix Tree) - A trie [https://en.wikipedia.org/wiki/Trie] (pronounced as &amp;quot;try&amp;quot;) or prefix tree is a tree data structure used to efficiently store and retrieve keys in a dataset of strings. There &quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/implement-trie-prefix-tree/&quot; data-og-url=&quot;https://leetcode.com/problems/implement-trie-prefix-tree/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eaiHaM/hyRCU8Djea/j4wAAjeSGv7MpneaThGVO1/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/btDNTv/hyRDVdNFbH/MvU7KIJrNr4DDCkNEsjHok/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/implement-trie-prefix-tree/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/implement-trie-prefix-tree/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eaiHaM/hyRCU8Djea/j4wAAjeSGv7MpneaThGVO1/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/btDNTv/hyRDVdNFbH/MvU7KIJrNr4DDCkNEsjHok/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222');&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;Implement Trie (Prefix Tree) - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Can you solve this real interview question? Implement Trie (Prefix Tree) - A trie [https://en.wikipedia.org/wiki/Trie] (pronounced as &quot;try&quot;) or prefix tree is a tree data structure used to efficiently store and retrieve keys in a dataset of strings. There&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;A&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Trie&quot;&gt;&lt;b&gt;trie&lt;/b&gt;&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(pronounced as &quot;try&quot;) or&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;prefix tree&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is a tree data structure used to efficiently store and retrieve keys in a dataset of strings. There are various applications of this data structure, such as autocomplete and spellchecker.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Implement the Trie class:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Trie()&lt;span&gt;&amp;nbsp;&lt;/span&gt;Initializes the trie object.&lt;/li&gt;
&lt;li&gt;void insert(String word)&lt;span&gt;&amp;nbsp;&lt;/span&gt;Inserts the string&lt;span&gt;&amp;nbsp;&lt;/span&gt;word&lt;span&gt;&amp;nbsp;&lt;/span&gt;into the trie.&lt;/li&gt;
&lt;li&gt;boolean search(String word)&lt;span&gt;&amp;nbsp;&lt;/span&gt;Returns&lt;span&gt;&amp;nbsp;&lt;/span&gt;true&lt;span&gt;&amp;nbsp;&lt;/span&gt;if the string&lt;span&gt;&amp;nbsp;&lt;/span&gt;word&lt;span&gt;&amp;nbsp;&lt;/span&gt;is in the trie (i.e., was inserted before), and&lt;span&gt;&amp;nbsp;&lt;/span&gt;false&lt;span&gt;&amp;nbsp;&lt;/span&gt;otherwise.&lt;/li&gt;
&lt;li&gt;boolean startsWith(String prefix)&lt;span&gt;&amp;nbsp;&lt;/span&gt;Returns&lt;span&gt;&amp;nbsp;&lt;/span&gt;true&lt;span&gt;&amp;nbsp;&lt;/span&gt;if there is a previously inserted string&lt;span&gt;&amp;nbsp;&lt;/span&gt;word&lt;span&gt;&amp;nbsp;&lt;/span&gt;that has the prefix&lt;span&gt;&amp;nbsp;&lt;/span&gt;prefix, and&lt;span&gt;&amp;nbsp;&lt;/span&gt;false&lt;span&gt;&amp;nbsp;&lt;/span&gt;otherwise.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;Input
[&quot;Trie&quot;, &quot;insert&quot;, &quot;search&quot;, &quot;search&quot;, &quot;startsWith&quot;, &quot;insert&quot;, &quot;search&quot;]
[[], [&quot;apple&quot;], [&quot;apple&quot;], [&quot;app&quot;], [&quot;app&quot;], [&quot;app&quot;], [&quot;app&quot;]]
Output
[null, null, true, false, true, null, true]

Explanation
Trie trie = new Trie();
trie.insert(&quot;apple&quot;);
trie.search(&quot;apple&quot;);   // return True
trie.search(&quot;app&quot;);     // return False
trie.startsWith(&quot;app&quot;); // return True
trie.insert(&quot;app&quot;);
trie.search(&quot;app&quot;);     // return True
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1 &amp;lt;= word.length, prefix.length &amp;lt;= 2000&lt;/li&gt;
&lt;li&gt;word&lt;span&gt;&amp;nbsp;&lt;/span&gt;and&lt;span&gt;&amp;nbsp;&lt;/span&gt;prefix&lt;span&gt;&amp;nbsp;&lt;/span&gt;consist only of lowercase English letters.&lt;/li&gt;
&lt;li&gt;At most&lt;span&gt;&amp;nbsp;&lt;/span&gt;3 * 104&lt;span&gt;&amp;nbsp;&lt;/span&gt;calls&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;in total&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;will be made to&lt;span&gt;&amp;nbsp;&lt;/span&gt;insert,&lt;span&gt;&amp;nbsp;&lt;/span&gt;search, and&lt;span&gt;&amp;nbsp;&lt;/span&gt;startsWith.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Trie ( prefix tree ) 자료구조는 문자열 데이터를 효율적으로 저장하고 찾는데 사용하는 트리 데이터 구조의 한 종류이다. 때문에 자동완성이나 맞춤법 검사등의 프로그램에 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주어진 조건에 따라서 Trie 구조를 이용한 문자열 검색기능을 만들어야하는 문제이다.&lt;br /&gt;구현 해야하는 클래스는 새로운 Trie를 생성하기위한 클래스 Trie, 단어 저장을 위한 insert, 단어 탐색을 위한 search, 주어진 문자로 시작하는 단어 탐색을 위한 startsWith이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 구현하고자 하는 Trie의 구조를 그림으로 표현해보면 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpuIgD/btrZsG9fdnL/i5PtgEL8EcaGg7li1NMrWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpuIgD/btrZsG9fdnL/i5PtgEL8EcaGg7li1NMrWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpuIgD/btrZsG9fdnL/i5PtgEL8EcaGg7li1NMrWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpuIgD%2FbtrZsG9fdnL%2Fi5PtgEL8EcaGg7li1NMrWk%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;599&quot; height=&quot;468&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;468&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 구조는 &quot;catch&quot;, &quot;cake&quot;, &quot;cafe&quot; 3개의 단어를 저장하고 있는 Trie 트리이다. &lt;br /&gt;파란색 바탕으로 칠해진 노드는 해당노드가 단어의 마지막 문자가 될 수 있다는 의미이다.&lt;br /&gt;예를 들어 3개의 단어가 저장되어 있을 때 단어 &quot;cat&quot;을 찾고자 한다면 왼쪽 노드를 따라 &quot;cat&quot;이라는 단어가 연결되어 존재한다. 하지만 t가 단어의 끝이 아니기 때문에 &quot;cat&quot;이라는 단어는 현재 트리에 존재하지 않는다고 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 구조를 코드로 구현하기 위해 우선 트리의 노드가 될 클래스를 구현한다.&lt;br /&gt;노드 클래스는 현재 노드가 단어의 끝인지 아닌지 판단할 변수와 현재 노드의 자식노드를 저장할 Map으로 구성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1676474604258&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 트리 노드
class Node {
    // 현재 노드까지가 단어인지 아닌지 판단할 변수
    boolean isWord;
    // 현재 노드의 자식노드를 저장할 Map
    Map&amp;lt;Character, Node&amp;gt; children = new HashMap&amp;lt;&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;본격적으로 문제에서 주어진 조건을 구현하기 위해 만들어둔 트리 노드를 변수로 선언하고 Trie 클래스에서 새로운 노드를 생성하여 노드 변수에 저장한다.&lt;/p&gt;
&lt;pre id=&quot;code_1676474716650&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Trie {
    // 노드 변수 선언
    Node root;

    public Trie() {
        // 새로운 루트 노드 생성
        root = new Node();
    }
    ...&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;다음으로 단어를 저장하는 insert 함수를 작성한다.&lt;br /&gt;insert 함수 안에서는 선언한 노드 변수를 새로운 변수에 담고 주어진 단어를 각 문자별로 반복하여 탐색한다.&lt;br /&gt;만약 현재 탐색중인 문자가 현재 노드의 자식 노드에 존재하지 않는 경우 노드를 새로 생성하여 자식 노드에 추가한다.&lt;br /&gt;그 후 현재 노드를 현재 탐색중인 문자에 해당하는 자식노드로 갱신한다.&lt;br /&gt;반복하여 탐색하고 문자열을 끝까지 탐색한 경우에는 현재 노드에 단어인지 아닌지의 여부를 업데이트한다.&lt;/p&gt;
&lt;pre id=&quot;code_1676474868042&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public void insert(String word) {
    // 트리 최상위 노드
    Node node = root;

    // 문자열 끝까지 탐색
    for(int i = 0; i &amp;lt; word.length(); i++){
        // 현재 탐색중인 문자
        Character c = word.charAt(i);
        // 자식 노드에 현재 탐색중인 문자가 없는 경우
        if(!node.children.containsKey(c)){
            // 노드를 새로 생성하고 자식노드에 삽입
            node.children.put(c, new Node());
        } 

        // 노드를 갱신
        node = node.children.get(c);
        // 문자열을 끝까지 탐색한 경우 단어 여부 업데이트
        if(i == word.length() - 1){
            node.isWord = true;
        }
    }
}&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;주어진 단어를 탐색하는 search와 주어진 단어로 시작하는 문자를 탐색하는 startsWith를 구현하는 과정은 거의 똑같다고 할 수 있다.&lt;br /&gt;마찬가지로 주어진 문자를 처음부터 끝까지 탐색하며 자식 노드에 해당 문자가 존재하면 노드를 갱신해가며 자식노드를 따라가면 된다. 만약 문자열을 끝까지 탐색하기전에 자식 노드에 현재 탐색하는 문자가 존재하지 않는다면 주어진 단어는 존재하지 않는 단어이므로 바로 false를 return해주면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1676475150795&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public boolean search(String word) {
    // 트리 최상위 노드
    Node node = root;

    // 문자열 끝까지 탐색
    for(int i = 0; i &amp;lt; word.length(); i++){
        // 현재 탐색중인 문자
        Character c = word.charAt(i);
        // 자식 노드에 현재 탐색중인 문자가 존재하는 경우
        // 해당 자식노드로 노드 갱신
        if(node.children.containsKey(c)) node = node.children.get(c);
        // 자식 노드에 현재 탐색중인 문자가 존재하지 않는 경우 false를 return
        else return false;
    }

    // 마지막까지 탐색 후 현재 노드까지 단어가 존재하면 true 존재하지않으면 false를 return
    return node.isWord? true : 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;search 함수와 startsWith 함수의 유일한 차이점은 마지막 return 조건이다.&lt;br /&gt;search 함수 같은 경우에는 현재 노드가 단어가 될 수 있는 마지막 노드인지 여부를 체크해야하지만 startsWith 함수 같은 경우에는 단어 앞에 해당 문자만 포함이 되어있으면 되기 때문에 마지막 노드가 단어의 마지막이여도 되고 마지막이 아니여도 상관없이 true를 return할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1676475269161&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public boolean startsWith(String prefix) {
    // 트리 최상위 노드
    Node node = root;

    // 문자열 끝까지 탐색
    for(int i = 0; i &amp;lt; prefix.length(); i++){
        // 현재 탐색중인 문자
        Character c = prefix.charAt(i);
        // 자식 노드에 현재 탐색중인 문자가 존재하는 경우
        // 해당 자식노드로 노드 갱신
        if(node.children.containsKey(c)) node = node.children.get(c);
        // 자식 노드에 현재 탐색중인 문자가 존재하지 않는 경우 false를 return
        else return false;
    }

    // prefix 마지막 까지 탐색을 했다면 해당 prefix로 시작하는 단어 존재
    return true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1676447966627&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 트리 노드
class Node {
    // 현재 노드까지가 단어인지 아닌지 판단할 변수
    boolean isWord;
    // 현재 노드의 자식노드를 저장할 Map
    Map&amp;lt;Character, Node&amp;gt; children = new HashMap&amp;lt;&amp;gt;();
}

class Trie {
    // 노드 변수 선언
    Node root;

    public Trie() {
        // 새로운 루트 노드 생성
        root = new Node();
    }
    
    public void insert(String word) {
        // 트리 최상위 노드
        Node node = root;

        // 문자열 끝까지 탐색
        for(int i = 0; i &amp;lt; word.length(); i++){
            // 현재 탐색중인 문자
            Character c = word.charAt(i);
            // 자식 노드에 현재 탐색중인 문자가 없는 경우
            if(!node.children.containsKey(c)){
                // 노드를 새로 생성하고 자식노드에 삽입
                node.children.put(c, new Node());
            } 

            // 노드를 갱신
            node = node.children.get(c);
            // 문자열을 끝까지 탐색한 경우 단어 여부 업데이트
            if(i == word.length() - 1){
                node.isWord = true;
            }
        }
    }
    
    public boolean search(String word) {
        // 트리 최상위 노드
        Node node = root;

        // 문자열 끝까지 탐색
        for(int i = 0; i &amp;lt; word.length(); i++){
            // 현재 탐색중인 문자
            Character c = word.charAt(i);
            // 자식 노드에 현재 탐색중인 문자가 존재하는 경우
            // 해당 자식노드로 노드 갱신
            if(node.children.containsKey(c)) node = node.children.get(c);
            // 자식 노드에 현재 탐색중인 문자가 존재하지 않는 경우 false를 return
            else return false;
        }
        
        // 마지막까지 탐색 후 현재 노드까지 단어가 존재하면 true 존재하지않으면 false를 return
        return node.isWord? true : false;
    }
    
    public boolean startsWith(String prefix) {
        // 트리 최상위 노드
        Node node = root;

        // 문자열 끝까지 탐색
        for(int i = 0; i &amp;lt; prefix.length(); i++){
            // 현재 탐색중인 문자
            Character c = prefix.charAt(i);
            // 자식 노드에 현재 탐색중인 문자가 존재하는 경우
            // 해당 자식노드로 노드 갱신
            if(node.children.containsKey(c)) node = node.children.get(c);
            // 자식 노드에 현재 탐색중인 문자가 존재하지 않는 경우 false를 return
            else return false;
        }
        
        // prefix 마지막 까지 탐색을 했다면 해당 prefix로 시작하는 단어 존재
        return true;
    }
}

/**
 * Your Trie object will be instantiated and called as such:
 * Trie obj = new Trie();
 * obj.insert(word);
 * boolean param_2 = obj.search(word);
 * boolean param_3 = obj.startsWith(prefix);
 */&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>prefix tree</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>자바</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/140</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-208-Implement-Trie-Prefix-Tree-Java-%EC%9E%91%EC%84%B1%EC%A4%91#entry140comment</comments>
      <pubDate>Wed, 15 Feb 2023 16:59:31 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 76. Minimum Window Substring - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-76-Minimum-Window-Substring-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/minimum-window-substring/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/minimum-window-substring/description/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1676340025436&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;Minimum Window Substring - LeetCode&quot; data-og-description=&quot;Can you solve this real interview question? Minimum Window Substring - Given two strings s and t of lengths m and n respectively, return the minimum window substring of s such that every character in t (including duplicates) is included in the window. If t&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/minimum-window-substring/description/&quot; data-og-url=&quot;https://leetcode.com/problems/minimum-window-substring/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/BJATn/hyRCT7RiWD/iu5eCNogOvJKE9WDwQf1Lk/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/bW09oV/hyRC00dKNX/yiEjjo3UHIiHYbG1WlfMSK/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/minimum-window-substring/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/minimum-window-substring/description/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/BJATn/hyRCT7RiWD/iu5eCNogOvJKE9WDwQf1Lk/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/bW09oV/hyRC00dKNX/yiEjjo3UHIiHYbG1WlfMSK/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222');&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;Minimum Window Substring - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Can you solve this real interview question? Minimum Window Substring - Given two strings s and t of lengths m and n respectively, return the minimum window substring of s such that every character in t (including duplicates) is included in the window. If t&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;Given two strings&lt;span&gt;&amp;nbsp;&lt;/span&gt;s&lt;span&gt;&amp;nbsp;&lt;/span&gt;and&lt;span&gt;&amp;nbsp;&lt;/span&gt;t&lt;span&gt;&amp;nbsp;&lt;/span&gt;of lengths&lt;span&gt;&amp;nbsp;&lt;/span&gt;m&lt;span&gt;&amp;nbsp;&lt;/span&gt;and&lt;span&gt;&amp;nbsp;&lt;/span&gt;n&lt;span&gt;&amp;nbsp;&lt;/span&gt;respectively, return&lt;span&gt;&amp;nbsp;&lt;/span&gt;the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;minimum window&lt;/b&gt;&lt;span&gt; &lt;/span&gt;&lt;b&gt;substring &lt;/b&gt;of&lt;span&gt;&amp;nbsp;&lt;/span&gt;s&lt;span&gt;&amp;nbsp;&lt;/span&gt;such that every character in&lt;span&gt;&amp;nbsp;&lt;/span&gt;t&lt;span&gt;&amp;nbsp;&lt;/span&gt;(&lt;b&gt;including duplicates&lt;/b&gt;) is included in the window. If there is no such substring, return&lt;span&gt;&amp;nbsp;&lt;/span&gt;the empty string&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;&quot;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The testcases will be generated such that the answer is&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;unique&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;sas&quot;&gt;&lt;code&gt;Input: s = &quot;ADOBECODEBANC&quot;, t = &quot;ABC&quot;
Output: &quot;BANC&quot;
Explanation: The minimum window substring &quot;BANC&quot; includes 'A', 'B', and 'C' from string t.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;Input: s = &quot;a&quot;, t = &quot;a&quot;
Output: &quot;a&quot;
Explanation: The entire string s is the minimum window.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 3:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;Input: s = &quot;a&quot;, t = &quot;aa&quot;
Output: &quot;&quot;
Explanation: Both 'a's from t must be included in the window.
Since the largest window of s only has one 'a', return empty string.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;m == s.length&lt;/li&gt;
&lt;li&gt;n == t.length&lt;/li&gt;
&lt;li&gt;1 &amp;lt;= m, n &amp;lt;= 105&lt;/li&gt;
&lt;li&gt;s&lt;span&gt;&amp;nbsp;&lt;/span&gt;and&lt;span&gt;&amp;nbsp;&lt;/span&gt;t&lt;span&gt;&amp;nbsp;&lt;/span&gt;consist of uppercase and lowercase English letters.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Follow up:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Could you find an algorithm that runs in&lt;span&gt;&amp;nbsp;&lt;/span&gt;O(m + n)&lt;span&gt;&amp;nbsp;&lt;/span&gt;time?&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알파벳 대,소문자로 이루어진 두 문자열 s와 t가 주어졌을 때 t에 있는 모든 문자를 포함하는 s의 부분문자열 중 가장 작은 부분문자열을 구하는 문제이다. 정답에 해당하는 부분문자열이 없는 경우에는 빈 문자열을 return한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 타겟이 되는 t문자열의 길이가 s문자열의 길이보다 큰 경우 정답이 존재할 수 없으므로 바로 빈 문자열을 return 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1676340591891&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 타겟이 되는 t문자열의 길이가 s문자열의 길이보다 큰 경우 정답이 존재할 수 없음
// 바로 빈 문자열을 return
if(t.length() &amp;gt; s.length()) return &quot;&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시 1번을 기준으로 부분문자열을 탐색하는 전체적인 과정은 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 타겟이 되는 문자열 t의 모든 문자와 그 개수를 Map에 저장&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;206&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/usLiZ/btrZbPZZNQF/gsHKt8WLAHU745Ex2JkvHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/usLiZ/btrZbPZZNQF/gsHKt8WLAHU745Ex2JkvHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/usLiZ/btrZbPZZNQF/gsHKt8WLAHU745Ex2JkvHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FusLiZ%2FbtrZbPZZNQF%2FgsHKt8WLAHU745Ex2JkvHK%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;206&quot; height=&quot;204&quot; data-origin-width=&quot;206&quot; data-origin-height=&quot;204&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;2. 포인터 두 개를 이용하여 범위를 이동하며 탐색&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csRqN2/btrZbo2Dixo/LdYNpaJwQ0njmNy6pkoqz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csRqN2/btrZbo2Dixo/LdYNpaJwQ0njmNy6pkoqz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csRqN2/btrZbo2Dixo/LdYNpaJwQ0njmNy6pkoqz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsRqN2%2FbtrZbo2Dixo%2FLdYNpaJwQ0njmNy6pkoqz1%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;884&quot; height=&quot;278&quot; data-origin-width=&quot;884&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;3. Map에 있는 모든 문자를 포함할 때 까지 오른쪽 인덱스를 증가&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1153&quot; data-origin-height=&quot;275&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZzWRy/btrZatjaDRC/NJ4dzlivR9G8XR3UTl1uA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZzWRy/btrZatjaDRC/NJ4dzlivR9G8XR3UTl1uA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZzWRy/btrZatjaDRC/NJ4dzlivR9G8XR3UTl1uA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZzWRy%2FbtrZatjaDRC%2FNJ4dzlivR9G8XR3UTl1uA0%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;1153&quot; height=&quot;275&quot; data-origin-width=&quot;1153&quot; data-origin-height=&quot;275&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1153&quot; data-origin-height=&quot;275&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AZSMw/btrZchWmUs8/imN9pHwS0psepzQh2rbhy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AZSMw/btrZchWmUs8/imN9pHwS0psepzQh2rbhy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AZSMw/btrZchWmUs8/imN9pHwS0psepzQh2rbhy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAZSMw%2FbtrZchWmUs8%2FimN9pHwS0psepzQh2rbhy1%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;1153&quot; height=&quot;275&quot; data-origin-width=&quot;1153&quot; data-origin-height=&quot;275&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1153&quot; data-origin-height=&quot;275&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEDSec/btrZciAT46J/Cq7BKTDkX7oyqjhp2NtKJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEDSec/btrZciAT46J/Cq7BKTDkX7oyqjhp2NtKJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEDSec/btrZciAT46J/Cq7BKTDkX7oyqjhp2NtKJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEDSec%2FbtrZciAT46J%2FCq7BKTDkX7oyqjhp2NtKJK%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;1153&quot; height=&quot;275&quot; data-origin-width=&quot;1153&quot; data-origin-height=&quot;275&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1153&quot; data-origin-height=&quot;275&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCM2Jv/btrZahbWgbj/N7nwIeqwJ3kRvv9qkHPam1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCM2Jv/btrZahbWgbj/N7nwIeqwJ3kRvv9qkHPam1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCM2Jv/btrZahbWgbj/N7nwIeqwJ3kRvv9qkHPam1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCM2Jv%2FbtrZahbWgbj%2FN7nwIeqwJ3kRvv9qkHPam1%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;1153&quot; height=&quot;275&quot; data-origin-width=&quot;1153&quot; data-origin-height=&quot;275&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;style1&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1153&quot; data-origin-height=&quot;275&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DUhgc/btrZclYFMtW/5Shjp8KamMnJfYE0xSg2x0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DUhgc/btrZclYFMtW/5Shjp8KamMnJfYE0xSg2x0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DUhgc/btrZclYFMtW/5Shjp8KamMnJfYE0xSg2x0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDUhgc%2FbtrZclYFMtW%2F5Shjp8KamMnJfYE0xSg2x0%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;1153&quot; height=&quot;275&quot; data-origin-width=&quot;1153&quot; data-origin-height=&quot;275&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Map에 있는 모든 문자를 포함하는 경우, 다시 Map에 있는 문자가 필요해 질 때까지 왼쪽 인덱스를 증가&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1153&quot; data-origin-height=&quot;275&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHhPJh/btrY8i3j5Pe/tCFkdpqrssDjpyCj4rmuSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHhPJh/btrY8i3j5Pe/tCFkdpqrssDjpyCj4rmuSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHhPJh/btrY8i3j5Pe/tCFkdpqrssDjpyCj4rmuSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHhPJh%2FbtrY8i3j5Pe%2FtCFkdpqrssDjpyCj4rmuSK%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;1153&quot; height=&quot;275&quot; data-origin-width=&quot;1153&quot; data-origin-height=&quot;275&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 만들어진 범위가 최소 부분문자열의 길이보다 작은 경우 최소 부분문자열 업데이트, 단 왼쪽 인덱스는 증가 이전까지의 범위&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSXsOy/btrZbpmYNMu/Xt4K55perVMSYynsCi8mFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSXsOy/btrZbpmYNMu/Xt4K55perVMSYynsCi8mFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSXsOy/btrZbpmYNMu/Xt4K55perVMSYynsCi8mFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSXsOy%2FbtrZbpmYNMu%2FXt4K55perVMSYynsCi8mFk%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;780&quot; height=&quot;82&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;82&quot;/&gt;&lt;/span&gt;&lt;/figure&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;먼저 필요한 문자와 그 개수를 저장할 Map을 하나 선언하고 t의 각 문자를 순회하며 Map에 저장한다.&lt;/p&gt;
&lt;pre id=&quot;code_1676342026936&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 필요한 문자와 개수를 저장할 Map
Map&amp;lt;Character, Integer&amp;gt; target = new HashMap&amp;lt;&amp;gt;();
// 필요한 모든 문자와 개수를 Map에 저장
for(int i = 0; i &amp;lt; t.length(); i++) {
    Character c = t.charAt(i);
    target.put(c, target.getOrDefault(c, 0) + 1);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;탐색에 필요한 변수를 선언&lt;/p&gt;
&lt;pre id=&quot;code_1676342083593&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 최소 부분 문자열
String minSub = s;
// 탐색중인 범위의 왼쪽 인덱스
int left = 0;
// 탐색중인 범위의 오른쪽 인덱스
int right = 0;
// 필요한 문자의 총 개수
int count = t.length();
// 타겟 문자를 모두 포함한 부분문자열이 존재하는지 여부
boolean find = 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;오른쪽 인덱스가 탐색할 문자열 s의 끝에 도달할 때 까지 탐색을 반복한다.&lt;br /&gt;만약 오른쪽 인덱스에 해당하는 문자가 Map에 존재하는 경우, 즉 정답이 되기 위해서 포함되어야 하는 문자인 경우 Map에서 해당 문자의 개수를 감소시키고 개수가 0이상인 경우 필요한 문자의 총 개수도 감소시킨다.&lt;br /&gt;t의 모든 문자를 포함한 부분문자열을 찾았으므로 존재 여부를 업데이트한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;개수가 0 이상인 경우에만 필요한 문자의 총 개수를 감소시키는 이유는 만약 &quot;A&quot;라는 문자가 1개 포함 되어야할 때 탐색중인 범위에 &quot;A&quot;가 두 개가 존재한다면 Map에 존재하는 &quot;A&quot;의 개수는 -1이 될 것이지만 실제로 필요한 문자의 총 개수는 1개만 감소해야하기 때문이다.&lt;/p&gt;
&lt;pre id=&quot;code_1676342212320&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 문자열의 끝까지 탐색할 때 까지 반복
while(right &amp;lt; s.length()) {
    // 오른쪽 인덱스의 문자 탐색
    Character end = s.charAt(right);
    // 필요한 문자인 경우
    if(target.containsKey(end)) {
        // target에서 해당 문자의 카운트 감소
        target.put(end, target.get(end) - 1);
        // 필요한 문자의 총 개수 감소
        if(target.get(end) &amp;gt;= 0) count--;
    }

    // 필요한 문자의 총 개수가 남아있으면 필요한 모든 문자를 포함할 때 까지 오른쪽 인덱스를 증가시키며 재탐색
    right++;
    if(count &amp;gt; 0) continue;
    
    // 필요한 문자를 모두 포함한 경우
    // 정답이 될 수 있는 부분 문자열 존재 여부 업데이트
	find = true;
    
    ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답이 되기위해 필요한 문자를 모두 포함할 때 까지 오른쪽 인덱스가 이동했다면, 다시 필요한 문자가 생길 때 까지 왼쪽 인덱스를 증가시키며 탐색한다.&lt;br /&gt;왼쪽 인덱스에 해당하는 문자가 Map에 존재하는 경우 이번에는 반대로 Map에서 해당 문자의 개수를 증가시키고 개수가 0보다 큰 경우 필요한 문자의 총 개수도 증가시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;개수가 0보다 큰 경우에만 필요한 문자의 총 개수를 증가시키는 이유도 마찬가지이다.&lt;br /&gt;정답이 되기 위해서 필요한 문자 &quot;A&quot;의 개수가 1개인데 현재 탐색범위에 포함된 &quot;A&quot;가 2개라면 그 중 하나가 포함되지 않더라도 정답이 되는데는 영향이 없기 때문이다.&lt;/p&gt;
&lt;pre id=&quot;code_1676342376600&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 필요한 문자의 개수가 다시 0보다 커질 때 까지 왼쪽 인덱스를 증가시키며 범위를 감소시킴
while(count == 0) {
    // 왼쪽 인덱스의 문자 탐색
    Character start = s.charAt(left);
    // 필요한 문자인 경우
    if(target.containsKey(start)) {
        // target에서 해당 문자의 카운트 증가
        target.put(start, target.get(start) + 1);
        // 필요한 문자의 총 개수 증가
        if(target.get(start) &amp;gt; 0) count++;
    }

    // 왼쪽 인덱스 증가
    left++;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 과정을 종료했을 때 탐색 범위가 최소 부분문자열의 길이보다 작은 경우 현재 범위에 해당하는 부분문자열을 최소 부분문자열로 업데이트 한다. 이 때 왼쪽 인덱스는 증가한채로 존재하기 때문에 이전 인덱스를 포함하여 체크한다.&lt;/p&gt;
&lt;pre id=&quot;code_1676342717613&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 현재 탐색 범위가 최소 부분문자열 길이보다 작은 경우
if(right - (left - 1) &amp;lt; minSub.length()) {
    // 현재 탐색범위의 문자열을 최소 부분문자열로 저장
    minSub = s.substring(left - 1, right);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 탐색이 종료되고 정답이 될 수 있는 부분 문자열을 찾은 경우에는 최소 부분 문자열을 return 하고, 찾지 못한 경우 에는 빈 문자열을 return 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1676342769766&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 정답이 되는 부분 문자열을 찾은 경우 최소 부분문자열을 return
// 찾지 못한 경우 빈 문자열을 return
return find ? minSub : &quot;&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1676340079598&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public String minWindow(String s, String t) {
        // 타겟이 되는 t문자열의 길이가 s문자열의 길이보다 큰 경우 정답이 존재할 수 없음
        // 바로 빈 문자열을 return
        if(t.length() &amp;gt; s.length()) return &quot;&quot;;
        
        // 필요한 문자와 개수를 저장할 Map
        Map&amp;lt;Character, Integer&amp;gt; target = new HashMap&amp;lt;&amp;gt;();
        // 필요한 모든 문자와 개수를 Map에 저장
        for(int i = 0; i &amp;lt; t.length(); i++) {
            Character c = t.charAt(i);
            target.put(c, target.getOrDefault(c, 0) + 1);
        }
        
        // 최소 부분 문자열
        String minSub = s;
        // 탐색중인 범위의 왼쪽 인덱스
        int left = 0;
        // 탐색중인 범위의 오른쪽 인덱스
        int right = 0;
        // 필요한 문자의 총 개수
        int count = t.length();
        // 타겟 문자를 모두 포함한 부분문자열이 존재하는지 여부
        boolean find = false;
        
        // 문자열의 끝까지 탐색할 때 까지 반복
        while(right &amp;lt; s.length()) {
            // 오른쪽 인덱스의 문자 탐색
            Character end = s.charAt(right);
            // 필요한 문자인 경우
            if(target.containsKey(end)) {
                // target에서 해당 문자의 카운트 감소
                target.put(end, target.get(end) - 1);
                // 필요한 문자의 총 개수 감소
                if(target.get(end) &amp;gt;= 0) count--;
            }
            
            // 필요한 문자의 총 개수가 남아있으면 필요한 모든 문자를 포함할 때 까지 오른쪽 인덱스를 증가시키며 재탐색
            right++;
            if(count &amp;gt; 0) continue;
            
            // 필요한 문자를 모두 포함한 경우
            // 정답이 될 수 있는 부분 문자열 존재 여부 업데이트
            find = true;
            
            // 필요한 문자의 개수가 다시 0보다 커질 때 까지 왼쪽 인덱스를 증가시키며 범위를 감소시킴
            while(count == 0) {
                // 왼쪽 인덱스의 문자 탐색
                Character start = s.charAt(left);
                // 필요한 문자인 경우
                if(target.containsKey(start)) {
                    // target에서 해당 문자의 카운트 증가
                    target.put(start, target.get(start) + 1);
                    // 필요한 문자의 총 개수 증가
                    if(target.get(start) &amp;gt; 0) count++;
                }
                
                // 왼쪽 인덱스 증가
                left++;
            }
            
            // 현재 탐색 범위가 최소 부분문자열 길이보다 작은 경우
            if(right - (left - 1) &amp;lt; minSub.length()) {
                // 현재 탐색범위의 문자열을 최소 부분문자열로 저장
                minSub = s.substring(left - 1, right);
            }
            
        }
        
        // 정답이 되는 부분 문자열을 찾은 경우 최소 부분문자열을 return
        // 찾지 못한 경우 빈 문자열을 return
        return find ? minSub : &quot;&quot;;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>Minimum Window Substring</category>
      <category>Sliding Window</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>자바</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/139</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-76-Minimum-Window-Substring-Java#entry139comment</comments>
      <pubDate>Tue, 14 Feb 2023 11:46:58 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 647. Palindromic Substrings - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-647-Palindromic-Substrings-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/palindromic-substrings/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/palindromic-substrings/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1676169571208&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;Palindromic Substrings - LeetCode&quot; data-og-description=&quot;Palindromic Substrings - Given a string s, return the number of palindromic substrings in it. A string is a palindrome when it reads the same backward as forward. A substring is a contiguous sequence of characters within the string. &amp;nbsp; Example 1: Input: s &quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/palindromic-substrings/&quot; data-og-url=&quot;https://leetcode.com/problems/palindromic-substrings/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b2gtjH/hyRAmi2TwG/6S47fxEwaQiD76fM6OJQ5k/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/bNNrSe/hyRAc1NS44/L9QdVZd4GERpaAgBWWj5fk/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/palindromic-substrings/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/palindromic-substrings/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b2gtjH/hyRAmi2TwG/6S47fxEwaQiD76fM6OJQ5k/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/bNNrSe/hyRAc1NS44/L9QdVZd4GERpaAgBWWj5fk/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222');&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;Palindromic Substrings - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Palindromic Substrings - Given a string s, return the number of palindromic substrings in it. A string is a palindrome when it reads the same backward as forward. A substring is a contiguous sequence of characters within the string. &amp;nbsp; Example 1: Input: s&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;Given a string&lt;span&gt;&amp;nbsp;&lt;/span&gt;s, return&lt;span&gt;&amp;nbsp;&lt;/span&gt;the number of&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;palindromic substrings&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;in it.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A string is a&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;palindrome&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;when it reads the same backward as forward.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;substring&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is a contiguous sequence of characters within the string.&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;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;Input: s = &quot;abc&quot;
Output: 3
Explanation: Three palindromic strings: &quot;a&quot;, &quot;b&quot;, &quot;c&quot;.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;Input: s = &quot;aaa&quot;
Output: 6
Explanation: Six palindromic strings: &quot;a&quot;, &quot;a&quot;, &quot;a&quot;, &quot;aa&quot;, &quot;aa&quot;, &quot;aaa&quot;.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1 &amp;lt;= s.length &amp;lt;= 1000&lt;/li&gt;
&lt;li&gt;s&lt;span&gt;&amp;nbsp;&lt;/span&gt;consists of lowercase English letters.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체적인 풀이 과정은 LeetCode 5.Longest Palindromic Substring와 거의 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hyojun.tistory.com/entry/LeetCode-5-Longest-Palindromic-Substring-Java&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://hyojun.tistory.com/entry/LeetCode-5-Longest-Palindromic-Substring-Java&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1676169693028&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[LeetCode] 5. Longest Palindromic Substring - Java&quot; data-og-description=&quot;https://leetcode.com/problems/longest-palindromic-substring/description/ Longest Palindromic Substring - LeetCode Longest Palindromic Substring - Given a string s, return the longest palindromic substring in s. Example 1: Input: s = &amp;quot;babad&amp;quot; Output: &amp;quot;bab&amp;quot; E&quot; data-og-host=&quot;hyojun.tistory.com&quot; data-og-source-url=&quot;https://hyojun.tistory.com/entry/LeetCode-5-Longest-Palindromic-Substring-Java&quot; data-og-url=&quot;https://hyojun.tistory.com/entry/LeetCode-5-Longest-Palindromic-Substring-Java&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/B75v6/hyRAkerDec/XNZELe4BPqXp8UUNe7SZX0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/lgPYy/hyRAgQFzBC/TOyDjjvtl0qDwiCIOkgbH1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://hyojun.tistory.com/entry/LeetCode-5-Longest-Palindromic-Substring-Java&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hyojun.tistory.com/entry/LeetCode-5-Longest-Palindromic-Substring-Java&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/B75v6/hyRAkerDec/XNZELe4BPqXp8UUNe7SZX0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/lgPYy/hyRAgQFzBC/TOyDjjvtl0qDwiCIOkgbH1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;[LeetCode] 5. Longest Palindromic Substring - Java&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;https://leetcode.com/problems/longest-palindromic-substring/description/ Longest Palindromic Substring - LeetCode Longest Palindromic Substring - Given a string s, return the longest palindromic substring in s. Example 1: Input: s = &quot;babad&quot; Output: &quot;bab&quot; E&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hyojun.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주어진 문자열 s의 모든 문자에 대해서 탐색하며 각각 홀수 길이인 경우, 짝수 길이인 경우의 Palindrome이 몇 개인지 누적시켜 최종 return 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1676169902472&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public int countSubstrings(String s) {
    int answer = 0;

    // s의 모든 문자에 대해서 탐색
    for(int i = 0; i &amp;lt; s.length(); i++) {
        // 홀수 길이인 Palindrome 개수
        answer += countPalindrome(s, i, i);
        // 짝수 길이인 Palindrome 개수
        answer += countPalindrome(s, i, i + 1);
    }

    return answer;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 문자에 대해서 Palindrome이 몇 개인지 카운트하는 함수는 다음과 같다.&lt;br /&gt;탐색 대상 문자열 s와 왼쪽, 오른쪽 인덱스 left, right를 전달 받아 왼쪽 인덱스와 오른쪽 인덱스가 문자열 s의 끝에 도달할 때 까지 반복한다.&lt;br /&gt;만약 양쪽의 글자가 같은 경우 카운트를 증가시키고 인덱스를 한 칸씩 이동한다.&lt;br /&gt;양쪽의 글자가 다른 경우에는 더 이상 Palindrome이 될 수 없으므로 탐색을 종료한다.&lt;br /&gt;탐색이 종료된 후 카운트를 최종 return한다.&lt;/p&gt;
&lt;pre id=&quot;code_1676169949656&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/**
 * @param s         탐색할 문자열
 * @param left      탐색을 시작할 왼쪽 인덱스
 * @param right     탐색을 시작할 오른쪽 인덱스
 * @return
 */
public int countPalindrome(String s, int left, int right) {
    int count = 0;

    // 왼쪽 인덱스와 오른쪽 인덱스가 끝에 도달할 때 까지 반복
    while(left &amp;gt;= 0 &amp;amp;&amp;amp; right &amp;lt; s.length()) {
        // 양쪽의 글자가 같은 경우 카운트를 증가시키고 인덱스를 한칸씩 이동
        if(s.charAt(left) == s.charAt(right)) {
            count++;
            left--;
            right++;
        } 
        // 양쪽의 글자가 다른 경우 탐색 종료
        else {
            break;
        }
    }

    return count;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1676169580670&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int countSubstrings(String s) {
        int answer = 0;
        
        // s의 모든 문자에 대해서 탐색
        for(int i = 0; i &amp;lt; s.length(); i++) {
            // 홀수 길이인 Palindrome 개수
            answer += countPalindrome(s, i, i);
            // 짝수 길이인 Palindrome 개수
            answer += countPalindrome(s, i, i + 1);
        }

        return answer;
    }

    /**
     * @param s         탐색할 문자열
     * @param left      탐색을 시작할 왼쪽 인덱스
     * @param right     탐색을 시작할 오른쪽 인덱스
     * @return
     */
    public int countPalindrome(String s, int left, int right) {
        int count = 0;
        
        // 왼쪽 인덱스와 오른쪽 인덱스가 끝에 도달할 때 까지 반복
        while(left &amp;gt;= 0 &amp;amp;&amp;amp; right &amp;lt; s.length()) {
            // 양쪽의 글자가 같은 경우 카운트를 증가시키고 인덱스를 한칸씩 이동
            if(s.charAt(left) == s.charAt(right)) {
                count++;
                left--;
                right++;
            } 
            // 양쪽의 글자가 다른 경우 탐색 종료
            else {
                break;
            }
        }
        
        return count;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>Palindromic Substrings</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>자바</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/138</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-647-Palindromic-Substrings-Java#entry138comment</comments>
      <pubDate>Sun, 12 Feb 2023 11:47:45 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 5. Longest Palindromic Substring - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-5-Longest-Palindromic-Substring-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/longest-palindromic-substring/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/longest-palindromic-substring/description/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1675956364822&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Longest Palindromic Substring - LeetCode&quot; data-og-description=&quot;Longest Palindromic Substring - Given a string s, return the longest palindromic substring in s. &amp;nbsp; Example 1: Input: s = &amp;quot;babad&amp;quot; Output: &amp;quot;bab&amp;quot; Explanation: &amp;quot;aba&amp;quot; is also a valid answer. Example 2: Input: s = &amp;quot;cbbd&amp;quot; Output: &amp;quot;bb&amp;quot; &amp;nbsp; Constraints: * 1 &amp;lt;= s.le&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/longest-palindromic-substring/description/&quot; data-og-url=&quot;https://leetcode.com/problems/longest-palindromic-substring/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bbocss/hyRzvs96PM/pxxxCl6CyObUBPQEbcCOo1/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/dQGglG/hyRzxEuTaE/TgvLHG0YIKSyvtBT2Xcuw1/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/longest-palindromic-substring/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/longest-palindromic-substring/description/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bbocss/hyRzvs96PM/pxxxCl6CyObUBPQEbcCOo1/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/dQGglG/hyRzxEuTaE/TgvLHG0YIKSyvtBT2Xcuw1/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Longest Palindromic Substring - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Longest Palindromic Substring - Given a string s, return the longest palindromic substring in s. &amp;nbsp; Example 1: Input: s = &quot;babad&quot; Output: &quot;bab&quot; Explanation: &quot;aba&quot; is also a valid answer. Example 2: Input: s = &quot;cbbd&quot; Output: &quot;bb&quot; &amp;nbsp; Constraints: * 1 &amp;lt;= s.le&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;Given a string&lt;span&gt;&amp;nbsp;&lt;/span&gt;s, return&lt;span&gt;&amp;nbsp;&lt;/span&gt;the longest&lt;span&gt; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;palindromic &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;substring &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;s.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;Input: s = &quot;babad&quot;
Output: &quot;bab&quot;
Explanation: &quot;aba&quot; is also a valid answer.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;avrasm&quot;&gt;&lt;code&gt;Input: s = &quot;cbbd&quot;
Output: &quot;bb&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1 &amp;lt;= s.length &amp;lt;= 1000&lt;/li&gt;
&lt;li&gt;s&lt;span&gt;&amp;nbsp;&lt;/span&gt;consist of only digits and English letters.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;숫자와 알파벳으로 이루어진 문자열 s가 주어질 때 s의 부분 문자열 중 가장 긴 palindrome(회문)을 구하는 문제이다.&lt;br /&gt;palindrome은 거꾸로 읽어도 원래와 똑같은 문자나 문장을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;투 포인터를 이용하여 palindrome을 판단하는 함수를 생성한다.&lt;br /&gt;문자열 s와 왼쪽, 오른쪽 인덱스를 가지고 인덱스를 양쪽으로 늘려가며 해당 인덱스에 해당하는 문자가 같은지 판단하고 palindrome이 될 수 있는 최대 인덱스에서 문자열을 잘라 return 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1675957056527&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/**
     * @param s         탐색할 문자열
     * @param left      탐색을 시작할 왼쪽 인덱스
     * @param right     탐색을 시작할 오른쪽 인덱스
     * @return
     */
    public String isPalindrome(String s, int left, int right) {
        // 왼쪽 인덱스와 오른쪽 인덱스가 끝에 도달할 때 까지 반복
        while(left &amp;gt;= 0 &amp;amp;&amp;amp; right &amp;lt; s.length()) {
            // 양쪽의 글자가 같은 경우 인덱스를 한칸씩 이동
            if(s.charAt(left) == s.charAt(right)) {
                left--;
                right++;
            } 
            // 양쪽의 글자가 다른 경우 탐색 종료
            else {
                break;
            }
        }
        
        // 인덱스가 이동한 상태로 탐색이 종료되었으므로 이전 인덱스까지 문자열을 잘라서 return
        return s.substring(left + 1, right);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성한 함수를 이용하여 주어진 문자열 s의 모든 문자에서 palindrome을 판단해야하는데 문자열의 길이가 홀수인 경우와 짝수인 경우를 나누어 생각해야한다.&lt;br /&gt;문자열의 길이가 홀수인 경우에는 같은 인덱스에서 시작하여 양쪽을 비교하면 되고,&lt;br /&gt;문자열의 길이가 짝수인 경우에는 인접한 두 인덱스에서 시작하여 양쪽을 비교하여야한다.&lt;br /&gt;각각의 경우에서 나온 Palindrome의 길이와 Longest Palindromic Substring의 길이를 비교하여 더 큰 값으로 정답을 갱신한다.&lt;/p&gt;
&lt;pre id=&quot;code_1675957268760&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Longest Palindromic Substring
String lps = &quot;&quot;;

// 문자열의 모든 문자 탐색
for(int i = 0; i &amp;lt; s.length(); i++) {
    // 각 문자부터 양쪽으로 늘려가며 palindrome 체크
    // 홀수인 경우 
    String oddMax = isPalindrome(s, i, i);
    lps = (lps.length() &amp;lt; oddMax.length())? oddMax : lps;
    // 짝수인 경우
    String evenMax = isPalindrome(s, i, i + 1);
    lps = (lps.length() &amp;lt; evenMax.length())? evenMax : lps;
}&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;모든 탐색이 종료되면 결과값을 return 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1675957282911&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;return lps;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1675956368350&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public String longestPalindrome(String s) {
        // Longest Palindromic Substring
        String lps = &quot;&quot;;
        
        // 문자열의 모든 문자 탐색
        for(int i = 0; i &amp;lt; s.length(); i++) {
            // 각 문자부터 양쪽으로 늘려가며 palindrome 체크
            // 홀수인 경우 
            String oddMax = isPalindrome(s, i, i);
            lps = (lps.length() &amp;lt; oddMax.length())? oddMax : lps;
            // 짝수인 경우
            String evenMax = isPalindrome(s, i, i + 1);
            lps = (lps.length() &amp;lt; evenMax.length())? evenMax : lps;
        }

        return lps;
    }

    /**
     * @param s         탐색할 문자열
     * @param left      탐색을 시작할 왼쪽 인덱스
     * @param right     탐색을 시작할 오른쪽 인덱스
     * @return
     */
    public String isPalindrome(String s, int left, int right) {
        // 왼쪽 인덱스와 오른쪽 인덱스가 끝에 도달할 때 까지 반복
        while(left &amp;gt;= 0 &amp;amp;&amp;amp; right &amp;lt; s.length()) {
            // 양쪽의 글자가 같은 경우 인덱스를 한칸씩 이동
            if(s.charAt(left) == s.charAt(right)) {
                left--;
                right++;
            } 
            // 양쪽의 글자가 다른 경우 탐색 종료
            else {
                break;
            }
        }
        
        // 인덱스가 이동한 상태로 탐색이 종료되었으므로 이전 인덱스까지 문자열을 잘라서 return
        return s.substring(left + 1, right);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>Longest Palindromic Substring</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>자바</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/137</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-5-Longest-Palindromic-Substring-Java#entry137comment</comments>
      <pubDate>Fri, 10 Feb 2023 00:41:26 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 235. Lowest Common Ancestor of a Binary Search Tree - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-235-Lowest-Common-Ancestor-of-a-Binary-Search-Tree-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/description/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1675779833077&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;Lowest Common Ancestor of a Binary Search Tree - LeetCode&quot; data-og-description=&quot;Lowest Common Ancestor of a Binary Search Tree - Given a binary search tree (BST), find the lowest common ancestor (LCA) node of two given nodes in the BST. According to the definition of LCA on Wikipedia [https://en.wikipedia.org/wiki/Lowest_common_ancest&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/description/&quot; data-og-url=&quot;https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ctxJoS/hyRwESESsc/NI8Kvx6kNCUzlCfrjruk7K/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/kmC9N/hyRwvVHSS5/mGDrLdHgJqfVKLqhxcrNmk/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/description/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ctxJoS/hyRwESESsc/NI8Kvx6kNCUzlCfrjruk7K/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/kmC9N/hyRwvVHSS5/mGDrLdHgJqfVKLqhxcrNmk/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222');&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;Lowest Common Ancestor of a Binary Search Tree - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Lowest Common Ancestor of a Binary Search Tree - Given a binary search tree (BST), find the lowest common ancestor (LCA) node of two given nodes in the BST. According to the definition of LCA on Wikipedia [https://en.wikipedia.org/wiki/Lowest_common_ancest&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;Given a binary search tree (BST), find the lowest common ancestor (LCA) node of two given nodes in the BST.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;According to the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Lowest_common_ancestor&quot;&gt;definition of LCA on Wikipedia&lt;/a&gt;: &amp;ldquo;The lowest common ancestor is defined between two nodes&lt;span&gt;&amp;nbsp;&lt;/span&gt;p&lt;span&gt;&amp;nbsp;&lt;/span&gt;and&lt;span&gt;&amp;nbsp;&lt;/span&gt;q&lt;span&gt;&amp;nbsp;&lt;/span&gt;as the lowest node in&lt;span&gt;&amp;nbsp;&lt;/span&gt;T&lt;span&gt;&amp;nbsp;&lt;/span&gt;that has both&lt;span&gt;&amp;nbsp;&lt;/span&gt;p&lt;span&gt;&amp;nbsp;&lt;/span&gt;and&lt;span&gt;&amp;nbsp;&lt;/span&gt;q&lt;span&gt;&amp;nbsp;&lt;/span&gt;as descendants (where we allow&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;a node to be a descendant of itself&lt;/b&gt;).&amp;rdquo;&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;Example 1:&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;200&quot; data-origin-height=&quot;190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAMzaK/btrYqzK0l86/kam2UPwdb6TrBgKrrAtbkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAMzaK/btrYqzK0l86/kam2UPwdb6TrBgKrrAtbkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAMzaK/btrYqzK0l86/kam2UPwdb6TrBgKrrAtbkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAMzaK%2FbtrYqzK0l86%2Fkam2UPwdb6TrBgKrrAtbkk%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;200&quot; height=&quot;190&quot; data-origin-width=&quot;200&quot; data-origin-height=&quot;190&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Input: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
Output: 6
Explanation: The LCA of nodes 2 and 8 is 6.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;200&quot; data-origin-height=&quot;190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/esTCPh/btrYvnvl5IH/XWJQthnnBr8iLlPNLWov5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/esTCPh/btrYvnvl5IH/XWJQthnnBr8iLlPNLWov5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/esTCPh/btrYvnvl5IH/XWJQthnnBr8iLlPNLWov5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FesTCPh%2FbtrYvnvl5IH%2FXWJQthnnBr8iLlPNLWov5K%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;200&quot; height=&quot;190&quot; data-origin-width=&quot;200&quot; data-origin-height=&quot;190&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Input: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
Output: 2
Explanation: The LCA of nodes 2 and 4 is 2, since a node can be a descendant of itself according to the LCA definition.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 3:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Input: root = [2,1], p = 2, q = 1
Output: 2
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;The number of nodes in the tree is in the range&lt;span&gt;&amp;nbsp;&lt;/span&gt;[2, 105].&lt;/li&gt;
&lt;li&gt;-109 &amp;lt;= Node.val &amp;lt;= 109&lt;/li&gt;
&lt;li&gt;All&lt;span&gt;&amp;nbsp;&lt;/span&gt;Node.val&lt;span&gt;&amp;nbsp;&lt;/span&gt;are&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;unique&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;p != q&lt;/li&gt;
&lt;li&gt;p&lt;span&gt;&amp;nbsp;&lt;/span&gt;and&lt;span&gt;&amp;nbsp;&lt;/span&gt;q&lt;span&gt;&amp;nbsp;&lt;/span&gt;will exist in the BST.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이진 탐색트리 root와 노드 p, q가 주어졌을 때 노드 p와 q의 최소 공통 조상을 찾는 문제이다. (각 노드는 자신 역시 조상으로 간주한다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이진 탐색 트리에서 세 노드에 대해서 비교할 때 크게 네가지 경우를 생각해 볼 수 있다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;p와 q의 값이 root를 기준으로 양쪽으로 나누어져 있는 경우&lt;/li&gt;
&lt;li&gt;root의 값이 p나 q의 값 중 하나와 같은 경우&lt;/li&gt;
&lt;li&gt;p와 q의 값이 모두 root보다 작은 경우&lt;/li&gt;
&lt;li&gt;p와 q의 값이 모두 root보다 큰 경우&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 p와 q의 값이 root를 기준으로 양쪽으로 나누어져 있는 경우 왼쪽/오른쪽 서브트리에서는 공통 조상이 존재할 수 없으므로 root가 최소 공통 조상이 된다&lt;/p&gt;
&lt;pre id=&quot;code_1675780499136&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// p와 q의 값이 root를 기준으로 양쪽으로 퍼져있을 경우 root가 최소 공통 조상이 됨
if((root.val &amp;gt; p.val &amp;amp;&amp;amp; root.val &amp;lt; q.val) || (root.val &amp;gt; q.val &amp;amp;&amp;amp; root.val &amp;lt; p.val)) return root;&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;두 번째로 root의 값이 p나 q의 값 중 하나와 같은 경우, 즉 p나 q중 하나가 그 자체로 본인의 조상으로 간주되는 경우 역시 root가 최소 공통 조상이 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1675780582872&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// root의 값이 p나 q의 값 중 하나와 같다면 역시 root가 최소 공통 조상이 됨
if(root.val == p.val || root.val == q.val) return root;&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;세 번째로 p와 q의 값이 모두 root보다 작은 경우 p와 q 모두 root의 왼쪽 서브트리에 존재하게 된다. 그러나 최소 공통조상이 무엇인지는 아직 알 수 없으므로 위의 두 가지 경우가 나올 때 까지 왼쪽 서브트리를 재귀 탐색한다.&lt;/p&gt;
&lt;pre id=&quot;code_1675780743000&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// p와 q가 root보다 작은 경우 왼쪽 서브트리를 탐색
if(p.val &amp;lt; root.val &amp;amp;&amp;amp; q.val &amp;lt; root.val) return lowestCommonAncestor(root.left, p, q);&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;마지막으로 p와 q의 값이 모두 root보다 큰 경우 p와 q모두 오른쪽 서브트리에 존재하며 역시 최소 공통 조상은 알 수 없다. 따라서 세 번째 경우와 마찬가지로 1, 2번 경우가 나올 때 까지 오른쪽 서브트리를 재귀탐색한다.&lt;/p&gt;
&lt;pre id=&quot;code_1675780802272&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 나머지 경우, p와 q가 root보다 큰 경우 오른쪽 서브트리를 탐색
return lowestCommonAncestor(root.right, p, q);&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1675779859880&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        // p와 q의 값이 root를 기준으로 양쪽으로 퍼져있을 경우 root가 최소 공통 조상이 됨
        if((root.val &amp;gt; p.val &amp;amp;&amp;amp; root.val &amp;lt; q.val) || (root.val &amp;gt; q.val &amp;amp;&amp;amp; root.val &amp;lt; p.val)) return root;
        // root의 값이 p나 q의 값 중 하나와 같다면 역시 root가 최소 공통 조상이 됨
        if(root.val == p.val || root.val == q.val) return root;
        // p와 q가 root보다 작은 경우 왼쪽 서브트리를 탐색
        if(p.val &amp;lt; root.val &amp;amp;&amp;amp; q.val &amp;lt; root.val) return lowestCommonAncestor(root.left, p, q);
        // 나머지 경우, p와 q가 root보다 큰 경우 오른쪽 서브트리를 탐색
        return lowestCommonAncestor(root.right, p, q);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>Lowest Common Ancestor of a Binary Search Tree</category>
      <category>tree</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>자바</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/136</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-235-Lowest-Common-Ancestor-of-a-Binary-Search-Tree-Java#entry136comment</comments>
      <pubDate>Tue, 7 Feb 2023 23:40:13 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 230. Kth Smallest Element in a BST - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-230-Kth-Smallest-Element-in-a-BST-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/kth-smallest-element-in-a-bst/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/kth-smallest-element-in-a-bst/description/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1675692792853&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;Kth Smallest Element in a BST - LeetCode&quot; data-og-description=&quot;Kth Smallest Element in a BST - Given the root of a binary search tree, and an integer k, return the kth smallest value (1-indexed) of all the values of the nodes in the tree. &amp;nbsp; Example 1: [https://assets.leetcode.com/uploads/2021/01/28/kthtree1.jpg] Inpu&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/kth-smallest-element-in-a-bst/description/&quot; data-og-url=&quot;https://leetcode.com/problems/kth-smallest-element-in-a-bst/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b32BvZ/hyRwtppd9r/YMYwntRAbgJ6t0OAhxUf90/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/cG8ADu/hyRwFXGzPw/qmlXjr9sp2JxQGLCu28Ek0/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222,https://scrap.kakaocdn.net/dn/cdZ4Aa/hyRwwsTStz/tshMlQKzqZWeK8MSUkGGi0/img.jpg?width=382&amp;amp;height=302&amp;amp;face=0_0_382_302&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/kth-smallest-element-in-a-bst/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/kth-smallest-element-in-a-bst/description/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b32BvZ/hyRwtppd9r/YMYwntRAbgJ6t0OAhxUf90/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/cG8ADu/hyRwFXGzPw/qmlXjr9sp2JxQGLCu28Ek0/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222,https://scrap.kakaocdn.net/dn/cdZ4Aa/hyRwwsTStz/tshMlQKzqZWeK8MSUkGGi0/img.jpg?width=382&amp;amp;height=302&amp;amp;face=0_0_382_302');&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;Kth Smallest Element in a BST - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Kth Smallest Element in a BST - Given the root of a binary search tree, and an integer k, return the kth smallest value (1-indexed) of all the values of the nodes in the tree. &amp;nbsp; Example 1: [https://assets.leetcode.com/uploads/2021/01/28/kthtree1.jpg] Inpu&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;Given the&lt;span&gt;&amp;nbsp;&lt;/span&gt;root&lt;span&gt;&amp;nbsp;&lt;/span&gt;of a binary search tree, and an integer&lt;span&gt;&amp;nbsp;&lt;/span&gt;k, return&lt;span&gt;&amp;nbsp;&lt;/span&gt;the&lt;span&gt;&amp;nbsp;&lt;/span&gt;kth&lt;span&gt;&amp;nbsp;&lt;/span&gt;smallest value (&lt;b&gt;1-indexed&lt;/b&gt;) of all the values of the nodes in the tree.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 1:&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;212&quot; data-origin-height=&quot;301&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IqYWO/btrYjeNpd7a/n16u3jqfUpo6KQu9HxFIdK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IqYWO/btrYjeNpd7a/n16u3jqfUpo6KQu9HxFIdK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IqYWO/btrYjeNpd7a/n16u3jqfUpo6KQu9HxFIdK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIqYWO%2FbtrYjeNpd7a%2Fn16u3jqfUpo6KQu9HxFIdK%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;212&quot; height=&quot;301&quot; data-origin-width=&quot;212&quot; data-origin-height=&quot;301&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Input: root = [3,1,4,null,2], k = 1
Output: 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/H1zC8/btrYjV7G9v1/4R25smbmF3aWO22axc9wG0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/H1zC8/btrYjV7G9v1/4R25smbmF3aWO22axc9wG0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/H1zC8/btrYjV7G9v1/4R25smbmF3aWO22axc9wG0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FH1zC8%2FbtrYjV7G9v1%2F4R25smbmF3aWO22axc9wG0%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;382&quot; height=&quot;302&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;302&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Input: root = [5,3,6,2,4,null,null,1], k = 3
Output: 3
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;The number of nodes in the tree is&lt;span&gt;&amp;nbsp;&lt;/span&gt;n.&lt;/li&gt;
&lt;li&gt;1 &amp;lt;= k &amp;lt;= n &amp;lt;= 104&lt;/li&gt;
&lt;li&gt;0 &amp;lt;= Node.val &amp;lt;= 104&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Follow up:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;If the BST is modified often (i.e., we can do insert and delete operations) and you need to find the kth smallest frequently, how would you optimize?&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이진 탐색 트리 root와 정수 k가 주어졌을 때, 트리의 모든 노드 값 중 k번째로 작은 값을 찾는 문제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트리를 순회하는 방법에는 크게 3가지가 있으며 간단하게 각 순회의 탐색 순서는 다음과 같다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;전위 순회 (Preorder Traversal) : root 노드&amp;nbsp;&amp;rarr; 왼쪽 노드 &amp;rarr; 오른쪽 노드&lt;/li&gt;
&lt;li&gt;중위 순회 (Inorder Traversal) : 왼쪽 노드 &amp;rarr; root 노드 &amp;rarr; 오른쪽 노드&lt;/li&gt;
&lt;li&gt;후위 순회 (Postorder Traversal) : 왼쪽 노드 &amp;rarr; 오른쪽 노드 &amp;rarr; root 노드&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이진 탐색 트리의 특징은 왼쪽 노드의 값은 root 노드보다 작고, 오른쪽 노드의 값은 root 노드보다 큰 값으로 구성 되어 있기 때문에 (왼쪽 &amp;rarr; root &amp;rarr; 오른쪽) 순서대로 오름차순 정렬되어 있다고 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 문제에서는 제일 작은 수부터 차례대로 탐색해 k번째 노드를 찾아야 하므로 정렬된 순서대로 탐색이 가능한 중위 순회를 이용하여 풀이한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 탐색중인 노드가 몇 번째로 작은 숫자인지 저장할 변수와 정답을 저장할 변수 하나를 선언한다.&lt;/p&gt;
&lt;pre id=&quot;code_1675693400863&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int count = 0;
int answer = 0;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로 트리를 중위 순회하기위한 함수를 생성한다.&lt;br /&gt;왼쪽 노드부터 재귀적으로 호출하여 가장 작은 값부터 탐색을 시작하고 현재 탐색중인 노드의 카운트와 k가 같다면 정답 변수에 현재 노드 값을 저장하고 탐색을 종료한다. 현재 카운트가 k와 같지 않은 경우 오른쪽 노드를 탐색한다.&lt;br /&gt;만약 현재 노드가 null인 경우 탐색을 종료한다.&lt;/p&gt;
&lt;pre id=&quot;code_1675693512368&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 중위 순회
public void inorderTraversal(TreeNode node, int k){
    // 노드가 없다면 탐색 종료
    if(node == null) return;

    // 왼쪽 노드 탐색
    inorderTraversal(node.left, k);
    // 카운트를 증가시키고 그 값이 k와 같다면 현재 노드의 값을 정답으로 저장하고 탐색 종료
    if(++count == k) {
        answer = node.val;
        return;
    }
    // 오른쪽 노드 탐색
    inorderTraversal(node.right, k);
}&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;생성한 함수를 호출하여 결과값을 return한다.&lt;/p&gt;
&lt;pre id=&quot;code_1675693693369&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; public int kthSmallest(TreeNode root, int k) {
    inorderTraversal(root, k);

    return answer;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1675692798318&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    // 몇 번째로 작은 숫자인지 카운트를 저장할 변수
    int count = 0;
    int answer = 0;
    public int kthSmallest(TreeNode root, int k) {
        inorderTraversal(root, k);

        return answer;
    }

    // 중위 순회
    public void inorderTraversal(TreeNode node, int k){
        // 노드가 없다면 탐색 종료
        if(node == null) return;

        // 왼쪽 노드 탐색
        inorderTraversal(node.left, k);
        // 카운트를 증가시키고 그 값이 k와 같다면 현재 노드의 값을 정답으로 저장하고 탐색 종료
        if(++count == k) {
            answer = node.val;
            return;
        }
        // 오른쪽 노드 탐색
        inorderTraversal(node.right, k);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>binary search tree</category>
      <category>bst</category>
      <category>inorder traversal</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>이진탐색트리</category>
      <category>중위순회</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/134</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-230-Kth-Smallest-Element-in-a-BST-Java#entry134comment</comments>
      <pubDate>Mon, 6 Feb 2023 23:28:18 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 347. Top K Frequent Elements - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-347-Top-K-Frequent-Elements-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/top-k-frequent-elements/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/top-k-frequent-elements/description/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1675605303556&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;Top K Frequent Elements - LeetCode&quot; data-og-description=&quot;Top K Frequent Elements - Given an integer array nums and an integer k, return the k most frequent elements. You may return the answer in any order. &amp;nbsp; Example 1: Input: nums = [1,1,1,2,2,3], k = 2 Output: [1,2] Example 2: Input: nums = [1], k = 1 Output: &quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/top-k-frequent-elements/description/&quot; data-og-url=&quot;https://leetcode.com/problems/top-k-frequent-elements/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bQrHKg/hyRva4YXHY/z9WpKV087EiyJg1MEW4Jd0/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/dNWige/hyRvmRRBck/cmkjuk4Eigjn9fie1H2yKK/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/top-k-frequent-elements/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/top-k-frequent-elements/description/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bQrHKg/hyRva4YXHY/z9WpKV087EiyJg1MEW4Jd0/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/dNWige/hyRvmRRBck/cmkjuk4Eigjn9fie1H2yKK/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222');&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;Top K Frequent Elements - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Top K Frequent Elements - Given an integer array nums and an integer k, return the k most frequent elements. You may return the answer in any order. &amp;nbsp; Example 1: Input: nums = [1,1,1,2,2,3], k = 2 Output: [1,2] Example 2: Input: nums = [1], k = 1 Output:&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;Given an integer array&lt;span&gt;&amp;nbsp;&lt;/span&gt;nums&lt;span&gt;&amp;nbsp;&lt;/span&gt;and an integer&lt;span&gt;&amp;nbsp;&lt;/span&gt;k, return&lt;span&gt;&amp;nbsp;&lt;/span&gt;the&lt;span&gt;&amp;nbsp;&lt;/span&gt;k&lt;span&gt;&amp;nbsp;&lt;/span&gt;most frequent elements. You may return the answer in&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;any order&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Input: nums = [1,1,1,2,2,3], k = 2
Output: [1,2]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Input: nums = [1], k = 1
Output: [1]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1 &amp;lt;= nums.length &amp;lt;= 105&lt;/li&gt;
&lt;li&gt;-104 &amp;lt;= nums[i] &amp;lt;= 104&lt;/li&gt;
&lt;li&gt;k&lt;span&gt;&amp;nbsp;&lt;/span&gt;is in the range&lt;span&gt;&amp;nbsp;&lt;/span&gt;[1, the number of unique elements in the array].&lt;/li&gt;
&lt;li&gt;It is&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;guaranteed&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;that the answer is&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;unique&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Follow up:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Your algorithm's time complexity must be better than&lt;span&gt;&amp;nbsp;&lt;/span&gt;O(n log n), where n is the array's size.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열의 각 요소마다 사용된 개수를 map으로 저장하여 많이 나온 순서대로 k만큼 뽑아 결과로 return하도록 풀이한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 최종 정답을 return할 길이 k만큼의 배열을 하나 선언한다.&lt;/p&gt;
&lt;pre id=&quot;code_1675605971723&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 최종 return할 결과 배열
int[] answer = new int[k];&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;만약 nums 배열의 길이가 k와 같다면 배열의 요소가 한번씩 사용된 한가지 경우밖에 존재하지 않으므로 바로 nums 배열을 return 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1675606032955&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 배열의 숫자의 개수와 k값이 같다면 nums자체가 정답이 됨
if(nums.length == k) return nums;&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;num배열의 각 요소의 개수를 저장할 map을 선언하고 반복문을 통해 개수를 카운트하여 map에 저장한다.&lt;/p&gt;
&lt;pre id=&quot;code_1675606067067&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Map&amp;lt;Integer, Integer&amp;gt; countMap = new HashMap&amp;lt;&amp;gt;();
// num배열의 각 요소의 개수를 세며 map에 저장
for(int i : nums) {
    countMap.put(i, countMap.getOrDefault(i, 0) + 1);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로 가장 많이 사용된 요소부터 k개만큼 추출해야 하는데 우선순위큐를 이용하여 이 방법을 구현한다.&lt;br /&gt;nums 배열의 각 요소와 그 개수가 저장되어있는 countMap에서 두 번째 요소, 즉 각 요소의 개수를 기준으로 정렬하는 우선순위큐를 선언한다.&lt;/p&gt;
&lt;pre id=&quot;code_1675606154091&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 우선순위큐 생성
// countMap의 두 번째 요소 = 각 요소의 개수를 기준으로 정렬
PriorityQueue&amp;lt;Integer&amp;gt; pq = new PriorityQueue&amp;lt;&amp;gt;((o1, o2) -&amp;gt; countMap.get(o1) - countMap.get(o2));&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;nums 배열의 모든 요소값들을 순회하며 큐에 삽입한다. 이 때 필요한 요소의 개수는 k만큼이므로 만약 큐의 사이즈가 k를 넘어가는 경우 마지막 요소( = 우선순위가 가장 낮은 요소 = 제일 적게 사용된 요소 )를 제거한다&lt;/p&gt;
&lt;pre id=&quot;code_1675606234740&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// nums 배열의 모든 요소 값들을 큐에 삽입
for(int i : countMap.keySet()) {
    pq.add(i);
    // 큐의 길이가 k보다 커지는 경우 마지막 요소를 제거
    if(pq.size() &amp;gt; k) pq.poll();
}&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;큐의 값을 차례대로 뽑아 결과 배열에 저장하여 최종 return한다.&lt;/p&gt;
&lt;pre id=&quot;code_1675606252963&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 큐의 값을 차례대로 결과 배열에 저장하여 return
for(int i = 0; i &amp;lt; k; i++) {
    answer[i] = pq.poll();
}

return answer;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1675605307347&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        // 최종 return할 결과 배열
        int[] answer = new int[k];
        
        // 배열의 숫자의 개수와 k값이 같다면 nums자체가 정답이 됨
        if(nums.length == k) return nums;
        
        Map&amp;lt;Integer, Integer&amp;gt; countMap = new HashMap&amp;lt;&amp;gt;();
        // num배열의 각 요소의 개수를 세며 map에 저장
        for(int i : nums) {
            countMap.put(i, countMap.getOrDefault(i, 0) + 1);
        }
        
        // 우선순위큐 생성
        // countMap의 두 번째 요소 = 각 요소의 개수를 기준으로 정렬
        PriorityQueue&amp;lt;Integer&amp;gt; pq = new PriorityQueue&amp;lt;&amp;gt;((o1, o2) -&amp;gt; countMap.get(o1) - countMap.get(o2));
        // nums 배열의 모든 요소 값들을 큐에 삽입
        for(int i : countMap.keySet()) {
            pq.add(i);
            // 큐의 길이가 k보다 커지는 경우 마지막 요소를 제거
            if(pq.size() &amp;gt; k) pq.poll();
        }
        
        // 큐의 값을 차례대로 결과 배열에 저장하여 return
        for(int i = 0; i &amp;lt; k; i++) {
            answer[i] = pq.poll();
        }
        
        return answer;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>heap</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>priority queue</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>우선순위큐</category>
      <category>자바</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/133</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-347-Top-K-Frequent-Elements-Java#entry133comment</comments>
      <pubDate>Sun, 5 Feb 2023 23:10:56 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 49. Group Anagrams - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-49-Group-Anagrams-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/group-anagrams/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/group-anagrams/description/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1675519595406&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;Group Anagrams - LeetCode&quot; data-og-description=&quot;Group Anagrams - Given an array of strings strs, group the anagrams together. You can return the answer in any order. An Anagram is a word or phrase formed by rearranging the letters of a different word or phrase, typically using all the original letters e&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/group-anagrams/description/&quot; data-og-url=&quot;https://leetcode.com/problems/group-anagrams/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/pZfyZ/hyRvb97OiY/Ah2IWcqdfY8RdFkFReiuAk/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/FiPA8/hyRvhoXXly/LxIZxZL4GgeSnO5mkRYMF0/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/group-anagrams/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/group-anagrams/description/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/pZfyZ/hyRvb97OiY/Ah2IWcqdfY8RdFkFReiuAk/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/FiPA8/hyRvhoXXly/LxIZxZL4GgeSnO5mkRYMF0/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222');&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;Group Anagrams - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Group Anagrams - Given an array of strings strs, group the anagrams together. You can return the answer in any order. An Anagram is a word or phrase formed by rearranging the letters of a different word or phrase, typically using all the original letters e&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;Given an array of strings&lt;span&gt;&amp;nbsp;&lt;/span&gt;strs, group&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;the anagrams&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;together. You can return the answer in&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;any order&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;An&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Anagram&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is a word or phrase formed by rearranging the letters of a different word or phrase, typically using all the original letters exactly once.&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;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;Input: strs = [&quot;eat&quot;,&quot;tea&quot;,&quot;tan&quot;,&quot;ate&quot;,&quot;nat&quot;,&quot;bat&quot;]
Output: [[&quot;bat&quot;],[&quot;nat&quot;,&quot;tan&quot;],[&quot;ate&quot;,&quot;eat&quot;,&quot;tea&quot;]]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;lua&quot;&gt;&lt;code&gt;Input: strs = [&quot;&quot;]
Output: [[&quot;&quot;]]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 3:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;lua&quot;&gt;&lt;code&gt;Input: strs = [&quot;a&quot;]
Output: [[&quot;a&quot;]]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1 &amp;lt;= strs.length &amp;lt;= 104&lt;/li&gt;
&lt;li&gt;0 &amp;lt;= strs[i].length &amp;lt;= 100&lt;/li&gt;
&lt;li&gt;strs[i]&lt;span&gt;&amp;nbsp;&lt;/span&gt;consists of lowercase English letters.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알파벳 소문자로 이루어진 문자열들의 배열 strs가 주어질 때 각 단어들이 anagram이 되는 단어끼리 묶어서 리스트로 반환하는 문제이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;anagram이란 서로 다른 두 문자열의 문자 배치를 바꾸었을 때 같은 문자가 되는 문자열을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알파벳의 길이만큼의 배열을 하나 선언한뒤 각 문자마다 사용된 알파벳의 개수를 카운트하여 해당 결과를 해시값으로 사용한다.&lt;br /&gt;같은 해시값을 가진 문자끼리 묶어서 정답리스트에 추가하도록한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 최종 반환할 결과 리스트와 각 해시그룹별 문자열 리스트를 저장할 map을 선언한다.&lt;/p&gt;
&lt;pre id=&quot;code_1675519821733&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 최종 결과 리스트
List&amp;lt;List&amp;lt;String&amp;gt;&amp;gt; result = new ArrayList&amp;lt;&amp;gt;();

// 각 anagram 그룹별 문자열을 저장할 map
Map&amp;lt;String, List&amp;lt;String&amp;gt;&amp;gt; map = new HashMap&amp;lt;&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;주어진 strs배열의 문자열을 하나씩 탐색한다.&lt;br /&gt;각 문자열에서 사용된 알파벳 개수를 저장할 길이 26만큼의 정수배열을 하나 선언하고 현재 탐색중인 단어의 각 알파벳의 개수를 증가시킨다.&lt;br /&gt;알파벳 배열을 그대로 문자열로 변환하여 그룹키로 사용하고 map의 해당 key의 리스트에 현재 문자열을 추가한다.&lt;/p&gt;
&lt;pre id=&quot;code_1675519851956&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 문자열 하나씩 탐색
for(String word : strs) {
    // 문자열에서 사용된 알파벳 개수를 저장할 정수 배열
    int[] alphabet = new int[26];
    // 현재 탐색문자의 각 알파벳 탐색
    for(char c : word.toCharArray()) {
        // 해당하는 알파벳의 값을 증가
        alphabet[c - 'a']++;
    }
    // 알파벳 map을 문자열로 변환하여 그룹키로 사용
    String groupKey = Arrays.toString(alphabet);

    // map에 그룹키가 존재하지 않는다면 키를 추가
    if(!map.containsKey(groupKey)) {
        map.put(groupKey, new ArrayList&amp;lt;&amp;gt;());
    }

    // 해당 그룹키에 현재 문자열 추가
    map.get(groupKey).add(word);
}&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;map에 담긴 값들을 정답 리스트에 모두 추가하여 최종 return한다.&lt;/p&gt;
&lt;pre id=&quot;code_1675519996950&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// map의 값들을 정답 리스트에 추가
for(String key : map.keySet()) {
    result.add(map.get(key));
}

// 결과 리스트 return
return result;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1675519597765&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public List&amp;lt;List&amp;lt;String&amp;gt;&amp;gt; groupAnagrams(String[] strs) {
        // 최종 결과 리스트
        List&amp;lt;List&amp;lt;String&amp;gt;&amp;gt; result = new ArrayList&amp;lt;&amp;gt;();
        
        // 각 anagram 그룹별 문자열을 저장할 map
        Map&amp;lt;String, List&amp;lt;String&amp;gt;&amp;gt; map = new HashMap&amp;lt;&amp;gt;();
        // 문자열 하나씩 탐색
        for(String word : strs) {
            // 문자열에서 사용된 알파벳 개수를 저장할 정수 배열
            int[] alphabet = new int[26];
            // 현재 탐색문자의 각 알파벳 탐색
            for(char c : word.toCharArray()) {
                // 해당하는 알파벳의 값을 증가
                alphabet[c - 'a']++;
            }
            // 알파벳 map을 문자열로 변환하여 그룹키로 사용
            String groupKey = Arrays.toString(alphabet);
            
            // map에 그룹키가 존재하지 않는다면 키를 추가
            if(!map.containsKey(groupKey)) {
                map.put(groupKey, new ArrayList&amp;lt;&amp;gt;());
            }
            
            // 해당 그룹키에 현재 문자열 추가
            map.get(groupKey).add(word);
        }
        
        // map의 값들을 정답 리스트에 추가
        for(String key : map.keySet()) {
            result.add(map.get(key));
        }

        // 결과 리스트 return
        return result;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>anagram</category>
      <category>Group Anagrams</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>자바</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/132</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-49-Group-Anagrams-Java#entry132comment</comments>
      <pubDate>Sat, 4 Feb 2023 23:13:23 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 424. Longest Repeating Character Replacement - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-424-Longest-Repeating-Character-Replacement-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/longest-repeating-character-replacement/submissions/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/longest-repeating-character-replacement/submissions/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1675503154878&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Longest Repeating Character Replacement - LeetCode&quot; data-og-description=&quot;Longest Repeating Character Replacement - You are given a string s and an integer k. You can choose any character of the string and change it to any other uppercase English character. You can perform this operation at most k times. Return the length of the&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/longest-repeating-character-replacement/submissions/&quot; data-og-url=&quot;https://leetcode.com/problems/longest-repeating-character-replacement/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bWtY2D/hyRvmXSKDq/k2ZYqlAYl3BkOWuHLG1071/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/cUFmZF/hyRvd0UHGv/sgIkgT1bsyoGxX3xeIUOv0/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/longest-repeating-character-replacement/submissions/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/longest-repeating-character-replacement/submissions/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bWtY2D/hyRvmXSKDq/k2ZYqlAYl3BkOWuHLG1071/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/cUFmZF/hyRvd0UHGv/sgIkgT1bsyoGxX3xeIUOv0/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Longest Repeating Character Replacement - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Longest Repeating Character Replacement - You are given a string s and an integer k. You can choose any character of the string and change it to any other uppercase English character. You can perform this operation at most k times. Return the length of the&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;You are given a string&lt;span&gt;&amp;nbsp;&lt;/span&gt;s&lt;span&gt;&amp;nbsp;&lt;/span&gt;and an integer&lt;span&gt;&amp;nbsp;&lt;/span&gt;k. You can choose any character of the string and change it to any other uppercase English character. You can perform this operation at most&lt;span&gt;&amp;nbsp;&lt;/span&gt;k&lt;span&gt;&amp;nbsp;&lt;/span&gt;times.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Return&lt;span&gt;&amp;nbsp;&lt;/span&gt;the length of the longest substring containing the same letter you can get after performing the above operations.&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;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;Input: s = &quot;ABAB&quot;, k = 2
Output: 4
Explanation: Replace the two 'A's with two 'B's or vice versa.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;Input: s = &quot;AABABBA&quot;, k = 1
Output: 4
Explanation: Replace the one 'A' in the middle with 'B' and form &quot;AABBBBA&quot;.
The substring &quot;BBBB&quot; has the longest repeating letters, which is 4.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1 &amp;lt;= s.length &amp;lt;= 105&lt;/li&gt;
&lt;li&gt;s&lt;span&gt;&amp;nbsp;&lt;/span&gt;consists of only uppercase English letters.&lt;/li&gt;
&lt;li&gt;0 &amp;lt;= k &amp;lt;= s.length&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알파벳 대문자로만 이루이진 문자열 s와 바꿀수 있는 알파벳의 개수 k가 주어질 때 만들 수 있는 가장 긴 반복되는 문자열의 길이를 구하는 문제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열을 범위를 늘려가며 탐색하여 범위내에서 가장 많이 사용된 알파벳이 무엇인지 구하고 범위에서 가장 많이 사용된 알파벳의 개수를 뺀 나머지, 즉 바꿔야할 알파벳의 개수가 k보다 큰 지 비교한다.&amp;nbsp; &lt;br /&gt;k보다 작거나 같다면 탐색 범위의 종료지점을 증가시켜 탐색하고, 크다면 시작 지점과 종료 지점을 같이 증가시켜 최대 길이를 유지한채 탐색 범위를 이동한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 탐색 범위내에서 사용된 알파벳의 개수를 카운팅하기 위해 알파벳의 개수 만큼의 배열을 생성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1675503676620&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 알파벳의 개수를 카운팅할 배열
int[] alphabet = new int[26];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용된 알파벳 중 가장 많이 사용된 알파벳의 개수를 구하기 위한 함수도 하나 아래와 같이 생성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1675503899708&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 현재 탐색중인 범위내에서 가장 많이 사용된 알파벳의 개수를 반환
public int mostFreqVal() {
    int result = 0;

    for(int i : alphabet) {
        result = Math.max(result, i);
    }

    return result;
}&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;탐색 범위 내 가장 많이 나온 알파벳 개수를 저장할 변수와 탐색 시작지점 변수를 생성하고, 문자열 s의 첫 번째 알파벳의 개수를 증가시킨 상태로 탐색을 시작한다.&lt;/p&gt;
&lt;pre id=&quot;code_1675503748347&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 탐색 범위 내 가장 많이 나온 문자 개수
int max = 0;
// 첫 번째 문자 개수를 증가
alphabet[s.charAt(0) - 'A']++;
// 탐색중인 문자 범위의 왼쪽 인덱스값
int left = 0;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번째 문자부터 시작하여 문자열 s의 길이만큼 반복하여 탐색한다.&lt;br /&gt;현재 탐색중인 문자의 사용 개수를 1 증가시키고 가장 많이 사용된 알파벳의 개수 max를 구한다.&lt;br /&gt;이때 현재 탐색중인 범위에서 max를 뺀 개수, 즉 바꿔야할 알파벳의 개수가 k보다 큰 경우 왼쪽 인덱스에 해당하는 알파벳의 사용개수는 감소시키고 왼쪽 인덱스를 증가시킨다.&lt;/p&gt;
&lt;pre id=&quot;code_1675504007460&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 두 번째 문자부터 문자열의 길이만큼 탐색
for(int i = 1; i &amp;lt; s.length(); i++) {
    // 현재 탐색중인 문자의 사용 개수 증가
    alphabet[s.charAt(i) - 'A']++;
    max = mostFreqVal();

    // 현재 탐색중인 범위에서 가장 많이 사용된 알파벳을 뺀 개수,
    // 즉 바꿔야할 알파벳의 개수가 k보다 큰 경우
    if(i - left + 1 - max &amp;gt; k) {
        // 왼쪽 인덱스에 해당하는 알파벳 사용 개수를 감소
        alphabet[s.charAt(left) - 'A']--;
        // 탐색할 왼쪽 인덱스를 증가시킴
        left++;
    }
}&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;문자열의 길이에서 왼쪽 인덱스를 뺀 길이를 최종 return 한다.&lt;br /&gt;이 때 해당 범위의 문자열이 가장 긴 반복된 문자열은 아니며 단순히 길이만을 알 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1675504076107&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 문자열의 길이에서 왼쪽 인덱스를 뺀 값을 return
return s.length() - left;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1675503163186&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    // 알파벳의 개수를 카운팅할 배열
    int[] alphabet = new int[26];

    public int characterReplacement(String s, int k) {
        // 탐색 범위 내 가장 많이 나온 문자 개수
        int max = 0;
        // 첫 번째 문자 개수를 증가
        alphabet[s.charAt(0) - 'A']++;
        // 탐색중인 문자 범위의 왼쪽 인덱스값
        int left = 0;
        
        // 두 번째 문자부터 문자열의 길이만큼 탐색
        for(int i = 1; i &amp;lt; s.length(); i++) {
            // 현재 탐색중인 문자의 사용 개수 증가
            alphabet[s.charAt(i) - 'A']++;
            max = mostFreqVal();
            
            // 현재 탐색중인 범위에서 가장 많이 사용된 알파벳을 뺀 개수,
            // 즉 바꿔야할 알파벳의 개수가 k보다 큰 경우
            if(i - left + 1 - max &amp;gt; k) {
                // 왼쪽 인덱스에 해당하는 알파벳 사용 개수를 감소
                alphabet[s.charAt(left) - 'A']--;
                // 탐색할 왼쪽 인덱스를 증가시킴
                left++;
            }
        }
        
        // 문자열의 길이에서 왼쪽 인덱스를 뺀 값을 return
        return s.length() - left;
    }

    // 현재 탐색중인 범위내에서 가장 많이 사용된 알파벳의 개수를 반환
    public int mostFreqVal() {
        int result = 0;
        
        for(int i : alphabet) {
            result = Math.max(result, i);
        }
        
        return result;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>Longest Repeating Character Replacement</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>자바</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/131</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-424-Longest-Repeating-Character-Replacement-Java#entry131comment</comments>
      <pubDate>Sat, 4 Feb 2023 18:49:06 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 98. Validate Binary Search Tree - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-98-Validate-Binary-Search-Tree-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/validate-binary-search-tree/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/validate-binary-search-tree/description/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1675086262853&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;Validate Binary Search Tree - LeetCode&quot; data-og-description=&quot;Validate Binary Search Tree - Given the root of a binary tree, determine if it is a valid binary search tree (BST). A valid BST is defined as follows: * The left subtree of a node contains only nodes with keys less than the node's key. * The right subtree &quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/validate-binary-search-tree/description/&quot; data-og-url=&quot;https://leetcode.com/problems/validate-binary-search-tree/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/gXpNv/hyRssbWuOM/zMciI779LQKMahtTMNzYTK/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/IUlpM/hyRq5Qdl5T/jCiGmXYislZDdTXkgDlABk/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222,https://scrap.kakaocdn.net/dn/pxFiv/hyRssJMtIc/7Yg0CGQ8qXF23zD5iWVPZK/img.jpg?width=422&amp;amp;height=292&amp;amp;face=0_0_422_292&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/validate-binary-search-tree/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/validate-binary-search-tree/description/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/gXpNv/hyRssbWuOM/zMciI779LQKMahtTMNzYTK/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/IUlpM/hyRq5Qdl5T/jCiGmXYislZDdTXkgDlABk/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222,https://scrap.kakaocdn.net/dn/pxFiv/hyRssJMtIc/7Yg0CGQ8qXF23zD5iWVPZK/img.jpg?width=422&amp;amp;height=292&amp;amp;face=0_0_422_292');&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;Validate Binary Search Tree - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Validate Binary Search Tree - Given the root of a binary tree, determine if it is a valid binary search tree (BST). A valid BST is defined as follows: * The left subtree of a node contains only nodes with keys less than the node's key. * The right subtree&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;Given the&lt;span&gt;&amp;nbsp;&lt;/span&gt;root&lt;span&gt;&amp;nbsp;&lt;/span&gt;of a binary tree,&lt;span&gt;&amp;nbsp;&lt;/span&gt;determine if it is a valid binary search tree (BST).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;valid BST&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is defined as follows:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;The left&lt;span&gt;&amp;nbsp;&lt;/span&gt;
&lt;div data-headlessui-state=&quot;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;headlessui-popover-button-37&quot; data-headlessui-state=&quot;&quot;&gt;subtree&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;span&gt;&amp;nbsp;&lt;/span&gt;of a node contains only nodes with keys&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;less than&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;the node's key.&lt;/li&gt;
&lt;li&gt;The right subtree of a node contains only nodes with keys&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;greater than&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;the node's key.&lt;/li&gt;
&lt;li&gt;Both the left and right subtrees must also be binary search trees.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 1:&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;302&quot; data-origin-height=&quot;182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGhQEj/btrXCio2fPn/bMR1Z3RaO31Ila8ahpJbq0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGhQEj/btrXCio2fPn/bMR1Z3RaO31Ila8ahpJbq0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGhQEj/btrXCio2fPn/bMR1Z3RaO31Ila8ahpJbq0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGhQEj%2FbtrXCio2fPn%2FbMR1Z3RaO31Ila8ahpJbq0%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;302&quot; height=&quot;182&quot; data-origin-width=&quot;302&quot; data-origin-height=&quot;182&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Input: root = [2,1,3]
Output: true
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;292&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/52gkZ/btrXBOBIj8l/BKqzywpAlkFumsKTSs7o61/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/52gkZ/btrXBOBIj8l/BKqzywpAlkFumsKTSs7o61/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/52gkZ/btrXBOBIj8l/BKqzywpAlkFumsKTSs7o61/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F52gkZ%2FbtrXBOBIj8l%2FBKqzywpAlkFumsKTSs7o61%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;422&quot; height=&quot;292&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;292&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;Input: root = [5,1,4,null,null,3,6]
Output: false
Explanation: The root node's value is 5 but its right child's value is 4.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;The number of nodes in the tree is in the range&lt;span&gt;&amp;nbsp;&lt;/span&gt;[1, 104].&lt;/li&gt;
&lt;li&gt;-231 &amp;lt;= Node.val &amp;lt;= 231 - 1&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이진 트리 root가 주어졌을 때 주어진 트리가 이진 탐색 트리인지 여부를 판단하는 문제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 이진탐색트리의 정의는 다음과 같다&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;노드의 왼쪽 서브트리는 모두 노드의 값보다 작은 값으로만 이루어진다.&lt;/li&gt;
&lt;li&gt;노드의 오른쪽 서브트리는 모두 노드의 값보다 큰 값으로만 이루어진다.&lt;/li&gt;
&lt;li&gt;왼쪽과 오른쪽 서브트리 역시 모두 이진탐색트리이다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재귀를 통하여 풀이한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 재귀에 사용할 함수를 생성한다. 함수는 현재 노드와 현재 노드가 유효한 노드가 되는 최소값, 최대값을 인자로 받는다.&lt;br /&gt;현재 노드가 null인 경우 모든 유효성 체크를 통과하고 마지막에 도달한 것이므로 true를 return한다.&lt;br /&gt;현재 노드가 유효한 노드가 되는 최소값 이하인 경우 1번 정의에 어긋나므로 false를 return하고 반대로 최대값 이상인 경우에도 2번 정의에 어긋나므로 false를 return한다.&lt;br /&gt;이후 왼쪽과 오른쪽 노드에 대해서 재귀적으로 탐색한다.&lt;br /&gt;이 때 왼쪽노드를 탐색하는 경우 최대값을 현재 노드값으로 설정하고 오른쪽노드를 탐색하는 경우 최소값을 현재 노드값으로 설정한다.&lt;/p&gt;
&lt;pre id=&quot;code_1675086870794&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public boolean isValid(TreeNode root, Integer min, Integer max){
    // 현재 노드가 null 이면 모든 유효성 체크를 통과해 마지막에 도달한 것이므로 true를 return
    if(root == null) return true;
    // 현재 노드가 유효한 노드가 되는 최소값 이하인 경우 false를 return
    if(min != null &amp;amp;&amp;amp; root.val &amp;lt;= min) return false;
    // 현재 노드가 유효한 노드가 되는 최대값 이상인 경우 false를 return
    if(max != null &amp;amp;&amp;amp; root.val &amp;gt;= max) return false;

    // 왼쪽, 오른쪽 노드에 대해 탐색
    return isValid(root.left, min, root.val) &amp;amp;&amp;amp; isValid(root.right, root.val, max);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성한 함수를 호출하여 정답을 return한다. 최초 root 노드를 호출할 때에는 최소값과 최대값을 각각 null로 설정한다.&lt;/p&gt;
&lt;pre id=&quot;code_1675086972025&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public boolean isValidBST(TreeNode root) {
    return isValid(root, null, null);
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1675086266298&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public boolean isValidBST(TreeNode root) {
        return isValid(root, null, null);
    }

    /**
     * @param root  트리의 root 노드
     * @param min   현재 노드가 유효한 노드가 되는 최소값
     * @param max   현재 노드가 유효한 노드가 되는 최대값
     * @return
     */
    public boolean isValid(TreeNode root, Integer min, Integer max){
        // 현재 노드가 null 이면 모든 유효성 체크를 통과해 마지막에 도달한 것이므로 true를 return
        if(root == null) return true;
        // 현재 노드가 유효한 노드가 되는 최소값 이하인 경우 false를 return
        if(min != null &amp;amp;&amp;amp; root.val &amp;lt;= min) return false;
        // 현재 노드가 유효한 노드가 되는 최대값 이상인 경우 false를 return
        if(max != null &amp;amp;&amp;amp; root.val &amp;gt;= max) return false;

        // 왼쪽, 오른쪽 노드에 대해 탐색
        return isValid(root.left, min, root.val) &amp;amp;&amp;amp; isValid(root.right, root.val, max);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>bst</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>tree</category>
      <category>Validate Binary Search Tree</category>
      <category>알고리즘</category>
      <category>이진탐색트리</category>
      <category>자바</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/130</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-98-Validate-Binary-Search-Tree-Java#entry130comment</comments>
      <pubDate>Mon, 30 Jan 2023 22:56:37 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 79. Word Search - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-79-Word-Search-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/word-search/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/word-search/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1674998707742&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;Word Search - LeetCode&quot; data-og-description=&quot;Word Search - Given an m x n grid of characters board and a string word, return true if word exists in the grid. The word can be constructed from letters of sequentially adjacent cells, where adjacent cells are horizontally or vertically neighboring. The s&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/word-search/&quot; data-og-url=&quot;https://leetcode.com/problems/word-search/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bihA6z/hyRqYJxG6V/BSLcN4zcQKIeUtQRKvQo90/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/9LkTS/hyRqXKC8oy/xcoSKB0pCHYtQwhHs2tRA0/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222,https://scrap.kakaocdn.net/dn/j6JLs/hyRqYpe4FK/3ASlFfnywEatK4Rx4vmFdk/img.jpg?width=322&amp;amp;height=242&amp;amp;face=0_0_322_242&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/word-search/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/word-search/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bihA6z/hyRqYJxG6V/BSLcN4zcQKIeUtQRKvQo90/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/9LkTS/hyRqXKC8oy/xcoSKB0pCHYtQwhHs2tRA0/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222,https://scrap.kakaocdn.net/dn/j6JLs/hyRqYpe4FK/3ASlFfnywEatK4Rx4vmFdk/img.jpg?width=322&amp;amp;height=242&amp;amp;face=0_0_322_242');&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;Word Search - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Word Search - Given an m x n grid of characters board and a string word, return true if word exists in the grid. The word can be constructed from letters of sequentially adjacent cells, where adjacent cells are horizontally or vertically neighboring. The s&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;Given an&lt;span&gt;&amp;nbsp;&lt;/span&gt;m x n&lt;span&gt;&amp;nbsp;&lt;/span&gt;grid of characters&lt;span&gt;&amp;nbsp;&lt;/span&gt;board&lt;span&gt;&amp;nbsp;&lt;/span&gt;and a string&lt;span&gt;&amp;nbsp;&lt;/span&gt;word, return&lt;span&gt;&amp;nbsp;&lt;/span&gt;true&lt;span&gt;&amp;nbsp;&lt;/span&gt;if&lt;span&gt;&amp;nbsp;&lt;/span&gt;word&lt;span&gt;&amp;nbsp;&lt;/span&gt;exists in the grid.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The word can be constructed from letters of sequentially adjacent cells, where adjacent cells are horizontally or vertically neighboring. The same letter cell may not be used more than once.&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;Example 1:&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;322&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0baYs/btrXt9ej2U7/GsVsKkKJvzLsPqPIP8FcwK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0baYs/btrXt9ej2U7/GsVsKkKJvzLsPqPIP8FcwK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0baYs/btrXt9ej2U7/GsVsKkKJvzLsPqPIP8FcwK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0baYs%2FbtrXt9ej2U7%2FGsVsKkKJvzLsPqPIP8FcwK%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;322&quot; height=&quot;242&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;242&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;Input: board = [[&quot;A&quot;,&quot;B&quot;,&quot;C&quot;,&quot;E&quot;],[&quot;S&quot;,&quot;F&quot;,&quot;C&quot;,&quot;S&quot;],[&quot;A&quot;,&quot;D&quot;,&quot;E&quot;,&quot;E&quot;]], word = &quot;ABCCED&quot;
Output: true
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYZQlf/btrXn7vjNIj/FQSF7HRWrtNVTM8BoaCUbk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYZQlf/btrXn7vjNIj/FQSF7HRWrtNVTM8BoaCUbk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYZQlf/btrXn7vjNIj/FQSF7HRWrtNVTM8BoaCUbk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYZQlf%2FbtrXn7vjNIj%2FFQSF7HRWrtNVTM8BoaCUbk%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;322&quot; height=&quot;242&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;242&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;Input: board = [[&quot;A&quot;,&quot;B&quot;,&quot;C&quot;,&quot;E&quot;],[&quot;S&quot;,&quot;F&quot;,&quot;C&quot;,&quot;S&quot;],[&quot;A&quot;,&quot;D&quot;,&quot;E&quot;,&quot;E&quot;]], word = &quot;SEE&quot;
Output: true
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 3:&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;322&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ASjqJ/btrXrMDGggt/Hp5aQ5uJCvk2EvtNBNF6R0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ASjqJ/btrXrMDGggt/Hp5aQ5uJCvk2EvtNBNF6R0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ASjqJ/btrXrMDGggt/Hp5aQ5uJCvk2EvtNBNF6R0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FASjqJ%2FbtrXrMDGggt%2FHp5aQ5uJCvk2EvtNBNF6R0%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;322&quot; height=&quot;242&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;242&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;prolog&quot;&gt;&lt;code&gt;Input: board = [[&quot;A&quot;,&quot;B&quot;,&quot;C&quot;,&quot;E&quot;],[&quot;S&quot;,&quot;F&quot;,&quot;C&quot;,&quot;S&quot;],[&quot;A&quot;,&quot;D&quot;,&quot;E&quot;,&quot;E&quot;]], word = &quot;ABCB&quot;
Output: 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;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;m == board.length&lt;/li&gt;
&lt;li&gt;n = board[i].length&lt;/li&gt;
&lt;li&gt;1 &amp;lt;= m, n &amp;lt;= 6&lt;/li&gt;
&lt;li&gt;1 &amp;lt;= word.length &amp;lt;= 15&lt;/li&gt;
&lt;li&gt;board&lt;span&gt;&amp;nbsp;&lt;/span&gt;and&lt;span&gt;&amp;nbsp;&lt;/span&gt;word&lt;span&gt;&amp;nbsp;&lt;/span&gt;consists of only lowercase and uppercase English letters.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;m x n 사이즈의 2차원 배열이 주어지고 각 셀에는 알파벳이 들어있다. 찾아야하는 단어 word가 주어질 때 word가 이어진 셀로 존재한다면 true를 return한다.&lt;br /&gt;이 때 동일한 셀은 중복해서 사용할 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dfs를 사용하여 풀이한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 탐색에 사용할 함수를 생성한다.&lt;br /&gt;탐색에 사용할 파라미터는 문자를 탐색할 대상 배열, 찾을 대상 단어, 단어 중 현재 탐색할 알파벳의 인덱스, 배열의 x좌표, 배열의 y좌표로 구성한다.&lt;br /&gt;탐색 결과에 따라 true 혹은 false를 반환하도록 한다&lt;/p&gt;
&lt;pre id=&quot;code_1674999031289&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/**
 * @param board         : 문자를 탐색할 대상 배열
 * @param word          : 찾을 대상 단어
 * @param wordIndex     : 현재 탐색중인 단어의 인덱스
 * @param x             : 배열의 x좌표
 * @param y             : 배열의 y좌표
 * @return
 */
public boolean wordSearch(char[][] board, String word, int wordIndex, int x, int y) {

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 내에서는 아래의 조건들을 판단한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 현재 탐색중인 단어의 인덱스가 찾을 대상 단어의 인덱스와 같다면, 즉 단어의 길이만큼 탐색한 경우 word의 모든 알파벳을 비교한 것이므로 글자가 존재한다고 볼 수 있다. 따라서 true를 return 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1674999212833&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;boolean result = false;
// 단어의 길이만큼 탐색했다면 글자가 존재하므로 true를 return
if(wordIndex == word.length()) return true;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. x,y의 좌표가 배열을 벗어난다면 탐색이 불가능하므로 false를 return한다.&lt;/p&gt;
&lt;pre id=&quot;code_1674999246136&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 좌표가 배열을 벗어난다면 false를 return
if(x &amp;lt; 0 || y &amp;lt; 0 || x &amp;gt;= board.length || y &amp;gt;= board[0].length) return 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;3. 이미 방문한 좌표를 재방문하는 경우 중복된 셀을 사용할 수 없으므로 false를 return한다.&lt;br /&gt;이때 방문한 좌표의 값은 '*'로 변경하여 판단하기로 한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1674999302616&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 이미 방문했다면 false를 return
if(board[x][y] == '*') return 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;4. 현재 좌표값과 탐색 중인 문자가 일치하지 않는 경우 더 이상 탐색이 불필요하므로 false를 return한다.&lt;/p&gt;
&lt;pre id=&quot;code_1674999347776&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 문자가 일치하지 않는 경우 false를 return
if(board[x][y] != word.charAt(wordIndex)) return 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;5. 이외의 경우는 현재 좌표의 값과 탐색 중인 문자가 일치하는 경우이다.&lt;br /&gt;이 경우에는 현재 좌표 값을 방문의 의미로 '*'로 세팅하고 상, 하, 좌, 우에 대해 단어 인덱스를 증가시켜 재탐색한다.&lt;br /&gt;상하좌우를 탐색하기 위해 x,y좌표에 대한 이동 방향을 전역변수로 세팅하여 사용한다.&lt;br /&gt;상하좌우에 대해 탐색한 결과값이 true가 나오는 경우 탐색을 중단한다. 해당 좌표에서 탐색이 종료되면 방문 표시 해두었던 '*' 값을 다시 원래의 값으로 되돌리고 결과값을 return한다.&lt;/p&gt;
&lt;pre id=&quot;code_1674999513997&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    // 좌표의 이동 방향 ( 상, 하, 좌, 우 )
    int[] dx = {-1, 1, 0, 0};
    int[] dy = {0, 0, -1, 1};
    
    ...
    
    // 방문 표시
    board[x][y] = '*';
    // 상하좌우 탐색
    for(int i = 0; i &amp;lt; 4; i++) {
        result = wordSearch(board, word, wordIndex + 1, x + dx[i], y + dy[i]);
        if(result) break;
    }
    // 방문 표시 해제
    board[x][y] = word.charAt(wordIndex);
    
    // 결과값 return
    return result;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성한 함수를 이용하여 배열의 모든 요소에 대해서 탐색한다.&lt;br /&gt;탐색 중 true값이 return되는 경우 탐색을 중지하고 true를 최종 결과로 return한다.&lt;/p&gt;
&lt;pre id=&quot;code_1674999672250&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public boolean exist(char[][] board, String word) {
    boolean result = false;
    int m = board.length;
    int n = board[0].length;

    // 배열의 요소 탐색
    for(int i = 0; i &amp;lt; m; i ++) {
        for(int j = 0; j &amp;lt; n; j++) {
            // 찾고자 하는 단어가 존재하는 경우 true를 return
            if(wordSearch(board, word, 0, i, j)) return true;
        }
    }

    return result;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1674998714800&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    // 좌표의 이동 방향 ( 상, 하, 좌, 우 )
    int[] dx = {-1, 1, 0, 0};
    int[] dy = {0, 0, -1, 1};

    public boolean exist(char[][] board, String word) {
        boolean result = false;
        int m = board.length;
        int n = board[0].length;
        
        // 배열의 요소 탐색
        for(int i = 0; i &amp;lt; m; i ++) {
            for(int j = 0; j &amp;lt; n; j++) {
                // 찾고자 하는 단어가 존재하는 경우 true를 return
                if(wordSearch(board, word, 0, i, j)) return true;
            }
        }

        return result;
    }

    /**
     * @param board         : 문자를 탐색할 대상 배열
     * @param word          : 찾을 대상 단어
     * @param wordIndex     : 현재 탐색중인 단어의 인덱스
     * @param x             : 배열의 x좌표
     * @param y             : 배열의 y좌표
     * @return
     */
    public boolean wordSearch(char[][] board, String word, int wordIndex, int x, int y) {
        boolean result = false;
        // 단어의 길이만큼 탐색했다면 글자가 존재하므로 true를 return
        if(wordIndex == word.length()) return true;
        // 좌표가 배열을 벗어난다면 false를 return
        if(x &amp;lt; 0 || y &amp;lt; 0 || x &amp;gt;= board.length || y &amp;gt;= board[0].length) return false;
        // 이미 방문했다면 false를 return
        if(board[x][y] == '*') return false;
        // 문자가 일치하지 않는 경우 false를 return
        if(board[x][y] != word.charAt(wordIndex)) return false;
        
        // 방문 표시
        board[x][y] = '*';
        // 상하좌우 탐색
        for(int i = 0; i &amp;lt; 4; i++) {
            result = wordSearch(board, word, wordIndex + 1, x + dx[i], y + dy[i]);
            if(result) break;
        }
        // 방문 표시 해제
        board[x][y] = word.charAt(wordIndex);
        
        // 결과값 return
        return result;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>Matrix</category>
      <category>Word Search</category>
      <category>배열</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>자바</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/129</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-79-Word-Search-Java#entry129comment</comments>
      <pubDate>Sun, 29 Jan 2023 22:41:51 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 48. Rotate Image - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-48-Rotate-Image-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/rotate-image/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/rotate-image/description/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1674913865316&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;Rotate Image - LeetCode&quot; data-og-description=&quot;Rotate Image - You are given an n x n 2D matrix representing an image, rotate the image by 90 degrees (clockwise). You have to rotate the image in-place [https://en.wikipedia.org/wiki/In-place_algorithm], which means you have to modify the input 2D matrix &quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/rotate-image/description/&quot; data-og-url=&quot;https://leetcode.com/problems/rotate-image/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dM6Yaz/hyRq9DuLGS/2uaBUtfuNVzzuQdpbM9AJk/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/1AshA/hyRq7ZYGSE/pTymZFVbJ963G0vNCYDWc1/img.jpg?width=802&amp;amp;height=322&amp;amp;face=0_0_802_322,https://scrap.kakaocdn.net/dn/8u9sH/hyRpHBO0As/ViqKzD8Kxpp9kgKW4RbRYK/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/rotate-image/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/rotate-image/description/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dM6Yaz/hyRq9DuLGS/2uaBUtfuNVzzuQdpbM9AJk/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/1AshA/hyRq7ZYGSE/pTymZFVbJ963G0vNCYDWc1/img.jpg?width=802&amp;amp;height=322&amp;amp;face=0_0_802_322,https://scrap.kakaocdn.net/dn/8u9sH/hyRpHBO0As/ViqKzD8Kxpp9kgKW4RbRYK/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222');&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;Rotate Image - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Rotate Image - You are given an n x n 2D matrix representing an image, rotate the image by 90 degrees (clockwise). You have to rotate the image in-place [https://en.wikipedia.org/wiki/In-place_algorithm], which means you have to modify the input 2D matrix&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;You are given an&lt;span&gt;&amp;nbsp;&lt;/span&gt;n x n&lt;span&gt;&amp;nbsp;&lt;/span&gt;2D&lt;span&gt;&amp;nbsp;&lt;/span&gt;matrix&lt;span&gt;&amp;nbsp;&lt;/span&gt;representing an image, rotate the image by&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;90&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;degrees (clockwise).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;You have to rotate the image&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/In-place_algorithm&quot;&gt;&lt;b&gt;in-place&lt;/b&gt;&lt;/a&gt;, which means you have to modify the input 2D matrix directly.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;DO NOT&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;allocate another 2D matrix and do the rotation.&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;Example 1:&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;642&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3HVlH/btrXqrzfppf/jUKPkwtQd47el9vDqpK9uK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3HVlH/btrXqrzfppf/jUKPkwtQd47el9vDqpK9uK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3HVlH/btrXqrzfppf/jUKPkwtQd47el9vDqpK9uK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3HVlH%2FbtrXqrzfppf%2FjUKPkwtQd47el9vDqpK9uK%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;642&quot; height=&quot;242&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;242&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Input: matrix = [[1,2,3],[4,5,6],[7,8,9]]
Output: [[7,4,1],[8,5,2],[9,6,3]]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mx9Nx/btrXrT3mgDU/DkjrNGsZScuqKu7Zynn5sk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mx9Nx/btrXrT3mgDU/DkjrNGsZScuqKu7Zynn5sk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mx9Nx/btrXrT3mgDU/DkjrNGsZScuqKu7Zynn5sk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmx9Nx%2FbtrXrT3mgDU%2FDkjrNGsZScuqKu7Zynn5sk%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;802&quot; height=&quot;322&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;322&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Input: matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
Output: [[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;n == matrix.length == matrix[i].length&lt;/li&gt;
&lt;li&gt;1 &amp;lt;= n &amp;lt;= 20&lt;/li&gt;
&lt;li&gt;-1000 &amp;lt;= matrix[i][j] &amp;lt;= 1000&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n x n 사이즈의 정사각형 모양 2차원 배열이 주어질 때 시계방향으로 90도 회전한 배열을 구해야한다.&lt;br /&gt;다만 완성된 배열은 새로 만들어진 다른 2차원 배열이 아닌 주어진 배열안에서만 값을 변경하여야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가운데 행을 기준으로 위아래 요소들을 반전시키고 왼쪽 위부터 오른쪽 아래를 잇는 선을 기준으로 요소들을 반전시키면 시계방향으로 90도 회전시킨 모양을 얻을 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;813&quot; data-origin-height=&quot;284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNnMgS/btrXqD7xQZz/Y9t0LavbbDOmBOSWiWQqjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNnMgS/btrXqD7xQZz/Y9t0LavbbDOmBOSWiWQqjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNnMgS/btrXqD7xQZz/Y9t0LavbbDOmBOSWiWQqjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNnMgS%2FbtrXqD7xQZz%2FY9t0LavbbDOmBOSWiWQqjk%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;813&quot; height=&quot;284&quot; data-origin-width=&quot;813&quot; data-origin-height=&quot;284&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;813&quot; data-origin-height=&quot;284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rMAe8/btrXqCHzDQR/qA57Vks2EiHJlAfUxyslN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rMAe8/btrXqCHzDQR/qA57Vks2EiHJlAfUxyslN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rMAe8/btrXqCHzDQR/qA57Vks2EiHJlAfUxyslN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrMAe8%2FbtrXqCHzDQR%2FqA57Vks2EiHJlAfUxyslN1%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;813&quot; height=&quot;284&quot; data-origin-width=&quot;813&quot; data-origin-height=&quot;284&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/be3GbC/btrXtSC8uiJ/TyCPkI3htUzbLP1OgkXKh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/be3GbC/btrXtSC8uiJ/TyCPkI3htUzbLP1OgkXKh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/be3GbC/btrXtSC8uiJ/TyCPkI3htUzbLP1OgkXKh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbe3GbC%2FbtrXtSC8uiJ%2FTyCPkI3htUzbLP1OgkXKh0%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;929&quot; height=&quot;345&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;345&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uwWNI/btrXoC2m6Je/KiWytWIyZze0SZYR0LPEPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uwWNI/btrXoC2m6Je/KiWytWIyZze0SZYR0LPEPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uwWNI/btrXoC2m6Je/KiWytWIyZze0SZYR0LPEPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuwWNI%2FbtrXoC2m6Je%2FKiWytWIyZze0SZYR0LPEPk%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;929&quot; height=&quot;344&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;344&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;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1674913872040&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public void rotate(int[][] matrix) {
        int length = matrix.length;
        // 배열의 값을 교체할 때 사용할 임시 변수
        int temp  = 0;
        
        // 가운데 행을 기준으로 위아래를 반전
        for(int i = 0; i &amp;lt; length/2; i++) {
            for(int j = 0; j &amp;lt; length; j++) {
                temp = matrix[i][j];
                matrix[i][j] = matrix[length - i - 1][j];
                matrix[length - i - 1][j] = temp;
            }
        }
        
        // 왼쪽위부터 오른쪽아래를 잇는 선을 기준으로 반전
        for(int i = 0; i &amp;lt; length; i++) {
            for(int j = i; j &amp;lt; length; j++) {
                temp = matrix[i][j];
                matrix[i][j] = matrix[j][i];
                matrix[j][i] = temp;
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>Matrix</category>
      <category>Rotate Image</category>
      <category>배열</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>자바</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/128</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-48-Rotate-Image-Java#entry128comment</comments>
      <pubDate>Sat, 28 Jan 2023 23:03:38 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 54. Spiral Matrix - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-54-Spiral-Matrix-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/spiral-matrix/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/spiral-matrix/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1674744961721&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;Spiral Matrix - LeetCode&quot; data-og-description=&quot;Spiral Matrix - Given an m x n matrix, return all elements of the matrix in spiral order. &amp;nbsp; Example 1: [https://assets.leetcode.com/uploads/2020/11/13/spiral1.jpg] Input: matrix = [[1,2,3],[4,5,6],[7,8,9]] Output: [1,2,3,6,9,8,7,4,5] Example 2: [https://a&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/spiral-matrix/&quot; data-og-url=&quot;https://leetcode.com/problems/spiral-matrix/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/mfevc/hyRoC8qXCC/hORMqXrVDWo71oAUxi0vdK/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/VYPlC/hyRpQxeMvh/DR9JSS9bKS0JnSxbk5UoCk/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222,https://scrap.kakaocdn.net/dn/bdav6O/hyRpRpm5Kg/TK3RozNECVNMEW7wPaUjoK/img.jpg?width=322&amp;amp;height=242&amp;amp;face=0_0_322_242&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/spiral-matrix/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/spiral-matrix/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/mfevc/hyRoC8qXCC/hORMqXrVDWo71oAUxi0vdK/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/VYPlC/hyRpQxeMvh/DR9JSS9bKS0JnSxbk5UoCk/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222,https://scrap.kakaocdn.net/dn/bdav6O/hyRpRpm5Kg/TK3RozNECVNMEW7wPaUjoK/img.jpg?width=322&amp;amp;height=242&amp;amp;face=0_0_322_242');&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;Spiral Matrix - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Spiral Matrix - Given an m x n matrix, return all elements of the matrix in spiral order. &amp;nbsp; Example 1: [https://assets.leetcode.com/uploads/2020/11/13/spiral1.jpg] Input: matrix = [[1,2,3],[4,5,6],[7,8,9]] Output: [1,2,3,6,9,8,7,4,5] Example 2: [https://a&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;Given an&lt;span&gt;&amp;nbsp;&lt;/span&gt;m x n&lt;span&gt;&amp;nbsp;&lt;/span&gt;matrix, return&lt;span&gt;&amp;nbsp;&lt;/span&gt;all elements of the&lt;span&gt;&amp;nbsp;&lt;/span&gt;matrix&lt;span&gt;&amp;nbsp;&lt;/span&gt;in spiral order.&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;Example 1:&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;242&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvMbBL/btrXhP1E8MB/RPzb3JZR6marDD9HmGL7ik/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvMbBL/btrXhP1E8MB/RPzb3JZR6marDD9HmGL7ik/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvMbBL/btrXhP1E8MB/RPzb3JZR6marDD9HmGL7ik/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvMbBL%2FbtrXhP1E8MB%2FRPzb3JZR6marDD9HmGL7ik%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;242&quot; height=&quot;242&quot; data-origin-width=&quot;242&quot; data-origin-height=&quot;242&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Input: matrix = [[1,2,3],[4,5,6],[7,8,9]]
Output: [1,2,3,6,9,8,7,4,5]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beGTTJ/btrXi5bRgMX/qgDysR6s49UamuBUc7ecxK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beGTTJ/btrXi5bRgMX/qgDysR6s49UamuBUc7ecxK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beGTTJ/btrXi5bRgMX/qgDysR6s49UamuBUc7ecxK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeGTTJ%2FbtrXi5bRgMX%2FqgDysR6s49UamuBUc7ecxK%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;322&quot; height=&quot;242&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;242&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Input: matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
Output: [1,2,3,4,8,12,11,10,9,5,6,7]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;m == matrix.length&lt;/li&gt;
&lt;li&gt;n == matrix[i].length&lt;/li&gt;
&lt;li&gt;1 &amp;lt;= m, n &amp;lt;= 10&lt;/li&gt;
&lt;li&gt;-100 &amp;lt;= matrix[i][j] &amp;lt;= 100&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;m*n 크기의 2차원 배열 matrix가 주어질 때 배열의 요소들을 나선방향으로 돌면서 구하는 문제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 풀이에 필요한 변수들을 선언한다.&lt;/p&gt;
&lt;pre id=&quot;code_1674745070024&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 행의 길이
int m = matrix.length;
// 열의 길이
int n = matrix[0].length;
// matrix 배열의 요소 개수 크기만큼의 정답 배열 선언
List&amp;lt;Integer&amp;gt; answer = new ArrayList&amp;lt;&amp;gt;();
// 방향에 따라 이동할 x,y좌표 값
// 오른쪽, 아래, 왼쪽, 위
int[] dirX = {0, 1, 0, -1};
int[] dirY = {1, 0, -1, 0};
// 방향을 나타낼 포인터
int dir = 0;
// 시작 x좌표
int x = 0;
// 시작 y좌표
int y = 0;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;matrix 배열 요소의 길이만큼 반복하며 탐색 한다.&lt;br /&gt;현재 탐색중인 좌표의 값을 정답 리스트에 추가하고 방문 여부를 체크하기위해 배열요소의 최대값인 100보다 큰 값으로 현재 요소 값을 변경한다.&lt;br /&gt;그 후 이동할 방향에 따라 이동한 x,y 좌표가 배열을 벗어나거나 이미 방문한 요소인 경우에는 방향을 변경한다.&lt;br /&gt;방향이 결정된 후에 x와 y좌표를 갱신한다.&lt;/p&gt;
&lt;pre id=&quot;code_1674745230313&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// matrix 배열 요소의 길이만큼 탐색
for(int i = 0; i &amp;lt; m * n; i++) {
    // 현재 좌표의 값을 정답 리스트에 추가
    answer.add(matrix[x][y]);
    // 방문 여부를 체크하기위해 배열요소의 최대값인 100보다 큰 값으로 현재 요소값 변경 
    matrix[x][y] = 101;

    // 이동한 좌표가 배열을 벗어났거나 이미 방문한 요소인 경우
    if(x + dirX[dir] &amp;lt; 0 || x + dirX[dir] &amp;gt;= m || y + dirY[dir] &amp;lt; 0 || y + dirY[dir] &amp;gt;= n || matrix[x + dirX[dir]][y + dirY[dir]] &amp;gt; 100) {
        // 방향을 변경
        dir = (dir + 1) % 4;
    }

    // 좌표 갱신
    x = x + dirX[dir];
    y = y + dirY[dir];
}&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;최종적으로 구한 정답 리스트를 return한다.&lt;/p&gt;
&lt;pre id=&quot;code_1674745251912&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;return answer;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1674744971608&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public List&amp;lt;Integer&amp;gt; spiralOrder(int[][] matrix) {
        // 행의 길이
        int m = matrix.length;
        // 열의 길이
        int n = matrix[0].length;
        // matrix 배열의 요소 개수 크기만큼의 정답 배열 선언
        List&amp;lt;Integer&amp;gt; answer = new ArrayList&amp;lt;&amp;gt;();
        // 방향에 따라 이동할 x,y좌표 값
        // 오른쪽, 아래, 왼쪽, 위
        int[] dirX = {0, 1, 0, -1};
        int[] dirY = {1, 0, -1, 0};
        // 방향을 나타낼 포인터
        int dir = 0;
        // 시작 x좌표
        int x = 0;
        // 시작 y좌표
        int y = 0;
        
        // matrix 배열 요소의 길이만큼 탐색
        for(int i = 0; i &amp;lt; m * n; i++) {
            // 현재 좌표의 값을 정답 리스트에 추가
            answer.add(matrix[x][y]);
            // 방문 여부를 체크하기위해 배열요소의 최대값인 100보다 큰 값으로 현재 요소값 변경 
            matrix[x][y] = 101;
            
            // 이동한 좌표가 배열을 벗어났거나 이미 방문한 요소인 경우
            if(x + dirX[dir] &amp;lt; 0 || x + dirX[dir] &amp;gt;= m || y + dirY[dir] &amp;lt; 0 || y + dirY[dir] &amp;gt;= n || matrix[x + dirX[dir]][y + dirY[dir]] &amp;gt; 100) {
                // 방향을 변경
                dir = (dir + 1) % 4;
            }
            
            // 좌표 갱신
            x = x + dirX[dir];
            y = y + dirY[dir];
        }

        return answer;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>Matrix</category>
      <category>Spiral Matrix</category>
      <category>배열</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>자바</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/127</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-54-Spiral-Matrix-Java#entry127comment</comments>
      <pubDate>Fri, 27 Jan 2023 00:01:24 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 73. Set Matrix Zeroes - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-73-Set-Matrix-Zeroes-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/set-matrix-zeroes/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/set-matrix-zeroes/description/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1674658019244&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;Set Matrix Zeroes - LeetCode&quot; data-og-description=&quot;Set Matrix Zeroes - Given an m x n integer matrix matrix, if an element is 0, set its entire row and column to 0's. You must do it in place [https://en.wikipedia.org/wiki/In-place_algorithm]. &amp;nbsp; Example 1: [https://assets.leetcode.com/uploads/2020/08/17/ma&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/set-matrix-zeroes/description/&quot; data-og-url=&quot;https://leetcode.com/problems/set-matrix-zeroes/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/xn8Tw/hyRoM3EURT/QKe0raVTfVUfZwld9k4Pg1/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/bkq65K/hyRoyEoK9E/1ZGcBXNJ72fJ0OED6UYK01/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222,https://scrap.kakaocdn.net/dn/DU5pf/hyRoCs83N3/Dnb67eEqlUeDLM0G1tP2nK/img.jpg?width=791&amp;amp;height=241&amp;amp;face=0_0_791_241&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/set-matrix-zeroes/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/set-matrix-zeroes/description/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/xn8Tw/hyRoM3EURT/QKe0raVTfVUfZwld9k4Pg1/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/bkq65K/hyRoyEoK9E/1ZGcBXNJ72fJ0OED6UYK01/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222,https://scrap.kakaocdn.net/dn/DU5pf/hyRoCs83N3/Dnb67eEqlUeDLM0G1tP2nK/img.jpg?width=791&amp;amp;height=241&amp;amp;face=0_0_791_241');&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;Set Matrix Zeroes - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Set Matrix Zeroes - Given an m x n integer matrix matrix, if an element is 0, set its entire row and column to 0's. You must do it in place [https://en.wikipedia.org/wiki/In-place_algorithm]. &amp;nbsp; Example 1: [https://assets.leetcode.com/uploads/2020/08/17/ma&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;Given an&lt;span&gt;&amp;nbsp;&lt;/span&gt;m x n&lt;span&gt;&amp;nbsp;&lt;/span&gt;integer matrix&lt;span&gt;&amp;nbsp;&lt;/span&gt;matrix, if an element is&lt;span&gt;&amp;nbsp;&lt;/span&gt;0, set its entire row and column to&lt;span&gt;&amp;nbsp;&lt;/span&gt;0's.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;You must do it&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/In-place_algorithm&quot;&gt;in place&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;b&gt;Example 1:&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;641&quot; data-origin-height=&quot;241&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lgvea/btrXdMQIfng/mfrB1PbBAFlAX0rBq2JgW0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lgvea/btrXdMQIfng/mfrB1PbBAFlAX0rBq2JgW0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lgvea/btrXdMQIfng/mfrB1PbBAFlAX0rBq2JgW0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flgvea%2FbtrXdMQIfng%2FmfrB1PbBAFlAX0rBq2JgW0%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;641&quot; height=&quot;241&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;241&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Input: matrix = [[1,1,1],[1,0,1],[1,1,1]]
Output: [[1,0,1],[0,0,0],[1,0,1]]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;241&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQpsVv/btrXaC2G614/Ky0l3caJ8nLRcS0gZcfNI1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQpsVv/btrXaC2G614/Ky0l3caJ8nLRcS0gZcfNI1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQpsVv/btrXaC2G614/Ky0l3caJ8nLRcS0gZcfNI1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQpsVv%2FbtrXaC2G614%2FKy0l3caJ8nLRcS0gZcfNI1%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;791&quot; height=&quot;241&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;241&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Input: matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
Output: [[0,0,0,0],[0,4,5,0],[0,3,1,0]]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;m == matrix.length&lt;/li&gt;
&lt;li&gt;n == matrix[0].length&lt;/li&gt;
&lt;li&gt;1 &amp;lt;= m, n &amp;lt;= 200&lt;/li&gt;
&lt;li&gt;-231 &amp;lt;= matrix[i][j] &amp;lt;= 231 - 1&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Follow up:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;A straightforward solution using&lt;span&gt;&amp;nbsp;&lt;/span&gt;O(mn)&lt;span&gt;&amp;nbsp;&lt;/span&gt;space is probably a bad idea.&lt;/li&gt;
&lt;li&gt;A simple improvement uses&lt;span&gt;&amp;nbsp;&lt;/span&gt;O(m + n)&lt;span&gt;&amp;nbsp;&lt;/span&gt;space, but still not the best solution.&lt;/li&gt;
&lt;li&gt;Could you devise a constant space solution?&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2차원 배열 matrix가 주어질 때 셀의 값이 0인 행과 열은 모두 0으로 치환해야하는 문제이다.&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;공간복잡도 O(mn)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주어진 matrix와 똑같은 2차원 배열을 복사하여 복사한 배열을 순회하며 값이 0인 경우 matrix 배열에서 해당 행과 열을 0으로 변경&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;470&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ATWJY/btrXaq2qWqA/vH8GuXdM5yOwEpoCWMq331/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ATWJY/btrXaq2qWqA/vH8GuXdM5yOwEpoCWMq331/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ATWJY/btrXaq2qWqA/vH8GuXdM5yOwEpoCWMq331/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FATWJY%2FbtrXaq2qWqA%2FvH8GuXdM5yOwEpoCWMq331%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;470&quot; height=&quot;242&quot; data-origin-width=&quot;470&quot; data-origin-height=&quot;242&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;공간복잡도 O(m + n)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;matrix의 행과 열의 길이만큼의 배열(m, n)을 생성하여 각각 해당 행과 열이 0으로 세팅되어야 하는지 판단하는데 사용, matrix의 값을 순회하면서 값이 0인경우 m과 n배열의 각 인덱스를 0으로 세팅하고 마지막에 m과 n배열을 순회하며 값이 0인 행과 열의 값을 변경&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;393&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/daK9ul/btrXa2UjXBG/QxdcLs1PIhwVk48CiyT30K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/daK9ul/btrXa2UjXBG/QxdcLs1PIhwVk48CiyT30K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/daK9ul/btrXa2UjXBG/QxdcLs1PIhwVk48CiyT30K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdaK9ul%2FbtrXa2UjXBG%2FQxdcLs1PIhwVk48CiyT30K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;458&quot; height=&quot;393&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;393&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;공간복잡도 O(1)&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;O(m + n)과 풀이 방법은 같으나 m과 n배열을 따로 생성하지 않고 matrix배열 자체를 이용한다.&lt;br /&gt;첫 번째 행을 n배열로 사용하고 첫 번째 열을 m배열로 사용한다. 다만 [0][0]번째 값은 행과 열에서 겹치므로 하나의 변수를 사용하여 행과 열중 하나를 판단하는데 사용한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vbw8B/btrXa0944EF/9GPLl5v0zamzlAJy6maSHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vbw8B/btrXa0944EF/9GPLl5v0zamzlAJy6maSHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vbw8B/btrXa0944EF/9GPLl5v0zamzlAJy6maSHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvbw8B%2FbtrXa0944EF%2F9GPLl5v0zamzlAJy6maSHK%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;389&quot; height=&quot;317&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;317&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제에서 O(mn), O(m + n)의 공간 복잡도보다 효율적인 풀이를 요구하고 있으므로 마지막 방법을 이용하여 풀이한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 첫 번째 행이나 첫 번째 열을 판단하기 위한 변수를 하나 선언해야한다. 이번 문제에서는 이 변수를 첫 번째 행을 판단하기 위해 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1674659406073&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 배열의 첫 번째 행과 열은 해당 행과 열을
// 0으로 치환해야하는지 판단하는데 사용

// 첫 번째 행을 0으로 채워야하는지 판별하기 위한 변수
// 첫 번째 행과 첫 번째 열은 겹치기 때문에 행 판단을 위한 변수를 따로 사용
boolean firstRow = 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;matrix 배열의 각 행과 열을 순회하면서 각 값이 속하는 행과 열이 0이 되어야 하는지 탐색한다.&lt;br /&gt;만약 탐색중인 값이 0인 경우 해당 열의 첫 번째 행 값을 0으로 설정한다.&lt;br /&gt;마찬가지로 해당 행의 첫 번째 열 값도 0으로 설정해야 하는데 첫 번째 행의 경우 firstRow라는 변수를 따로 사용하므로 조건을 분기하여 첫 번째 행인 경우 firstRow를 업데이트하고 첫 번째 행이 아닌경우에는 첫 번째 열 값을 업데이트한다.&lt;/p&gt;
&lt;pre id=&quot;code_1674659448632&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 배열의 각 행,열을 탐색하여
// 각 행과 열의 0 치환 여부를 판단
for(int i = 0; i &amp;lt; matrix.length; i++){
    for(int j = 0; j &amp;lt; matrix[0].length; j++){
        // 현재 탐색중인 값이 0이라면
        if(matrix[i][j] == 0) {
            // 현재 열은 0으로 치환해야하는 것으로 판단
            matrix[0][j] = 0;

            // 첫 번째 행이 아닌 경우
            // 현재 행은 0으로 치환해야하는 것으로 판단
            if(i &amp;gt; 0) matrix[i][0] = 0;
            // 첫 번째 행인 경우
            // 첫 번째 행은 0으로 치환해야하는 것으로 판단
            else firstRow = true;
        }
    }
}&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;탐색이 종료되면 첫 번째 행과 열의 값에 따라 해당 행과 열의 값을 0으로 바꿔주어야한다.&lt;br /&gt;첫 번째 행과 열은 다른 값을 바꾸기위해 사용해야 하므로 나머지 행과 열의 값부터 바꾼 후 마지막에 첫 번째 행과 열의 값을 업데이트 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1674659729239&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 첫 번째 행,열을 제외한 나머지 셀 값 치환
for(int i = 1; i &amp;lt; matrix.length; i++) {
    for(int j = 1; j &amp;lt; matrix[0].length; j++) {
        // 탐색중인 행이 0이거나 열이 0인 경우
        // 현재 값을 0으로 변경
        if(matrix[i][0] == 0 || matrix[0][j] == 0) {
            matrix[i][j] = 0;
        }
    }
}

// 첫 번째 열이 0인 경우
if(matrix[0][0] == 0) {
    // 첫 번째 열의 모든 값을 0으로 변경
    for(int i = 0; i &amp;lt; matrix.length; i++) {
        matrix[i][0] = 0;
    }
}

// 첫 번째 행이 0인 경우
if(firstRow) {
 // 첫 번째 행의 모든 값을 0으로 변경
    for(int i = 0; i &amp;lt; matrix[0].length; i++) {
        matrix[0][i] = 0;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1674658025183&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public void setZeroes(int[][] matrix) {
        // 배열의 첫 번째 행과 열은 해당 행과 열을
        // 0으로 치환해야하는지 판단하는데 사용
        
        // 첫 번째 행을 0으로 채워야하는지 판별하기 위한 변수
        // 첫 번째 행과 첫 번째 열은 겹치기 때문에 행 판단을 위한 변수를 따로 사용
        boolean firstRow = false;
        
        // 배열의 각 행,열을 탐색하여
        // 각 행과 열의 0 치환 여부를 판단
        for(int i = 0; i &amp;lt; matrix.length; i++){
            for(int j = 0; j &amp;lt; matrix[0].length; j++){
                // 현재 탐색중인 값이 0이라면
                if(matrix[i][j] == 0) {
                    // 현재 열은 0으로 치환해야하는 것으로 판단
                    matrix[0][j] = 0;
                    
                    // 첫 번째 행이 아닌 경우
                    // 현재 행은 0으로 치환해야하는 것으로 판단
                    if(i &amp;gt; 0) matrix[i][0] = 0;
                    // 첫 번째 행인 경우
                    // 첫 번째 행은 0으로 치환해야하는 것으로 판단
                    else firstRow = true;
                }
            }
        }
        
        // 첫 번째 행,열을 제외한 나머지 셀 값 치환
        for(int i = 1; i &amp;lt; matrix.length; i++) {
            for(int j = 1; j &amp;lt; matrix[0].length; j++) {
                // 탐색중인 행이 0이거나 열이 0인 경우
                // 현재 값을 0으로 변경
                if(matrix[i][0] == 0 || matrix[0][j] == 0) {
                    matrix[i][j] = 0;
                }
            }
        }
        
        // 첫 번째 열이 0인 경우
        if(matrix[0][0] == 0) {
            // 첫 번째 열의 모든 값을 0으로 변경
            for(int i = 0; i &amp;lt; matrix.length; i++) {
                matrix[i][0] = 0;
            }
        }
        
        // 첫 번째 행이 0인 경우
        if(firstRow) {
         // 첫 번째 행의 모든 값을 0으로 변경
            for(int i = 0; i &amp;lt; matrix[0].length; i++) {
                matrix[0][i] = 0;
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>Matrix</category>
      <category>Set Matrix Zeroes</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>자바</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/126</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-73-Set-Matrix-Zeroes-Java#entry126comment</comments>
      <pubDate>Thu, 26 Jan 2023 00:16:01 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 143. Reorder List - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-143-Reorder-List-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/reorder-list/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/reorder-list/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1674567456967&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;Reorder List - LeetCode&quot; data-og-description=&quot;Reorder List - You are given the head of a singly linked-list. The list can be represented as: L0 &amp;rarr; L1 &amp;rarr; &amp;hellip; &amp;rarr; Ln - 1 &amp;rarr; Ln Reorder the list to be on the following form: L0 &amp;rarr; Ln &amp;rarr; L1 &amp;rarr; Ln - 1 &amp;rarr; L2 &amp;rarr; Ln - 2 &amp;rarr; &amp;hellip; You may not modify the va&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/reorder-list/&quot; data-og-url=&quot;https://leetcode.com/problems/reorder-list/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Q7eAV/hyRoHto04k/6gkEjlQl20Sa8kLfBbJoxk/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/ZCMzs/hyRm5inoR7/T8jpxKaHv4jn1kb8UsgFrK/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222,https://scrap.kakaocdn.net/dn/bT47jQ/hyRmYp1c9D/hJLuM0HrihciWKACmfOEgk/img.jpg?width=542&amp;amp;height=222&amp;amp;face=0_0_542_222&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/reorder-list/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/reorder-list/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Q7eAV/hyRoHto04k/6gkEjlQl20Sa8kLfBbJoxk/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/ZCMzs/hyRm5inoR7/T8jpxKaHv4jn1kb8UsgFrK/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222,https://scrap.kakaocdn.net/dn/bT47jQ/hyRmYp1c9D/hJLuM0HrihciWKACmfOEgk/img.jpg?width=542&amp;amp;height=222&amp;amp;face=0_0_542_222');&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;Reorder List - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Reorder List - You are given the head of a singly linked-list. The list can be represented as: L0 &amp;rarr; L1 &amp;rarr; &amp;hellip; &amp;rarr; Ln - 1 &amp;rarr; Ln Reorder the list to be on the following form: L0 &amp;rarr; Ln &amp;rarr; L1 &amp;rarr; Ln - 1 &amp;rarr; L2 &amp;rarr; Ln - 2 &amp;rarr; &amp;hellip; You may not modify the va&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;You are given the head of a singly linked-list. The list can be represented as:&lt;/p&gt;
&lt;pre class=&quot;excel&quot;&gt;&lt;code&gt;L0 &amp;rarr; L1 &amp;rarr; &amp;hellip; &amp;rarr; Ln - 1 &amp;rarr; Ln
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Reorder the list to be on the following form:&lt;/p&gt;
&lt;pre class=&quot;excel&quot;&gt;&lt;code&gt;L0 &amp;rarr; Ln &amp;rarr; L1 &amp;rarr; Ln - 1 &amp;rarr; L2 &amp;rarr; Ln - 2 &amp;rarr; &amp;hellip;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;You may not modify the values in the list's nodes. Only nodes themselves may be changed.&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;Example 1:&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;422&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bugf1b/btrW0QfBGCr/S8XownbI3qgN355Ow0L7mK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bugf1b/btrW0QfBGCr/S8XownbI3qgN355Ow0L7mK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bugf1b/btrW0QfBGCr/S8XownbI3qgN355Ow0L7mK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbugf1b%2FbtrW0QfBGCr%2FS8XownbI3qgN355Ow0L7mK%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;422&quot; height=&quot;222&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;222&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Input: head = [1,2,3,4]
Output: [1,4,2,3]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r9S8o/btrWZWmBUGs/2jt2bEOnVuYOb9T6hb4eU1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r9S8o/btrWZWmBUGs/2jt2bEOnVuYOb9T6hb4eU1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r9S8o/btrWZWmBUGs/2jt2bEOnVuYOb9T6hb4eU1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr9S8o%2FbtrWZWmBUGs%2F2jt2bEOnVuYOb9T6hb4eU1%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;542&quot; height=&quot;222&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;222&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Input: head = [1,2,3,4,5]
Output: [1,5,2,4,3]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;The number of nodes in the list is in the range&lt;span&gt;&amp;nbsp;&lt;/span&gt;[1, 5 * 104].&lt;/li&gt;
&lt;li&gt;1 &amp;lt;= Node.val &amp;lt;= 1000&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리스트의 head 노드가 주어지고 리스트의 각 노드가 0 &amp;rarr; 1 &amp;rarr; ... n-1 &amp;rarr; n 이라고 할 때 주어진 리스트를 0 &amp;rarr; n &amp;rarr; 1 &amp;rarr; n-1 &amp;rarr; ... 의 형태로 재배열하는 문제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제에서 주어진 조건을 다시 정리하면 리스트의 시작점과 끝점에서부터 각각 노드가 한번씩 교차하도록 재배열을 해야한다. 재배열하기위해 크게 다음 세가지 단계를 거친다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;리스트를 절반으로 나누기&lt;/li&gt;
&lt;li&gt;나누어진 리스트 중 뒤의 리스트를 역순 배열하기&lt;/li&gt;
&lt;li&gt;나누어진 두 리스트를 번갈아가며 합치기&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 리스트를 절반으로 나누기 위해서는 한 칸씩 움직이는 포인터와 두 칸씩 움직이는 두 개의 포인터를 이용한다. 두 칸씩 움직이는 포인터가 리스트의 끝에 도달할 때 한 칸씩 움직이는 포인터의 위치가 리스트의 가운데가 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1674568842458&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 중앙 값을 구하기 위해
// 한 칸씩 움직일 포인터와
// 두 칸씩 움직일 포인터 선언
ListNode slow = head;
ListNode fast = head;

// fast 포인터가 끝에 도착할 때 까지 포인터 이동
while(fast.next != null &amp;amp;&amp;amp; fast.next.next != null){
    slow = slow.next;
    fast = fast.next.next;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로 나누어진 리스트 중 뒤의 리스트를 역순 배열하기 위해서 LeetCode의 206. Reverse Linked의 풀이를 참고하여 리스트를 역순 정렬하는 함수를 작성한다.&lt;/p&gt;
&lt;figure id=&quot;og_1674568933634&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[LeetCode] 206. Reverse Linked List - Java&quot; data-og-description=&quot;https://leetcode.com/problems/reverse-linked-list/description/ Reverse Linked List - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 문제 &quot; data-og-host=&quot;hyojun.tistory.com&quot; data-og-source-url=&quot;https://hyojun.tistory.com/entry/LeetCode-206-Reverse-Linked-List-Java&quot; data-og-url=&quot;https://hyojun.tistory.com/entry/LeetCode-206-Reverse-Linked-List-Java&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hHOLC/hyRoz3dff6/I4jI8GyYgud0ttxn35DanK/img.jpg?width=542&amp;amp;height=222&amp;amp;face=0_0_542_222,https://scrap.kakaocdn.net/dn/dObaGs/hyRoNUGYAj/y2wvUSoegVw0NjgZHcNgEK/img.jpg?width=542&amp;amp;height=222&amp;amp;face=0_0_542_222,https://scrap.kakaocdn.net/dn/pPpwP/hyRm0aiE1Z/aytktbi59K91IGxquAUs41/img.jpg?width=750&amp;amp;height=247&amp;amp;face=0_0_750_247&quot;&gt;&lt;a href=&quot;https://hyojun.tistory.com/entry/LeetCode-206-Reverse-Linked-List-Java&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hyojun.tistory.com/entry/LeetCode-206-Reverse-Linked-List-Java&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hHOLC/hyRoz3dff6/I4jI8GyYgud0ttxn35DanK/img.jpg?width=542&amp;amp;height=222&amp;amp;face=0_0_542_222,https://scrap.kakaocdn.net/dn/dObaGs/hyRoNUGYAj/y2wvUSoegVw0NjgZHcNgEK/img.jpg?width=542&amp;amp;height=222&amp;amp;face=0_0_542_222,https://scrap.kakaocdn.net/dn/pPpwP/hyRm0aiE1Z/aytktbi59K91IGxquAUs41/img.jpg?width=750&amp;amp;height=247&amp;amp;face=0_0_750_247');&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;[LeetCode] 206. Reverse Linked List - Java&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;https://leetcode.com/problems/reverse-linked-list/description/ Reverse Linked List - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 문제&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hyojun.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1674568942362&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 리스트 역순 정렬
public ListNode reverseList(ListNode head) {
    // 빈 리스트이거나 다음 노드가 없으면 재귀 호출 종료
    if(head == null || head.next == null){
        return head;
    }

    // 다음 노드 재귀 호출
    ListNode List = reverseList(head.next);

    // 현재 노드의 다음 노드가 가리키는 next 값을 현재 head로 설정
    head.next.next = head;
    // 현재 노드가 가리키는 다음 노드를 null로 설정
    head.next = null;

    // 변경된 List를 return
    return List;
}&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;만들어진 함수를 이용하여 절반으로 나누어진 리스트 중 뒤의 리스트를 역순 정렬하고 slow 포인터의 next를 null로 설정하여 앞의 절반까지의 리스트를 만든다.&lt;/p&gt;
&lt;pre id=&quot;code_1674569018483&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 절반 이후 부터 역순으로 정렬
ListNode list2 = reverseList(slow.next);
// 절반까지의 리스트
slow.next = null;
ListNode list1 = head;&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;마지막으로 나누어진 두 개의 리스트를 번갈아가면서 노드를 삽입하여 재졍렬된 리스트를 구한다.&lt;/p&gt;
&lt;pre id=&quot;code_1674569045635&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;while(list1 != null &amp;amp;&amp;amp; list2 != null){
    // 번갈아 가며 노드를 삽입
    ListNode temp = list1.next;
    list1.next = list2;
    list1 = list2;
    list2 = temp;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리스트의 길이가 2이하인 경우 재정렬을 하는 경우에도 같은 리스트이기 때문에 처음에 조건을 주어 불필요한 연산을 제거한다.&lt;/p&gt;
&lt;pre id=&quot;code_1674569114795&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 리스트의 길이가 2이하 이면 정렬이 불필요하므로 종료
if(head == null || head.next == null || head.next.next == null) return;&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;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1674567489923&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public void reorderList(ListNode head) {
        // 리스트의 길이가 2이하 이면 정렬이 불필요하므로 종료
        if(head == null || head.next == null || head.next.next == null) return;

        // 중앙 값을 구하기 위해
        // 한 칸씩 움직일 포인터와
        // 두 칸씩 움직일 포인터 선언
        ListNode slow = head;
        ListNode fast = head;

        // fast 포인터가 끝에 도착할 때 까지 포인터 이동
        while(fast.next != null &amp;amp;&amp;amp; fast.next.next != null){
            slow = slow.next;
            fast = fast.next.next;
        }
        
        // 절반 이후 부터 역순으로 정렬
        ListNode list2 = reverseList(slow.next);
        // 절반까지의 리스트
        slow.next = null;
        ListNode list1 = head;
        
        while(list1 != null &amp;amp;&amp;amp; list2 != null){
            // 번갈아 가며 노드를 삽입
            ListNode temp = list1.next;
            list1.next = list2;
            list1 = list2;
            list2 = temp;
        }
    }

    // 리스트 역순 정렬
    public ListNode reverseList(ListNode head) {
        // 빈 리스트이거나 다음 노드가 없으면 재귀 호출 종료
        if(head == null || head.next == null){
            return head;
        }

        // 다음 노드 재귀 호출
        ListNode List = reverseList(head.next);

        // 현재 노드의 다음 노드가 가리키는 next 값을 현재 head로 설정
        head.next.next = head;
        // 현재 노드가 가리키는 다음 노드를 null로 설정
        head.next = null;

        // 변경된 List를 return
        return List;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>Linked List</category>
      <category>Reorder List</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>자바</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/125</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-143-Reorder-List-Java#entry125comment</comments>
      <pubDate>Tue, 24 Jan 2023 23:05:48 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 23. Merge k Sorted Lists - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-23-Merge-k-Sorted-Lists-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/merge-k-sorted-lists/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/merge-k-sorted-lists/description/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1674223155356&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;Merge k Sorted Lists - LeetCode&quot; data-og-description=&quot;Merge k Sorted Lists - You are given an array of k linked-lists lists, each linked-list is sorted in ascending order. Merge all the linked-lists into one sorted linked-list and return it. &amp;nbsp; Example 1: Input: lists = [[1,4,5],[1,3,4],[2,6]] Output: [1,1,2,&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/merge-k-sorted-lists/description/&quot; data-og-url=&quot;https://leetcode.com/problems/merge-k-sorted-lists/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cdpE0I/hyRlpUyaDr/PyaPkmWWNi2PY24Gx816Dk/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/7ko1U/hyRlDL84aw/ESK3Sbp0gMHF5tNQ9nY0l1/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/merge-k-sorted-lists/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/merge-k-sorted-lists/description/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cdpE0I/hyRlpUyaDr/PyaPkmWWNi2PY24Gx816Dk/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/7ko1U/hyRlDL84aw/ESK3Sbp0gMHF5tNQ9nY0l1/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222');&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;Merge k Sorted Lists - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Merge k Sorted Lists - You are given an array of k linked-lists lists, each linked-list is sorted in ascending order. Merge all the linked-lists into one sorted linked-list and return it. &amp;nbsp; Example 1: Input: lists = [[1,4,5],[1,3,4],[2,6]] Output: [1,1,2,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;You are given an array of&lt;span&gt;&amp;nbsp;&lt;/span&gt;k&lt;span&gt;&amp;nbsp;&lt;/span&gt;linked-lists&lt;span&gt;&amp;nbsp;&lt;/span&gt;lists, each linked-list is sorted in ascending order.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Merge all the linked-lists into one sorted linked-list and return it.&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;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Input: lists = [[1,4,5],[1,3,4],[2,6]]
Output: [1,1,2,3,4,4,5,6]
Explanation: The linked-lists are:
[
  1-&amp;gt;4-&amp;gt;5,
  1-&amp;gt;3-&amp;gt;4,
  2-&amp;gt;6
]
merging them into one sorted list:
1-&amp;gt;1-&amp;gt;2-&amp;gt;3-&amp;gt;4-&amp;gt;4-&amp;gt;5-&amp;gt;6
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;apache&quot;&gt;&lt;code&gt;Input: lists = []
Output: []
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 3:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;lua&quot;&gt;&lt;code&gt;Input: lists = [[]]
Output: []
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;k == lists.length&lt;/li&gt;
&lt;li&gt;0 &amp;lt;= k &amp;lt;= 104&lt;/li&gt;
&lt;li&gt;0 &amp;lt;= lists[i].length &amp;lt;= 500&lt;/li&gt;
&lt;li&gt;-104 &amp;lt;= lists[i][j] &amp;lt;= 104&lt;/li&gt;
&lt;li&gt;lists[i]&lt;span&gt;&amp;nbsp;&lt;/span&gt;is sorted in&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;ascending order&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;The sum of&lt;span&gt;&amp;nbsp;&lt;/span&gt;lists[i].length&lt;span&gt;&amp;nbsp;&lt;/span&gt;will not exceed&lt;span&gt;&amp;nbsp;&lt;/span&gt;104.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;linked list들로 이루어진 배열 lists가 주어질 때 모든 주어진 리스트를 오름차순으로 병합된 리스트를 구해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선순위 큐를 이용하여 풀이한다.&lt;br /&gt;일반적인 큐는 먼저 들어온 데이터가 먼저 나가게 되는 FIFO(First In First Out) 형태의 자료구조이지만 우선순위 큐는 우선순위가 높은 데이터가 먼저 나가게 되는 자료구조이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 lists 배열이 빈 값인 경우 바로 null을 반환한다.&lt;/p&gt;
&lt;pre id=&quot;code_1674223372641&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 전달받은 리스트가 null인 경우 바로 null return
if(lists == null) return null;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;탐색에 사용할 우선순위 큐를 선언한다. 이 때 리스트의 값을 기준으로 우선순위가 정의 되어야 하기 때문에 다음과 같이 리스트의 값을 기준으로 비교하도록 생성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1674223428641&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 탐색에 사용할 우선순위 큐 선언
// 리스트 노드의 값을 기준으로 정렬
PriorityQueue&amp;lt;ListNode&amp;gt; pq = new PriorityQueue&amp;lt;&amp;gt;((a1,a2)-&amp;gt;{
    return a1.val-a2.val;
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리스트들을 합치는 과정은 다음과 같다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;모든 리스트 노드를 우선순위 큐에 삽입&lt;/li&gt;
&lt;li&gt;우선순위가 가장 높은 리스트 노드(노드의 값이 가장 작은 리스트 노드)를 하나 꺼냄&lt;/li&gt;
&lt;li&gt;꺼낸 리스트 노드를 정답에 추가&lt;/li&gt;
&lt;li&gt;꺼낸 리스트 노드의 next 값이 존재한다면 우선순위 큐에 next 값 삽입&lt;/li&gt;
&lt;li&gt;큐가 빌 때 까지 1 ~ 4의 과정을 반복&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복문을 이용하여 lists 배열에 있는 리스트들을 큐에 삽입한다.&lt;/p&gt;
&lt;pre id=&quot;code_1674223733600&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// lists 배열에 있는 리스트들을 큐에 삽입
for(int i = 0; i &amp;lt; lists.length; i++){
    if(lists[i] != null) pq.offer(lists[i]);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;탐색에 필요한 변수값들을 선언한다.&lt;/p&gt;
&lt;pre id=&quot;code_1674223751472&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 반환할 정답 리스트를 생성
ListNode answer = new ListNode(0);
// 노드를 추가하기 위한 포인터
ListNode pointer = answer;
// 현재 탐색중인 노드
ListNode curNode = null;&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;큐에서 값을 꺼내어 정답 리스트에 추가하고 꺼낸 값의 next 값을 큐에 삽입하는 과정을 큐가 빌 때 까지 반복한다.&lt;/p&gt;
&lt;pre id=&quot;code_1674223807656&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 큐가 빌 때 까지 반복
while(!pq.isEmpty()){
    // 큐에서 값을 꺼냄
    curNode = pq.poll();
    // 정답 리스트에 추가
    pointer.next = curNode;
    // 포인터 이동
    pointer = pointer.next;
    // 현재 탐색중인 노드의 next 값이 존재하는 경우 next 값을 큐에 다시 삽입
    if(curNode.next != null) pq.offer(curNode.next);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종적으로 만들어진 리스트 노드를 return&lt;/p&gt;
&lt;pre id=&quot;code_1674223831987&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 정답 리스트 return
// 임의의 값을 넣어 생성하였으므로 next부터 return
return answer.next;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1674223157226&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        // 전달받은 리스트가 null인 경우 바로 null return
        if(lists == null) return null;

        // 탐색에 사용할 우선순위 큐 선언
        // 리스트 노드의 값을 기준으로 정렬
        PriorityQueue&amp;lt;ListNode&amp;gt; pq = new PriorityQueue&amp;lt;&amp;gt;((a1,a2)-&amp;gt;{
            return a1.val-a2.val;
        });

        // lists 배열에 있는 리스트들을 큐에 삽입
        for(int i = 0; i &amp;lt; lists.length; i++){
            if(lists[i] != null) pq.offer(lists[i]);
        }

        // 반환할 정답 리스트를 생성
        ListNode answer = new ListNode(0);
        // 노드를 추가하기 위한 포인터
        ListNode pointer = answer;
        // 현재 탐색중인 노드
        ListNode curNode = null;

        // 큐가 빌 때 까지 반복
        while(!pq.isEmpty()){
            // 큐에서 값을 꺼냄
            curNode = pq.poll();
            // 정답 리스트에 추가
            pointer.next = curNode;
            // 포인터 이동
            pointer = pointer.next;
            // 현재 탐색중인 노드의 next 값이 존재하는 경우 next 값을 큐에 다시 삽입
            if(curNode.next != null) pq.offer(curNode.next);
        }

        // 정답 리스트 return
        // 임의의 값을 넣어 생성하였으므로 next부터 return
        return answer.next;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>list</category>
      <category>priority queue</category>
      <category>queue</category>
      <category>알고리즘</category>
      <category>우선순위큐</category>
      <category>자바</category>
      <category>큐</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/124</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-23-Merge-k-Sorted-Lists-Java#entry124comment</comments>
      <pubDate>Fri, 20 Jan 2023 23:10:55 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 3. Longest Substring Without Repeating Characters - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-3-Longest-Substring-Without-Repeating-Characters-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/longest-substring-without-repeating-characters/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/longest-substring-without-repeating-characters/description/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1673966102335&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Longest Substring Without Repeating Characters - LeetCode&quot; data-og-description=&quot;Longest Substring Without Repeating Characters - Given a string s, find the length of the longest substring without repeating characters. &amp;nbsp; Example 1: Input: s = &amp;quot;abcabcbb&amp;quot; Output: 3 Explanation: The answer is &amp;quot;abc&amp;quot;, with the length of 3. Example 2: Input&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/longest-substring-without-repeating-characters/description/&quot; data-og-url=&quot;https://leetcode.com/problems/longest-substring-without-repeating-characters/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c5bP4g/hyRi1GZYzU/gs6NkEMHEp95oONPT7x2Y1/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/v3M8z/hyRi1NJVl5/wLrLvxM7OTp49061wiTmyK/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/longest-substring-without-repeating-characters/description/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/longest-substring-without-repeating-characters/description/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c5bP4g/hyRi1GZYzU/gs6NkEMHEp95oONPT7x2Y1/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/v3M8z/hyRi1NJVl5/wLrLvxM7OTp49061wiTmyK/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Longest Substring Without Repeating Characters - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Longest Substring Without Repeating Characters - Given a string s, find the length of the longest substring without repeating characters. &amp;nbsp; Example 1: Input: s = &quot;abcabcbb&quot; Output: 3 Explanation: The answer is &quot;abc&quot;, with the length of 3. Example 2: Input&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;Given a string&lt;span&gt;&amp;nbsp;&lt;/span&gt;s, find the length of the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;longest&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;div data-headlessui-state=&quot;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;headlessui-popover-button-49&quot; data-headlessui-state=&quot;&quot;&gt;&lt;b&gt;substring&lt;/b&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;without repeating characters.&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;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;Input: s = &quot;abcabcbb&quot;
Output: 3
Explanation: The answer is &quot;abc&quot;, with the length of 3.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;Input: s = &quot;bbbbb&quot;
Output: 1
Explanation: The answer is &quot;b&quot;, with the length of 1.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 3:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;Input: s = &quot;pwwkew&quot;
Output: 3
Explanation: The answer is &quot;wke&quot;, with the length of 3.
Notice that the answer must be a substring, &quot;pwke&quot; is a subsequence and not a substring.
&lt;/code&gt;&lt;/pre&gt;
&lt;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;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;0 &amp;lt;= s.length &amp;lt;= 5 * 104&lt;/li&gt;
&lt;li&gt;s&lt;span&gt;&amp;nbsp;&lt;/span&gt;consists of English letters, digits, symbols and spaces.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알파벳, 숫자, 공백으로 이루어진 문자열 s가 주어질 때, 중복된 문자를 가지지 않는 가장 긴 연속되는 부분 문자열의 길이를 구하는 문제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중복되는 문자를 판단하기 위한 map과 시작, 종료인덱스 투 포인터를 이용하여 풀이한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 최종적으로 반환할 문자열의 최대 길이 변수와 탐색에 사용할 map, start, end 변수를 선언한다.&lt;/p&gt;
&lt;pre id=&quot;code_1673966297997&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 문자열 최대 길이
int maxLength = 0;
// 이미 나온 문자를 탐색하기 위한 map
// 탐색한 문자와 그 문자의 인덱스를 저장
Map&amp;lt;Character, Integer&amp;gt; map = new HashMap&amp;lt;&amp;gt;();
int start = 0;  // 탐색할 문자열의 시작 인덱스
int end = 0;    // 탐색할 문자열의 종료 인덱스&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;탐색 과정은 아래와 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;end 포인터가 문자열의 끝에 도달하거나 앞으로 탐색할 문자열의 길이가 maxLength 이하가 될 때까지 반복한다.&lt;/li&gt;
&lt;li&gt;처음 탐색하는 문자인 경우 map에 현재 탐색중인 문자와 그 인덱스 값을 저장한다.&lt;/li&gt;
&lt;li&gt;이미 탐색했던 문자인 경우 이전에 등장했던 인덱스의 다음 인덱스와 현재 start 인덱스 중 큰 값으로 start를 갱신하고 현재 문자의 등장 인덱스를 갱신한다.&lt;/li&gt;
&lt;li&gt;현재 만들어진 문자열의 길이와 최대 길이를 비교하여 최대 길이를 갱신한다.&lt;/li&gt;
&lt;li&gt;종료 인덱스를 증가시킨다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1673966561084&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 문자열을 끝까지 탐색하거나
// 탐색할 문자열의 길이가 maxLength 이하가 될 때 까지 반복
while(end &amp;lt; s.length() &amp;amp;&amp;amp; maxLength &amp;lt;= s.length() - start) {
    char letter = s.charAt(end);
    // 처음 탐색하는 문자인 경우
    if(map.get(letter) == null) {
        // map에 현재 탐색중인 문자와 그 인덱스 값을 저장
        map.put(letter, end);
    }
    // 이미 탐색했던 문자인 경우
    else {
        // 이전에 등장했던 인덱스 다음 인덱스와 현재 start 인덱스 중 큰값으로 start 인덱스를 갱신
        start = Math.max(map.get(letter) + 1, start);
        // 현재 문자의 인덱스를 갱신
        map.put(letter, end);
    }
    // 현재 만들어진 문자열의 길이와 최대 길이를 비교하여 최대 길이 갱신
    maxLength = Math.max(maxLength, end - start + 1);
    end++; // 종료 인덱스 증가
}&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;최종적으로 구해진 최대 길이를 return한다.&lt;/p&gt;
&lt;pre id=&quot;code_1673966582445&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 최대 문자열의 길이를 return
return maxLength;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1673966107309&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int lengthOfLongestSubstring(String s) {
        // 문자열 최대 길이
        int maxLength = 0;
        // 이미 나온 문자를 탐색하기 위한 map
        // 탐색한 문자와 그 문자의 인덱스를 저장
        Map&amp;lt;Character, Integer&amp;gt; map = new HashMap&amp;lt;&amp;gt;();
        int start = 0;  // 탐색할 문자열의 시작 인덱스
        int end = 0;    // 탐색할 문자열의 종료 인덱스
        
        // 문자열을 끝까지 탐색하거나
        // 탐색할 문자열의 길이가 maxLength 이하가 될 때 까지 반복
        while(end &amp;lt; s.length() &amp;amp;&amp;amp; maxLength &amp;lt;= s.length() - start) {
            char letter = s.charAt(end);
            // 처음 탐색하는 문자인 경우
            if(map.get(letter) == null) {
                // map에 현재 탐색중인 문자와 그 인덱스 값을 저장
                map.put(letter, end);
            }
            // 이미 탐색했던 문자인 경우
            else {
                // 이전에 등장했던 인덱스 다음 인덱스와 현재 start 인덱스 중 큰값으로 start 인덱스를 갱신
                start = Math.max(map.get(letter) + 1, start);
                // 현재 문자의 인덱스를 갱신
                map.put(letter, end);
            }
            // 현재 만들어진 문자열의 길이와 최대 길이를 비교하여 최대 길이 갱신
            maxLength = Math.max(maxLength, end - start + 1);
            end++; // 종료 인덱스 증가
        }
        
        // 최대 문자열의 길이를 return
        return maxLength;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algorythm</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>Longest Substring WIthout Repeating Characters</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>자바</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/123</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-3-Longest-Substring-Without-Repeating-Characters-Java#entry123comment</comments>
      <pubDate>Tue, 17 Jan 2023 23:43:31 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode] 102. Binary Tree Level Order Traversal - Java</title>
      <link>https://hyojun.tistory.com/entry/LeetCode-102-Binary-Tree-Level-Order-Traversal-Java</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/binary-tree-level-order-traversal/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://leetcode.com/problems/binary-tree-level-order-traversal/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1673965371028&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;Binary Tree Level Order Traversal - LeetCode&quot; data-og-description=&quot;Binary Tree Level Order Traversal - Given the root of a binary tree, return the level order traversal of its nodes' values. (i.e., from left to right, level by level). &amp;nbsp; Example 1: [https://assets.leetcode.com/uploads/2021/02/19/tree1.jpg] Input: root = [&quot; data-og-host=&quot;leetcode.com&quot; data-og-source-url=&quot;https://leetcode.com/problems/binary-tree-level-order-traversal/&quot; data-og-url=&quot;https://leetcode.com/problems/binary-tree-level-order-traversal/description&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/nUyQc/hyRi5P8VqU/pz6uGkZRkBORh1ZAQsRV70/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/bQ2rid/hyRkom02Yz/KhTy3qUbFaJa104axxTxy1/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222,https://scrap.kakaocdn.net/dn/bOkNYP/hyRkkx9sRM/ebJSEUHrc33nhWeBDsV8vK/img.jpg?width=277&amp;amp;height=302&amp;amp;face=0_0_277_302&quot;&gt;&lt;a href=&quot;https://leetcode.com/problems/binary-tree-level-order-traversal/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://leetcode.com/problems/binary-tree-level-order-traversal/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/nUyQc/hyRi5P8VqU/pz6uGkZRkBORh1ZAQsRV70/img.png?width=500&amp;amp;height=260&amp;amp;face=0_0_500_260,https://scrap.kakaocdn.net/dn/bQ2rid/hyRkom02Yz/KhTy3qUbFaJa104axxTxy1/img.png?width=924&amp;amp;height=222&amp;amp;face=0_0_924_222,https://scrap.kakaocdn.net/dn/bOkNYP/hyRkkx9sRM/ebJSEUHrc33nhWeBDsV8vK/img.jpg?width=277&amp;amp;height=302&amp;amp;face=0_0_277_302');&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;Binary Tree Level Order Traversal - LeetCode&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Binary Tree Level Order Traversal - Given the root of a binary tree, return the level order traversal of its nodes' values. (i.e., from left to right, level by level). &amp;nbsp; Example 1: [https://assets.leetcode.com/uploads/2021/02/19/tree1.jpg] Input: root = [&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;leetcode.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&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;Given the&lt;span&gt;&amp;nbsp;&lt;/span&gt;root&lt;span&gt;&amp;nbsp;&lt;/span&gt;of a binary tree, return&lt;span&gt;&amp;nbsp;&lt;/span&gt;the level order traversal of its nodes' values. (i.e., from left to right, level by level).&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;Example 1:&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;277&quot; data-origin-height=&quot;302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m2wNz/btrWyLkSqsp/gbpy0loo2Qu5aon4ugihG0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m2wNz/btrWyLkSqsp/gbpy0loo2Qu5aon4ugihG0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m2wNz/btrWyLkSqsp/gbpy0loo2Qu5aon4ugihG0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm2wNz%2FbtrWyLkSqsp%2Fgbpy0loo2Qu5aon4ugihG0%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;277&quot; height=&quot;302&quot; data-origin-width=&quot;277&quot; data-origin-height=&quot;302&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Input: root = [3,9,20,null,null,15,7]
Output: [[3],[9,20],[15,7]]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;lua&quot;&gt;&lt;code&gt;Input: root = [1]
Output: [[1]]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 3:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;apache&quot;&gt;&lt;code&gt;Input: root = []
Output: []
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;The number of nodes in the tree is in the range&lt;span&gt;&amp;nbsp;&lt;/span&gt;[0, 2000].&lt;/li&gt;
&lt;li&gt;-1000 &amp;lt;= Node.val &amp;lt;= 1000&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이 과정&lt;/h3&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;우선 반환할 결과값 리스트, 탐색에 사용할 큐를 선언하고, 빈 트리가 들어왔을 경우 탐색할 필요가 없으므로 빈 리스트를 바로 return 하도록 먼저 처리해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1673965633414&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 반환할 결과값 리스트
List&amp;lt;List&amp;lt;Integer&amp;gt;&amp;gt; result = new ArrayList&amp;lt;&amp;gt;();

// 빈 트리인 경우 탐색할 필요가 없으므로 빈 리스트를 바로 return
if(root == null) return result;

// 탐색에 사용할 큐
Queue&amp;lt;TreeNode&amp;gt; q = new LinkedList&amp;lt;&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;큐를 이용한 탐색의 과정은 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 전달받은 트리의 root 노드를 큐에 넣은 상태로 탐색을 시작한다.&lt;/p&gt;
&lt;pre id=&quot;code_1673965692133&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// root를 큐에 넣고 탐색 시작
q.offer(root);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;큐의 사이즈를 구하고 그 사이즈만큼 반복하며 큐에서 노드를 꺼내어 리스트에 추가한다.&lt;br /&gt;첫 번째 탐색의 경우 한 번, 즉 1레벨 노드의 탐색이 가능하다.&lt;br /&gt;그리고 꺼낸 노드의 좌우 노드를 큐에 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1레벨 노드의 탐색이 종료되고 나면 1레벨 노드들은 큐에서 모두 빠지고 2레벨의 노드만이 남게 된다.&lt;br /&gt;큐의 사이즈를 다시 구하고 위의 과정을 반복하면 각 레벨별로 노드의 리스트를 구할 수 있게된다.&lt;/p&gt;
&lt;pre id=&quot;code_1673965997637&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 큐가 빌 때까지 반복
while(!q.isEmpty()){
    // 현재 큐의 사이즈만큼 반복 -&amp;gt; 같은 레벨

    // 현재 레벨의 노드들이 담길 리스트
    List&amp;lt;Integer&amp;gt; curLevel = new ArrayList&amp;lt;&amp;gt;();

    // 큐의 사이즈 -&amp;gt; 같은 레벨이 담겨있는 만큼
    int size = q.size();
    for(int i = 0; i &amp;lt; size; i++){
        // 큐에서 값을 꺼냄
        TreeNode curNode = q.poll();
        // 현재 레벨의 리스트에 노드 추가
        curLevel.add(curNode.val);
        // 현재 노드의 좌우 노드를 큐에 추가
        if(curNode.left != null) q.offer(curNode.left);
        if(curNode.right != null) q.offer(curNode.right);
    }

    // 현재 레벨 노드 리스트를 정답 리스트에 추가
    result.add(curLevel);
}&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;최종적으로 만들어진 리스트를 return 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1673966024894&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 최종 결과값 반환
return result;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1673965374806&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List&amp;lt;List&amp;lt;Integer&amp;gt;&amp;gt; levelOrder(TreeNode root) {
        // 반환할 결과값 리스트
        List&amp;lt;List&amp;lt;Integer&amp;gt;&amp;gt; result = new ArrayList&amp;lt;&amp;gt;();

        // 빈 트리인 경우 탐색할 필요가 없으므로 빈 리스트를 바로 return
        if(root == null) return result;

        // 탐색에 사용할 큐
        Queue&amp;lt;TreeNode&amp;gt; q = new LinkedList&amp;lt;&amp;gt;();

        // root를 큐에 넣고 탐색 시작
        q.offer(root);

        // 큐가 빌 때까지 반복
        while(!q.isEmpty()){
            // 현재 큐의 사이즈만큼 반복 -&amp;gt; 같은 레벨

            // 현재 레벨의 노드들이 담길 리스트
            List&amp;lt;Integer&amp;gt; curLevel = new ArrayList&amp;lt;&amp;gt;();

            // 큐의 사이즈 -&amp;gt; 같은 레벨이 담겨있는 만큼
            int size = q.size();
            for(int i = 0; i &amp;lt; size; i++){
                // 큐에서 값을 꺼냄
                TreeNode curNode = q.poll();
                // 현재 레벨의 리스트에 노드 추가
                curLevel.add(curNode.val);
                // 현재 노드의 좌우 노드를 큐에 추가
                if(curNode.left != null) q.offer(curNode.left);
                if(curNode.right != null) q.offer(curNode.right);
            }

            // 현재 레벨 노드 리스트를 정답 리스트에 추가
            result.add(curLevel);
        }

        // 최종 결과값 반환
        return result;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/LeetCode</category>
      <category>algyrothm</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>tree</category>
      <category>알고리즘</category>
      <category>알고리즘풀이</category>
      <category>자바</category>
      <category>트리</category>
      <author>HYOJUN</author>
      <guid isPermaLink="true">https://hyojun.tistory.com/122</guid>
      <comments>https://hyojun.tistory.com/entry/LeetCode-102-Binary-Tree-Level-Order-Traversal-Java#entry122comment</comments>
      <pubDate>Tue, 17 Jan 2023 23:34:03 +0900</pubDate>
    </item>
  </channel>
</rss>