<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>boraBong</title>
    <link>https://borabong.tistory.com/</link>
    <description>보라봉의 IT블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Tue, 12 May 2026 17:26:52 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>보라봉_</managingEditor>
    <image>
      <title>boraBong</title>
      <url>https://tistory1.daumcdn.net/tistory/4291441/attach/e482450a3746480d89180a938b252229</url>
      <link>https://borabong.tistory.com</link>
    </image>
    <item>
      <title>[Swift] 5430번: AC 문제 풀이 [BOJ - Gold5]</title>
      <link>https://borabong.tistory.com/55</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/5430&quot;&gt;https://www.acmicpc.net/problem/5430&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1682018432514&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;5430번: AC&quot; data-og-description=&quot;각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/5430&quot; data-og-url=&quot;https://www.acmicpc.net/problem/5430&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c9yVxt/hySlLhNb4L/JgvIXnhA6CBuNRHOdYAsK0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/5430&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/5430&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c9yVxt/hySlLhNb4L/JgvIXnhA6CBuNRHOdYAsK0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;5430번: AC&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;Idea&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수 수행시 R이 나올 때마다 reverse를 수행하고, D가 나올 때마다 removeFirst()를 수행해주었더니 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;시간 초과가 발생&lt;/b&gt;&lt;/span&gt;했다.&lt;/li&gt;
&lt;li&gt;따라서 &lt;span style=&quot;color: #6164c6;&quot;&gt;&lt;b&gt;투포인터 방식을 활용&lt;/b&gt;&lt;/span&gt;해서 풀이해주었다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;R을 수행할 차례라면 isReverse flag를 변경해준다&lt;/li&gt;
&lt;li&gt;D를 수행할 차례라면
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;pointer가 reversepointer보다 크다면 &amp;rarr; error인 경우이므로 error를 출력하고 continue문을 수행시킨다. (-&amp;gt; labeled로 인해 중첩 for문 같이 영향)&lt;/li&gt;
&lt;li&gt;isReversed flag 상태라면 &amp;rarr; reversepointer를 좁혀준다.&lt;/li&gt;
&lt;li&gt;isReversed flag 상태가 아니라면 &amp;rarr; pointer 범위를 늘려준다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;RD 함수 종료 후&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;pointer가 reversepointer보다 크다면 빈 배열을 의미하므로 []를 출력한다.&lt;/li&gt;
&lt;li&gt;그렇지 않다면 pointer부터 reversepointer까지 배열을 slice한 후 출력 조건에 맞게 배열을 맵핑한 뒤 출력한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(&lt;span style=&quot;color: #ef5369;&quot;&gt;배열 자체를 출력할 경우 [1,2,3] 과 같이 출력되지 않고 [1, 2, 3] 과 같이 출력되므로 답이 틀리다고 나오므로 주의하자.&lt;/span&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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 data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;풀이&lt;/h2&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;import Foundation

func solution5430() {
    let t = Int(readLine()!)!
    
outloop: for _ in 0..&amp;lt;t {
        let function = readLine()!
        let n = Int(readLine()!)!
        let arr = readLine()!.trimmingCharacters(in: [&quot;[&quot;, &quot;]&quot;]).split(separator: &quot;,&quot;).map({ Int(String($0))! })
        var pointer = 0
        var reversepointer = n - 1
        var isReverse = false
    
        for i in function {
            if i == &quot;R&quot; {
                isReverse = !isReverse
            } else {
                if pointer &amp;gt; reversepointer {
                    print(&quot;error&quot;)
                    continue outloop
                }
                
                if isReverse {
                    reversepointer -= 1
                } else {
                    pointer += 1
                }
            }
        }
        
        if pointer &amp;gt; reversepointer {
            print(&quot;[]&quot;)
        } else {
            var ans = arr[pointer...reversepointer]
            if isReverse {
                ans.reverse()
            }
            print(&quot;[&quot; + ans.map({ String($0) }).joined(separator: &quot;,&quot;) + &quot;]&quot;)
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;알게된 문법&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;for문에 레이블을 붙여 사용하면 중첩 for문도 한꺼번에 탈출이 가능하다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Boj/5430_AC.swift&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Boj/5430_AC.swift&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1682018553933&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - hwangJi-dev/swiftAlgorithm: Algorithm Practice with Swift&quot; data-og-description=&quot;Algorithm Practice with Swift. Contribute to hwangJi-dev/swiftAlgorithm development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Boj/5430_AC.swift&quot; data-og-url=&quot;https://github.com/hwangJi-dev/swiftAlgorithm&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/nlzY7/hySlF3ctVw/7xWqXygHevLvZe7GoxtSv0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Boj/5430_AC.swift&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Boj/5430_AC.swift&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/nlzY7/hySlF3ctVw/7xWqXygHevLvZe7GoxtSv0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - hwangJi-dev/swiftAlgorithm: Algorithm Practice with Swift&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Algorithm Practice with Swift. Contribute to hwangJi-dev/swiftAlgorithm development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>iOS/Algorithm</category>
      <category>ac swift 풀이</category>
      <category>ac 구현 풀이</category>
      <category>ac 투포인터</category>
      <category>swift ac</category>
      <category>swift ac 문제풀이</category>
      <category>swift ac 풀이</category>
      <author>보라봉_</author>
      <guid isPermaLink="true">https://borabong.tistory.com/55</guid>
      <comments>https://borabong.tistory.com/55#entry55comment</comments>
      <pubDate>Fri, 21 Apr 2023 04:20:50 +0900</pubDate>
    </item>
    <item>
      <title>[Swift] 연속된 부분 수열의 합 문제 풀이 [Programmers - Level2]</title>
      <link>https://borabong.tistory.com/54</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/178870&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/178870&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1681813749039&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/178870&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hQ7Gi/hySi1TMRQ1/W9djVP7KgG1475eKBqXC91/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/eznpnT/hySkSgC7BB/A79TV06ZA8lNCPumkrAmXk/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/178870&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/178870&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hQ7Gi/hySi1TMRQ1/W9djVP7KgG1475eKBqXC91/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/eznpnT/hySkSgC7BB/A79TV06ZA8lNCPumkrAmXk/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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  Idea&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;투포인터&lt;/b&gt;&lt;/span&gt;를 이용해서 풀이하자는 아이디어를 떠올려 풀이했다.&lt;/li&gt;
&lt;li&gt;연속된 부분 수열의 합을 저장하는 sum 변수를 두고,
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;현재 누적합이 k보다 작거나 같다면&lt;/b&gt; p2(right)를 1씩 증가 (오른쪽 포인터 증가)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;p2를 증가시키면서 수열을 늘리기 때문에 p2를 증가시키고 누적합에다 p2 원소만큼을 더해줌.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;현재 누적합이 k보다 크다면&lt;/b&gt; p1(left)를 1씩 증가 (왼쪽 포인터 증가)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;p1을 증가시키면서 수열을 좁히기 때문에 누적합에서 p1 원소만큼을 빼주고 p1을 증가시킴.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;합이&amp;nbsp;k인 부분 수열이 여러 개인 경우 길이가 짧은 수열을 찾고, 길이가 짧은 수열이 여러 개인 경우 앞쪽(시작 인덱스가 작은)에 나오는 수열을 찾기 위해 &lt;b&gt;정렬&lt;/b&gt;한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[시작 인덱스, 끝 인덱스]를 기준으로 &lt;b&gt;끝 인덱스&lt;/b&gt;에서 &lt;b&gt;시작인덱스&lt;/b&gt;를 &lt;b&gt;뺀 값이 작은 순서대로 정렬&lt;/b&gt;한다.&lt;/li&gt;
&lt;li&gt;이 때&lt;b&gt; 끝 인덱스&lt;/b&gt;에서 &lt;b&gt;시작인덱스&lt;/b&gt;를 &lt;b&gt;뺀 값이 같다면, 시작 인덱스가 작은 순대로 정렬&lt;/b&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 data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;풀이&lt;/h2&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;import Foundation

func solution(sequence:[Int], k:Int) -&amp;gt; [Int] {
    var sum = sequence[0]
    var p1 = 0
    var p2 = 0
    var ans: [[Int]] = []
    
    while p1 &amp;lt; sequence.count &amp;amp;&amp;amp; p2 &amp;lt; sequence.count {
        if sum == k {
            ans.append([p1, p2])
        }
        
        if sum &amp;lt;= k {
            p2 += 1
            if p2 == sequence.count { break }
            sum += sequence[p2]
        } else {
            sum -= sequence[p1]
            p1 += 1
        }
    }
    
    ans = ans.sorted(by: {
        if $0[1] - $0[0] == $1[1] - $1[0] {
            return $0[0] &amp;lt; $1[0]
        } else {
            return $0[1] - $0[0] &amp;lt; $1[1] - $1[0]
        }
    })
    
    return ans.isEmpty ? [] : ans[0]
}
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>iOS/Algorithm</category>
      <category>swift 연속된 부분 수열의 합</category>
      <category>swift 연속된 부분 수열의 합 풀이</category>
      <category>연속된 부분 수열의 합 swift</category>
      <category>연속된 부분 수열의 합 투포인터</category>
      <author>보라봉_</author>
      <guid isPermaLink="true">https://borabong.tistory.com/54</guid>
      <comments>https://borabong.tistory.com/54#entry54comment</comments>
      <pubDate>Tue, 18 Apr 2023 19:32:04 +0900</pubDate>
    </item>
    <item>
      <title>[Swift] 11726번: 2xn 타일링 문제 풀이 [BOJ - Silver3]</title>
      <link>https://borabong.tistory.com/53</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/11726&quot;&gt;https://www.acmicpc.net/problem/11726&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1680777708618&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;11726번: 2&amp;times;n 타일링&quot; data-og-description=&quot;2&amp;times;n 크기의 직사각형을 1&amp;times;2, 2&amp;times;1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2&amp;times;5 크기의 직사각형을 채운 한 가지 방법의 예이다.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/11726&quot; data-og-url=&quot;https://www.acmicpc.net/problem/11726&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dVTXHV/hyScyI2EOr/cBzkUC21CfQYsDTsGCksdk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480,https://scrap.kakaocdn.net/dn/b4fLL1/hySa7sLLnq/9aXOGYvanfOUe21O5gf1wK/img.png?width=1381&amp;amp;height=554&amp;amp;face=0_0_1381_554&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/11726&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/11726&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dVTXHV/hyScyI2EOr/cBzkUC21CfQYsDTsGCksdk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480,https://scrap.kakaocdn.net/dn/b4fLL1/hySa7sLLnq/9aXOGYvanfOUe21O5gf1wK/img.png?width=1381&amp;amp;height=554&amp;amp;face=0_0_1381_554');&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;11726번: 2&amp;times;n 타일링&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;2&amp;times;n 크기의 직사각형을 1&amp;times;2, 2&amp;times;1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2&amp;times;5 크기의 직사각형을 채운 한 가지 방법의 예이다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;Idea&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2&amp;times;n 크기의 직사각형을 1&amp;times;2, 2&amp;times;1 타일로 채우는 방법의 수를 구하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주어지는 직사각형의 너비 길이가 길어짐에 따라 이를 &lt;b&gt;2x1, 1x2의 작은 단위 조합으로 쪼개어 본다&lt;/b&gt;면 &lt;b&gt;규칙&lt;/b&gt;을 찾을 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1,2.png&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdX0or/btr8uTMF765/JD9krduRmKdMGyi7gOtZY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdX0or/btr8uTMF765/JD9krduRmKdMGyi7gOtZY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdX0or/btr8uTMF765/JD9krduRmKdMGyi7gOtZY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdX0or%2Fbtr8uTMF765%2FJD9krduRmKdMGyi7gOtZY1%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;898&quot; height=&quot;428&quot; data-filename=&quot;1,2.png&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2x1 크기의 직사각형&lt;/b&gt;은 2x1 타일 1개로만 채워질 수 있기에 &lt;b&gt;1가지&lt;/b&gt;의 방법을 갖고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2x2 크기의 직사각형&lt;/b&gt;은 2x1 타일 2개 또는 1x2 타일 2개로 채워질 수 있기에 &lt;b&gt;2가지&lt;/b&gt;의 방법을 갖는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  다음으로 &lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;2x3 크기의 직사각형을 채우는 방법의 수&lt;/b&gt;&lt;/span&gt;를 알아보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dAARbj/btr8wSMZoBB/hL76HhcM48vQdlsYlSVHW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dAARbj/btr8wSMZoBB/hL76HhcM48vQdlsYlSVHW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dAARbj/btr8wSMZoBB/hL76HhcM48vQdlsYlSVHW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdAARbj%2Fbtr8wSMZoBB%2FhL76HhcM48vQdlsYlSVHW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;204&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;1080&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;2x3 크기의 직사각형을 2x1 과 1x2를 기준으로 쪼개어 본다면 아래 두 개의 조합이 나온다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2x1 타일 1개 + &lt;b&gt;2x2 타일 1개&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;우리는 이전 단계에서 2x2 타일을 채우는 방법의 수를 구해놓았으므로 2가지임을 알 수 있다.&lt;/li&gt;
&lt;li&gt;따라서 2x1 타일 1개와 2x2 타일 1개 조합으로 채울 수 있는 방법은 &lt;b&gt;2가지&lt;/b&gt; 이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;1x2 타일 2개 + &lt;b&gt;2x1 타일 1개&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2x1 타일을 채우는 방법의 수는 &lt;b&gt;1가지&lt;/b&gt;이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 두 개의 조합의 가지수를 더하면 2x3 크기의 직사각형을 채울 수 있는 방법의 수를 도출할 수 있으므로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2x3 크기의 직사각형을 채울 수 있는 방법의 수는 &lt;b&gt;3개&lt;/b&gt;이다. (&lt;b&gt;2 + 1&lt;/b&gt; = &lt;b&gt;3&lt;/b&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; 다음으로 &lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;2x4 크기의 직사각형을 채우는 방법의 수&lt;/b&gt;&lt;/span&gt;를 알아보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;238&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PurDC/btr8vwRaZTq/gW5KsfaiwUjfEECoDkquy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PurDC/btr8vwRaZTq/gW5KsfaiwUjfEECoDkquy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PurDC/btr8vwRaZTq/gW5KsfaiwUjfEECoDkquy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPurDC%2Fbtr8vwRaZTq%2FgW5KsfaiwUjfEECoDkquy1%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;1222&quot; height=&quot;238&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;238&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2x4 크기의 직사각형을 2x1 과 1x2를 기준으로 쪼개어 본다면 아래 두 개의 조합이 나온다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2x1 타일 1개 + &lt;b&gt;2x3 타일 1개&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;2x3&lt;/b&gt; 타일을 채우는 방법의 수를 우리는 이전 단계에서 구해놓았으므로 3가지임을 알 수 있다.&lt;/li&gt;
&lt;li&gt;따라서 2x1 타일 1개 + &lt;b&gt;2x3 타일 1개&lt;/b&gt; 조합으로 채울 수 있는 방법은 &lt;b&gt;3가지&lt;/b&gt; 이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;1x2 타일 2개 + &lt;b&gt;2x2 타일 1개&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;2x2&lt;/b&gt; 타일을 채우는 방법의 수를 우리는 이전 단계에서 구해놓았으므로 2가지임을 알 수 있다.&lt;/li&gt;
&lt;li&gt;따라서 2x1 타일 1개 + &lt;b&gt;2x2 타일 1개&lt;/b&gt; 조합으로 채울 수 있는 방법은 &lt;b&gt;2가지&lt;/b&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;p data-ke-size=&quot;size16&quot;&gt;위 두 개의 조합의 가지수를 더하여 2x4 크기의 직사각형을 채울 수 있는 방법의 수를 도출할 수 있으므로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2x4 크기의 직사각형을 채울 수 있는 방법의 수는 &lt;b&gt;5개&lt;/b&gt;이다. (&lt;b&gt;3 + 2&lt;/b&gt; = &lt;b&gt;5&lt;/b&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 직사각형을 쪼개어 생각해볼 수 있고 단계를 반복할 수록 아래와 같은 규칙을 따른다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;전체규칙.png&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/df4DMQ/btr8u3IxqT2/j9vQ44xZLzRohVAbeKKtEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/df4DMQ/btr8u3IxqT2/j9vQ44xZLzRohVAbeKKtEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/df4DMQ/btr8u3IxqT2/j9vQ44xZLzRohVAbeKKtEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdf4DMQ%2Fbtr8u3IxqT2%2Fj9vQ44xZLzRohVAbeKKtEk%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;998&quot; height=&quot;1080&quot; data-filename=&quot;전체규칙.png&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;1080&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;즉 2xn의 직사각형 을 1x2, 2x1의 타일로 채울 수 있는 방법의 수를 알기 위해서는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;이전 두개의 항 각각의 방법의 개수를 알고 있다면 해결할 수 있게 된다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 점화식으로 표현해본다면 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;render2.png&quot; data-origin-width=&quot;278&quot; data-origin-height=&quot;31&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IljkF/btr8wSMZxWn/lK6hoJclGbu4fd6fRSUTc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IljkF/btr8wSMZxWn/lK6hoJclGbu4fd6fRSUTc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IljkF/btr8wSMZxWn/lK6hoJclGbu4fd6fRSUTc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIljkF%2Fbtr8wSMZxWn%2FlK6hoJclGbu4fd6fRSUTc0%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;278&quot; height=&quot;31&quot; data-filename=&quot;render2.png&quot; data-origin-width=&quot;278&quot; data-origin-height=&quot;31&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 data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;풀이&lt;/h2&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;import Foundation

func solution11726() {
    let N = Int(readLine()!)!
    var rectangleArr = Array(repeating: 0, count: N + 1)
    
    if N == 1 {
        print(1)
    } else if N == 2 {
        print(2)
    } else {
        rectangleArr[1] = 1
        rectangleArr[2] = 2
        
        for i in 3...N {
            rectangleArr[i] = (rectangleArr[i - 1] + rectangleArr[i - 2]) % 10007
        }
        
        print(rectangleArr[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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Boj/11726_2%C3%97n%20%ED%83%80%EC%9D%BC%EB%A7%81.swift&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Boj/11726_2%C3%97n%20%ED%83%80%EC%9D%BC%EB%A7%81.swift&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1680778031390&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - hwangJi-dev/swiftAlgorithm: Algorithm Practice with Swift&quot; data-og-description=&quot;Algorithm Practice with Swift. Contribute to hwangJi-dev/swiftAlgorithm development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Boj/11726_2%C3%97n%20%ED%83%80%EC%9D%BC%EB%A7%81.swift&quot; data-og-url=&quot;https://github.com/hwangJi-dev/swiftAlgorithm&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/UxCFw/hySa6UZg8s/3lFSHnVMgFuFgpyQh2NmQ1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Boj/11726_2%C3%97n%20%ED%83%80%EC%9D%BC%EB%A7%81.swift&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Boj/11726_2%C3%97n%20%ED%83%80%EC%9D%BC%EB%A7%81.swift&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/UxCFw/hySa6UZg8s/3lFSHnVMgFuFgpyQh2NmQ1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - hwangJi-dev/swiftAlgorithm: Algorithm Practice with Swift&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Algorithm Practice with Swift. Contribute to hwangJi-dev/swiftAlgorithm development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>iOS/Algorithm</category>
      <category>swift 2xn 타일링</category>
      <category>swift 2xn 타일링 백준</category>
      <category>swift 2xn 타일링 풀이</category>
      <category>백준 2xn 타일링</category>
      <category>백준 2xn 타일링 풀이</category>
      <author>보라봉_</author>
      <guid isPermaLink="true">https://borabong.tistory.com/53</guid>
      <comments>https://borabong.tistory.com/53#entry53comment</comments>
      <pubDate>Thu, 6 Apr 2023 19:49:04 +0900</pubDate>
    </item>
    <item>
      <title>[Swift] 9095번: 1, 2, 3 더하기 문제 풀이 [BOJ - Silver3]</title>
      <link>https://borabong.tistory.com/52</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/9095&quot;&gt;https://www.acmicpc.net/problem/9095&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1680716943963&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;9095번: 1, 2, 3 더하기&quot; data-og-description=&quot;각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/9095&quot; data-og-url=&quot;https://www.acmicpc.net/problem/9095&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/FBS8k/hySa7Mansj/Vkap9XveKvsGZlZ2igJKvk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/9095&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/9095&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/FBS8k/hySa7Mansj/Vkap9XveKvsGZlZ2igJKvk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;9095번: 1, 2, 3 더하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제는 DP의 기본문제라고 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그치만 아직 DP가 익숙하지 않아서 점화식이 바로바로 떠오르지가 않았기에 깊게 고민이 필요했어요..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;후우 뭔가 알 것 같은데.. 규칙이 보일 것 같은데, 머릿속에서 얽혀버려서 결국 다른 풀이를 참고했습니다!&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;b&gt;1, 2, 3의 합으로 나타내는&lt;/b&gt; 이라는 중요한 key point를 놓치고 있었어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진짜 DP는 풀이를 참고하면 할수록 신세계인 것 같아요 .. 어떤 분이 블로그에 고민하다가 보는 DP 풀이는 정말 신세계고 그런걸 많이많이 경험해보라 하셨는데 너무너무 공감이 가네요! ㅎㅎ&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의 신세계를 경험하는데 조금이나마 도움이 되길 바라며 풀이를 올려보겠습니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;Idea&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바텀업 방식으로 DP를 구현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;[기본 정보]&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 71px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 19px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 19px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 19px;&quot;&gt;1가지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 35px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 35px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 35px;&quot;&gt;1 + 1&lt;br /&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 35px;&quot;&gt;2가지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;1 + 1 + 1&lt;br /&gt;1 + 2&lt;br /&gt;2 + 1&lt;br /&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;4가지&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 &lt;b&gt;1, 2, 3은 각각 &lt;/b&gt;1, 2, 3의 합으로 나타내는 방법으로&lt;b&gt; 1, 2, 4가지의 방법을 갖고 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;[규칙]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 다음으로 4가 어떻게 만들어질 수 있는지 살펴보겠습니다!&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;4&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;b&gt;1&lt;/b&gt; + &lt;span data-token-index=&quot;1&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;3&lt;/b&gt;&lt;/span&gt; &lt;br /&gt;&lt;/span&gt;&lt;b&gt;2&lt;/b&gt; +&lt;span data-token-index=&quot;3&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt; 2&lt;/b&gt;&lt;/span&gt; &lt;br /&gt;&lt;/span&gt;&lt;b&gt;3&lt;/b&gt; +&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt; 1 &lt;/b&gt;&lt;/span&gt;&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;  &lt;b&gt;4&lt;/b&gt;를 만들 때 &lt;b&gt;1을 포함하여 4를 만들려면&lt;/b&gt; &amp;rarr; &lt;b&gt;3이라는 숫자가 필요&lt;/b&gt; &lt;br /&gt;이 때 3을 1, 2, 3의 합으로 나타내는 방법은 4가지라는 것을 우리는 이미 알고 있음 &lt;br /&gt;&amp;rarr; 따라서 숫자 4를 &lt;b&gt;1&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;+&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot; data-token-index=&quot;1&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;3&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;의 조합으로 만들 수 있는 방법은 &lt;b&gt;4가지&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 +&lt;span style=&quot;color: #ef5369;&quot;&gt; &lt;b&gt;3&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;1 + &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1 + 2&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;1 + &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;2 + 1&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;1 + &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1 + 1 + 1&lt;/b&gt;&lt;/span&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;span style=&quot;color: #333333; text-align: start;&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;4&lt;/b&gt;를 만들 때 &lt;b&gt;2를 포함하여 4를 만들려면&lt;/b&gt; &amp;rarr; &lt;b&gt;2라는 숫자가 필요&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 2을 1, 2, 3의 합으로 나타내는 방법은 2가지라는 것을 우리는 이미 알고 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 따라서 숫자 4를 &lt;b&gt;2&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;+&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot; data-token-index=&quot;3&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;2&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;의 조합으로 만들 수 있는 방법은 &lt;b&gt;2가지&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 + &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1 + 1&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;2 + &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;2&lt;/b&gt;&lt;/span&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; &amp;nbsp;&lt;b&gt;4&lt;/b&gt;를 만들 때 &lt;b&gt;3을 포함하여 4를 만들려면&lt;/b&gt; &amp;rarr; &lt;b&gt;1이라는 숫자가 필요&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 1을 1, 2, 3의 합으로 나타내는 방법은 1가지라는 것을 우리는 이미 알고 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 따라서 숫자 4를 &lt;b&gt;3&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;+&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;1&lt;/b&gt;&lt;/span&gt;의 조합으로 만들 수 있는 방법은 &lt;b&gt;1가지&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;3 + &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&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;따라서 최종적으로 4를 1, 2, 3의 합으로 나타내는 방법은 &lt;b&gt;7가지&lt;/b&gt; 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 볼 수 있는 규칙은 4가 이전 세개의 항인 1, 2, 3이 가지는 방법의 수를 더한 개수만큼 방법을 가진다는 것인데요,&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: 33.3333%;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&lt;b&gt;1&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;+&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot; data-token-index=&quot;1&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;3&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&lt;span&gt;1 +&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;3&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;1 +&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1 + 2&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;1 +&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;2 + 1&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;1 +&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1 + 1 + 1&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&lt;b&gt;2&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;+&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot; data-token-index=&quot;3&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;2&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&lt;span&gt;2 +&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1 + 1&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;2 +&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;2&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&lt;b&gt;3&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;+&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;1&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&lt;span&gt;3 +&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;합: &lt;span data-token-index=&quot;1&quot;&gt;&lt;b&gt;4 + 2 + 1&lt;/b&gt; =&lt;b&gt; 7&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1 - 1개&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2 - 2개&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3 - 4개&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4 - &lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;7개&lt;/span&gt; ==&lt;/b&gt; 1 + 2 + 4&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ 규칙을 확실히 알아보기 위해서 &lt;b&gt;정수 5를 1, 2, 3의 합으로 나타내는 방법&lt;/b&gt;도 한번 살펴보도록 합시다!!&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 35px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 35px;&quot;&gt;
&lt;td style=&quot;width: 44.6512%; height: 35px;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;width: 55.3488%; height: 35px;&quot;&gt;&lt;b&gt;1&lt;/b&gt; + &lt;span data-token-index=&quot;1&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;4&lt;/b&gt;&lt;/span&gt; &lt;br /&gt;&lt;/span&gt;&lt;b&gt;2&lt;/b&gt; +&lt;span data-token-index=&quot;3&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt; 3&lt;/b&gt;&lt;/span&gt; &lt;br /&gt;&lt;/span&gt;&lt;b&gt;3&lt;/b&gt; +&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt; 2 &lt;/b&gt;&lt;/span&gt;&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;&lt;b&gt;  5&lt;/b&gt;를 만들 때 &lt;b&gt;1을 포함하여 5를 만들려면&lt;/b&gt; &amp;rarr; &lt;b&gt;4라는 숫자가 필요&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 4을 1, 2, 3의 합으로 나타내는 방법은 7가지라는 것을 우리는 이미 알고 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 따라서 숫자 5를 &lt;b&gt;1&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;+&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot; data-token-index=&quot;1&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;4&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;의 조합으로 만들 수 있는 방법은 &lt;b&gt;7가지&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 + &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1 + 1 + 1 + 1&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;1 + &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1 + 1+ 2&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;1 + &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1 + 2 + 1&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;1 + &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1 + 3&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;1 + &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;2 + 1 + 1&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;1 + &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;2+ 2&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;1 +&lt;span style=&quot;color: #ef5369;&quot;&gt; &lt;b&gt;3 + 1&lt;/b&gt;&lt;/span&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; &lt;span&gt;&amp;nbsp;&lt;/span&gt;5&lt;/b&gt;를 만들 때 &lt;b&gt;2를 포함하여 5를 만들려면&lt;/b&gt; &amp;rarr; &lt;b&gt;3이라는 숫자가 필요&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 3을 1, 2, 3의 합으로 나타내는 방법은 4가지라는 것을 우리는 이미 알고 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 따라서 숫자 5를 &lt;b&gt;2&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;+&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot; data-token-index=&quot;3&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;3&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;의 조합으로 만들 수 있는 방법은 &lt;b&gt;4가지&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 +&lt;span style=&quot;color: #ef5369;&quot;&gt; &lt;b&gt;1 + 1 + 1&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;2 + &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1 + 2&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;2 + &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;2 + 1&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;2 + &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;3&lt;/b&gt;&lt;/span&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; &lt;span&gt;&amp;nbsp;&lt;/span&gt;5&lt;/b&gt;를 만들 때 &lt;b&gt;3을 포함하여 5를 만들려면&lt;/b&gt; &amp;rarr; &lt;b&gt;2라는 숫자가 필요&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 2를 1, 2, 3의 합으로 나타내는 방법은 2가지라는 것을 우리는 이미 알고 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;따라서 숫자 5를 &lt;b&gt;3&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;+&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;2&lt;/b&gt;&lt;/span&gt;의 조합으로 만들 수 있는 방법은 &lt;b&gt;2가지&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;3 + &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1 + 1&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;3 +&lt;span style=&quot;color: #ef5369;&quot;&gt; &lt;b&gt;2&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 최종적으로 5를 1, 2, 3의 합으로 나타내는 방법은 &lt;b&gt;13가지&lt;/b&gt; 입니다. (7 + 4 + 2)&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 211px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 140px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 140px;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 140px;&quot;&gt;&lt;b&gt;1&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;+&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot; data-token-index=&quot;1&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;4&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 140px;&quot;&gt;&lt;span&gt;1 +&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1 + 1 + 1 + 1&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;1 +&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1 + 1+ 2&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;1 +&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1 + 2 + 1&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;1 +&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1 + 3&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;1 +&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;2 + 1 + 1&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;1 +&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;2+ 2&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;1 +&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;3 + 1&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 35px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 35px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 35px;&quot;&gt;&lt;b&gt;2&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;+&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot; data-token-index=&quot;3&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;&lt;span&gt; 3&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 35px;&quot;&gt;&lt;span&gt;2 +&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;1 + 1 + 1&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;2 +&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1 + 2&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;2 +&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;2 + 1&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;2 +&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;3&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;&lt;b&gt;3&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;+&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;&lt;span&gt; 2&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;&lt;span&gt;3 +&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;1 + 1&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;3 +&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;2&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 19px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 19px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 19px;&quot;&gt;합:&lt;b&gt;&lt;span&gt; 7 + 4 + 2&lt;/span&gt;&lt;/b&gt;&lt;span data-token-index=&quot;1&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;=&lt;b&gt;&lt;span&gt; 13&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&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;5를 나타내는 방법까지 알아보고 나니 이제 규칙이 확실해진 것 같지 않나요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4&lt;/b&gt;를 나타내는 방법을 도출하기 위해 알아야 했던 수가 (&lt;b&gt;1&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;+&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt; 3&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;, &lt;b&gt;2&lt;/b&gt; + &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;2&lt;/b&gt;&lt;/span&gt;, &lt;b&gt;3&lt;/b&gt; + &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;1&lt;/span&gt;&lt;/b&gt;) &lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;3, 2, 1&lt;/span&gt; &lt;/b&gt;이었고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5&lt;/b&gt;를 나타내는 방법을 도출하기 위해 알아야 했던 수가 (&lt;b&gt;1&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;+&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot; data-token-index=&quot;1&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;4&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;, &lt;b&gt;2&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;+&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot; data-token-index=&quot;3&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;3&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;, &lt;b&gt;3&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;+&lt;/span&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;&lt;span&gt;2&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;4, 3, 2&lt;/b&gt;&lt;/span&gt; 였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6&lt;/b&gt;을 나타내는 방법을 도출하기 위해 알아야 하는 수는 (&lt;b&gt;1&lt;/b&gt; + &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;5&lt;/b&gt;&lt;/span&gt;, &lt;b&gt;2&lt;/b&gt; + &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;4&lt;/b&gt;&lt;/span&gt;, &lt;b&gt;3&lt;/b&gt; + &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;3&lt;/b&gt;&lt;/span&gt;) &lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;5, 4, 3&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;일테고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;7&lt;/b&gt;을 나타내는 방법을 도출하기 위해 알아야 하는 수는 (&lt;b&gt;1&lt;/b&gt; + &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;6&lt;/b&gt;&lt;/span&gt;, &lt;b&gt;2&lt;/b&gt; + &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;5&lt;/b&gt;&lt;/span&gt;, &lt;b&gt;3&lt;/b&gt; + &lt;span&gt;&lt;b&gt;4&lt;/b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;) &lt;/span&gt;&lt;b&gt;&lt;span&gt;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;6, 5, 4&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span&gt;&lt;b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&amp;nbsp;이겠죠?&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 어떤 정수 n을 1, 2, 3의 합으로 나타내는 방법을 알기 위해서는 &lt;br /&gt;&amp;rarr; &lt;b&gt;&lt;span style=&quot;color: #d44c47;&quot; data-token-index=&quot;1&quot;&gt;이전 세개의 항 각각의 방법의 개수를 알고 있다면 해결할 수 있게 된다&lt;/span&gt;&lt;/b&gt;는 말입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 이 문제의 점화식은 아래와 같이 표현할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;render.png&quot; data-origin-width=&quot;197&quot; data-origin-height=&quot;15&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zQFSm/btr8gwkDxaA/WOArMn8zTjkgAyo2eSsSL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zQFSm/btr8gwkDxaA/WOArMn8zTjkgAyo2eSsSL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zQFSm/btr8gwkDxaA/WOArMn8zTjkgAyo2eSsSL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzQFSm%2Fbtr8gwkDxaA%2FWOArMn8zTjkgAyo2eSsSL0%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;197&quot; height=&quot;15&quot; data-filename=&quot;render.png&quot; data-origin-width=&quot;197&quot; data-origin-height=&quot;15&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;원리를 이해하고 나니 &quot;한 번 계산한 문제는 다시 계산하지 않도록 하는 알고리즘인 DP&quot;와 참&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;b&gt;찰떡콩떡&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/i&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 data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;풀이&lt;/h2&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;import Foundation

func solution9095() {
    let TC = Int(readLine()!)!
    var sumCaseArr = Array(repeating: 0, count: 11)
    
    sumCaseArr[1] = 1
    sumCaseArr[2] = 2
    sumCaseArr[3] = 4
    
    for i in 4...10 {
        sumCaseArr[i] = sumCaseArr[i - 1] + sumCaseArr[i - 2] + sumCaseArr[i - 3]
    }
    
    for _ in 0..&amp;lt;TC {
        let n = Int(readLine()!)!
        print(sumCaseArr[n])
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DP.. 간단한 문제인데도 참 어렵네요!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇지만 중요한건 꺾이지 않는 마음이겠죠!        &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Boj/9095_1%2C%202%2C%203%20%EB%8D%94%ED%95%98%EA%B8%B0.swift&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Boj/9095_1%2C%202%2C%203%20%EB%8D%94%ED%95%98%EA%B8%B0.swift&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1680718511949&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - hwangJi-dev/swiftAlgorithm: Algorithm Practice with Swift&quot; data-og-description=&quot;Algorithm Practice with Swift. Contribute to hwangJi-dev/swiftAlgorithm development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Boj/9095_1%2C%202%2C%203%20%EB%8D%94%ED%95%98%EA%B8%B0.swift&quot; data-og-url=&quot;https://github.com/hwangJi-dev/swiftAlgorithm&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b6kL1H/hySaWYwf6B/6TuI9cyoONryVV12NiQlcK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Boj/9095_1%2C%202%2C%203%20%EB%8D%94%ED%95%98%EA%B8%B0.swift&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Boj/9095_1%2C%202%2C%203%20%EB%8D%94%ED%95%98%EA%B8%B0.swift&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b6kL1H/hySaWYwf6B/6TuI9cyoONryVV12NiQlcK/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - hwangJi-dev/swiftAlgorithm: Algorithm Practice with Swift&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Algorithm Practice with Swift. Contribute to hwangJi-dev/swiftAlgorithm development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>iOS/Algorithm</category>
      <category>1 2 3 더하기 풀이</category>
      <category>123 더하기 풀이</category>
      <category>swift 1 2 3 더하기</category>
      <category>swift 1 2 3 더하기 풀이</category>
      <category>swift 123 더하기</category>
      <category>swift 123 더하기 풀이</category>
      <category>swift 9095 풀이</category>
      <category>swift 백준 9095</category>
      <category>백준 123 더하기</category>
      <author>보라봉_</author>
      <guid isPermaLink="true">https://borabong.tistory.com/52</guid>
      <comments>https://borabong.tistory.com/52#entry52comment</comments>
      <pubDate>Thu, 6 Apr 2023 02:48:41 +0900</pubDate>
    </item>
    <item>
      <title>[Swift] 삼각 달팽이 문제 풀이 [Programmers - Level2]</title>
      <link>https://borabong.tistory.com/51</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/68645&quot; target=&quot;_self&quot;&gt;&lt;span&gt;https://school.programmers.co.kr/learn/courses/30/lessons/68645&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;프로그래머스&quot; data-ke-align=&quot;alignCenter&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/68645&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/beViLs/hySa66WoXe/bqvDHdEgcpE1Z2BPIhSd8K/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bp8vrZ/hyR9DL3ndx/Ow6t8hKB9ZDwhBk5EsCVWk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot; data-og-url=&quot;https://programmers.co.kr/&quot;&gt;&lt;a href=&quot;https://programmers.co.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/68645&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/beViLs/hySa66WoXe/bqvDHdEgcpE1Z2BPIhSd8K/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bp8vrZ/hyR9DL3ndx/Ow6t8hKB9ZDwhBk5EsCVWk/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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;Idea&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삼각형을 채울 때 n에서부터&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt; ↙️ ➡️ ↖️ 의 규칙&lt;/b&gt;&lt;/span&gt;을 따르며 숫자가 채워지고, &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;채워지는 기준 개수가 -1씩 줄어든다&lt;/b&gt;&lt;/span&gt;는 것을 발견하여 &lt;br /&gt;해당 원리를 이용해 문제를 풀이했다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;반복문을 돌며 trianglePoint 변수를 1씩 증가하면서, 3으로 나눈 나머지로 규칙을 갖게끔 설계하였다. &lt;br /&gt;(삼각형이므로 3씩 기점으로 패턴이 반복됨)&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 46.1628%; height: 138px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;3으로 나눈 나머지가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;1&lt;/b&gt;일 때 : 하강 (y--)&lt;/li&gt;
&lt;li&gt;3으로 나눈 나머지가&lt;b&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;2&lt;/span&gt;&lt;/b&gt;일 때 : 오른쪽으로 이동 (x++)&lt;/li&gt;
&lt;li&gt;3으로 나눈 나머지가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;0&lt;/b&gt;일 때 : 상승 (y++)&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;lt;예시 &lt;b&gt;N = 5 일 때 &lt;/b&gt;&amp;gt;&lt;br /&gt;&lt;b&gt;[[0], [0,0], [0,0,0], [0,0,0,0], [0,0,0,0,0]]&lt;/b&gt; 배열이 &lt;b&gt;[[1], [2,12], [3,13,11], [4,14,15,10], [5,6,7,8,9]]&lt;/b&gt; 와 같이 채워진다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5WuAY/btr76zUF5i6/rf7e7JSdBKTKHzVa14kq3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5WuAY/btr76zUF5i6/rf7e7JSdBKTKHzVa14kq3K/img.png&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;777&quot; style=&quot;width: 51.5858%;&quot; data-is-animation=&quot;false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5WuAY/btr76zUF5i6/rf7e7JSdBKTKHzVa14kq3K/img.png&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5WuAY%2Fbtr76zUF5i6%2Frf7e7JSdBKTKHzVa14kq3K%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;984&quot; height=&quot;777&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPfSPY/btr73x4DmVo/uaJQ8ej2uI66kP20WyAdmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPfSPY/btr73x4DmVo/uaJQ8ej2uI66kP20WyAdmK/img.png&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;750&quot; style=&quot;width: 47.2514%;&quot; data-is-animation=&quot;false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPfSPY/btr73x4DmVo/uaJQ8ej2uI66kP20WyAdmK/img.png&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPfSPY%2Fbtr73x4DmVo%2FuaJQ8ej2uI66kP20WyAdmK%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;870&quot; height=&quot;750&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;# 1️⃣단계 (↙️&amp;nbsp; 밑으로 하강하며 채우기) &lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;N = 5&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;밑으로 하강하면서 &lt;b&gt;[0][0], [1][0], [2][0], [3][0], [4][0]&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;1038&quot; data-origin-height=&quot;801&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pHDGb/btr76zf2X1l/LUqqH1wf6xVuv5zamH3Plk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pHDGb/btr76zf2X1l/LUqqH1wf6xVuv5zamH3Plk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pHDGb/btr76zf2X1l/LUqqH1wf6xVuv5zamH3Plk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpHDGb%2Fbtr76zf2X1l%2FLUqqH1wf6xVuv5zamH3Plk%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;550&quot; height=&quot;424&quot; data-origin-width=&quot;1038&quot; data-origin-height=&quot;801&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;# 2️⃣단계 (➡️&amp;nbsp; 오른쪽으로 이동하며 채우기)&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;N = 4&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt; &lt;/span&gt;&lt;br /&gt;오른쪽으로 이동하면서 &lt;b&gt;[4][1], [4][2], [4][3], [4][4]&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;1071&quot; data-origin-height=&quot;870&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IO4rh/btr79eJgtUE/4OgXFaK79crZuMDILXe2P0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IO4rh/btr79eJgtUE/4OgXFaK79crZuMDILXe2P0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IO4rh/btr79eJgtUE/4OgXFaK79crZuMDILXe2P0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIO4rh%2Fbtr79eJgtUE%2F4OgXFaK79crZuMDILXe2P0%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;566&quot; height=&quot;460&quot; data-origin-width=&quot;1071&quot; data-origin-height=&quot;870&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;N = 3&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;위로 상승하면서&amp;nbsp;&lt;b&gt;[3][3], [2][2], [1][1]&lt;/b&gt;이 채워진다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;# 3️⃣단계 (↖️ 위로 상승하면서 채우기)&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;762&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dCRRZI/btr77QaIM8g/lLzIAA3wRaVToJEaWZLVSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dCRRZI/btr77QaIM8g/lLzIAA3wRaVToJEaWZLVSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dCRRZI/btr77QaIM8g/lLzIAA3wRaVToJEaWZLVSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdCRRZI%2Fbtr77QaIM8g%2FlLzIAA3wRaVToJEaWZLVSk%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;575&quot; height=&quot;389&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;762&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;# 4️⃣단계 (↙️ 밑으로 하강하면서 채우기)&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;N = 2&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;밑으로 하강하면서&amp;nbsp;&lt;b&gt;[2][1], [3][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;1098&quot; data-origin-height=&quot;747&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boSZ66/btr76ZFJ83Y/yl9bTKqYBfKwGcMO5TIHc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boSZ66/btr76ZFJ83Y/yl9bTKqYBfKwGcMO5TIHc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boSZ66/btr76ZFJ83Y/yl9bTKqYBfKwGcMO5TIHc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboSZ66%2Fbtr76ZFJ83Y%2Fyl9bTKqYBfKwGcMO5TIHc1%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;587&quot; height=&quot;399&quot; data-origin-width=&quot;1098&quot; data-origin-height=&quot;747&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;# 5️⃣단계 (➡️&amp;nbsp; 오른쪽으로 이동하며 채우기)&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;N = 1&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;오른쪽으로 이동하면서&amp;nbsp;&lt;b&gt;[3][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;1083&quot; data-origin-height=&quot;705&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pDbCZ/btr76yOZ6YA/MkT2wuyvqIDdPQNOzeLQDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pDbCZ/btr76yOZ6YA/MkT2wuyvqIDdPQNOzeLQDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pDbCZ/btr76yOZ6YA/MkT2wuyvqIDdPQNOzeLQDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpDbCZ%2Fbtr76yOZ6YA%2FMkT2wuyvqIDdPQNOzeLQDK%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;566&quot; height=&quot;368&quot; data-origin-width=&quot;1083&quot; data-origin-height=&quot;705&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;풀이&lt;/h2&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;import Foundation

func solution(_ n:Int) -&amp;gt; [Int] {
    var n = n
    var trianglePoint = 1
    var triangleFilledCnt = 0 // 삼각형에 채워지는 숫자 개수
    var number = 0 // 계속 오르는 숫자
    var y = -1 // y 좌표
    var ansArr: [[Int]] = []
    
    for i in 1...n {
        ansArr.append(Array(repeating: 0, count: i))
    }
    
    while n &amp;gt; 0 {
        number += 1
        triangleFilledCnt += 1
        
        switch trianglePoint % 3 {
        case 0: // 상승하면서 채워짐
            y -= 1
            ansArr[y][ansArr[y].lastIndex(of: 0) ?? 0] = number
        case 1: // 하강하면서 채워짐
            y += 1
            ansArr[y][ansArr[y].firstIndex(of: 0) ?? 0] = number
        default: // 가장 밑단만 채워짐
            ansArr[y][ansArr[y].firstIndex(of: 0) ?? 0] = number
        }
         
        // 기점 예시: 5 / 4 / 3 / 2 / 1
        if triangleFilledCnt == n {
            n -= 1 // 기준 숫자 - 1
            trianglePoint += 1 // 삼각형 point + 1
            triangleFilledCnt = 0
        }
    }
    
    return ansArr.flatMap({ $0 })
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Programmers/level2/%EC%82%BC%EA%B0%81%20%EB%8B%AC%ED%8C%BD%EC%9D%B4.swift&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Programmers/level2/%EC%82%BC%EA%B0%81%20%EB%8B%AC%ED%8C%BD%EC%9D%B4.swift&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1680681079537&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - hwangJi-dev/swiftAlgorithm: Algorithm Practice with Swift&quot; data-og-description=&quot;Algorithm Practice with Swift. Contribute to hwangJi-dev/swiftAlgorithm development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Programmers/level2/%EC%82%BC%EA%B0%81%20%EB%8B%AC%ED%8C%BD%EC%9D%B4.swift&quot; data-og-url=&quot;https://github.com/hwangJi-dev/swiftAlgorithm&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/SQy34/hySaY2yfRk/MF061wLuIxquG0pHjYKZ1K/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Programmers/level2/%EC%82%BC%EA%B0%81%20%EB%8B%AC%ED%8C%BD%EC%9D%B4.swift&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Programmers/level2/%EC%82%BC%EA%B0%81%20%EB%8B%AC%ED%8C%BD%EC%9D%B4.swift&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/SQy34/hySaY2yfRk/MF061wLuIxquG0pHjYKZ1K/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - hwangJi-dev/swiftAlgorithm: Algorithm Practice with Swift&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Algorithm Practice with Swift. Contribute to hwangJi-dev/swiftAlgorithm development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>iOS/Algorithm</category>
      <category>swift 삼각 달팽이</category>
      <category>swift 삼각 달팽이 문제풀이</category>
      <category>swift 삼각 달팽이 풀이</category>
      <category>삼각 달팽이 풀이</category>
      <category>프로그래머스 삼각 달팽이</category>
      <author>보라봉_</author>
      <guid isPermaLink="true">https://borabong.tistory.com/51</guid>
      <comments>https://borabong.tistory.com/51#entry51comment</comments>
      <pubDate>Wed, 5 Apr 2023 01:53:35 +0900</pubDate>
    </item>
    <item>
      <title>[Swift] 조이스틱 문제 풀이 [Programmers - Level2]</title>
      <link>https://borabong.tistory.com/50</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42860&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/42860&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1680597058731&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/42860&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/AarIu/hyR9B8jCTR/9A617ht7x1KJ8HRV1aGcr1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/dMughT/hySa4gJRK4/4YpAYnCtdkKEdK4vvBHg0k/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/42860&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42860&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/AarIu/hyR9B8jCTR/9A617ht7x1KJ8HRV1aGcr1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/dMughT/hySa4gJRK4/4YpAYnCtdkKEdK4vvBHg0k/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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;처음엔 그리디 유형의 문제라고 해서 어떻게든 간단한 풀이방법을 찾아내려고 했습니다. &lt;br /&gt;그렇지만 최선의 결과를 도출하려면 이동의 경우의 수를 모두 파악하고 계산할 필요가 있었습니다. &lt;br /&gt;순간 재귀로 풀까 하는 생각이 들어서, 그리디로 풀이하는 힌트를 얻고자 질문하기에 들어갔는데 사람들이 화가 많이 나있었어요 ! ㅋㅋㅋㅋㅋㅠㅠㅠ 넘 공감...&lt;/li&gt;
&lt;li&gt;질문하기를 살펴보니 그리디로는 최소 이동 횟수를 파악하기 힘든 문제였습니다. 따라서 dfs(재귀)를 이용해서 풀이해주었습니다.&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;/span&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;를 도출하기 어렵기 때문인 것 같아요. 그럼에도 그리디로 푸신 분들이 있더라고요 .. 존경스럽습니다,,!!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;Idea&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;조이스틱을 상하로 이동시켜 알파벳을 만들어줄 때 알파벳별 최소 이동횟수를 미리 저장해준다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;알파벳 O부터는 Z부터 거슬러올라가는 것이 더 빠르므로 Unicode.Scalar를 응용하여 A~N / O~Z 의 경우를 나누어서 최소 이동횟수를 abcDict에 저장해주었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;완성해야하는 name의 첫 번째 알파벳이 &amp;ldquo;A&amp;rdquo;가 아니라면 조이스틱으로 이동시켜 첫 번째 알파벳을 만들어준다.&lt;/li&gt;
&lt;li&gt;이후 첫 번째 커서 위치에서(0) dfs를 수행한다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;오른쪽 으로 이동하여 도달할 수 있는 A가 아닌 알파벳을 찾아 dfs를 수행한다. (재귀)&lt;/li&gt;
&lt;li&gt;왼쪽 으로 이동하여 도달할 수 있는 A가 아닌 알파벳을 찾아 dfs를 수행한다. (재귀)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이렇게 오른쪽, 왼쪽 모두 이동하며 얻게 되는 최소 카운트를 res에 저장하고 함수를 종료한다.&lt;/li&gt;
&lt;li&gt;결과를 도출할 때 &lt;b&gt;첫 번째 알파벳을 만들어주기 위해 이동시켰던 횟수만큼을 더해&lt;/b&gt;준다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;풀이&lt;/h2&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;import Foundation

func solution(_ name:String) -&amp;gt; Int {
    var abcDict: [String: Int] = [:]
    let name = name.map({ String($0) })
    var initialName = Array(repeating: &quot;A&quot;, count: name.count)
    var res = Int.max
    
    for i in 1...26 {
        if let scalar = Unicode.Scalar(64 + i) {
            if i &amp;lt;= 14 {
                abcDict[scalar.description] = i - 1
            } else {
                abcDict[scalar.description] = abs(i - 26) + 1
            }
        }
    }
    //&quot;A&quot;: 0, B&quot;: 1, &quot;C&quot;: 2, &quot;D&quot;: 3, &quot;E&quot;: 4, &quot;F&quot;: 5, &quot;G&quot;: 6, &quot;H&quot;: 7, &quot;I&quot;: 8, &quot;J&quot;: 9, &quot;K&quot;: 10, &quot;L&quot;: 11, &quot;M&quot;: 12, &quot;N&quot;: 13, &quot;O&quot;: 12, &quot;P&quot;: 11, &quot;Q&quot;: 10, &quot;R&quot;: 9, &quot;S&quot;: 8, &quot;T&quot;: 7, &quot;U&quot;: 6, &quot;V&quot;: 5, &quot;W&quot;: 4, &quot;X&quot;: 3, &quot;Y&quot;: 2, &quot;Z&quot;: 1
    
    if name[0] != &quot;A&quot; {
        initialName[0] = name[0]
    }
    
    /// dfs
    func dfs(_ initialName: [String], _ count: Int, _ cursor: Int) {
        if initialName == name {
            res = min(res, count)
            return
        }
        
        // right
        let right = joystickMovesLeftorRight(true, cursor, name, initialName)
        var rightName = initialName
        var rightCount = count
        rightName[right[0]] = name[right[0]]
        rightCount += abcDict[name[right[0]]]! + right[1]
        dfs(rightName, rightCount, right[0])
        
        // left
        let left = joystickMovesLeftorRight(false, cursor, name, initialName)
        var leftName = initialName
        var leftCount = count
        leftName[left[0]] = name[left[0]]
        leftCount += abcDict[name[left[0]]]! + left[1]
        dfs(leftName, leftCount, left[0])
    }
    
    dfs(initialName, 0, 0)
    return name[0] != &quot;A&quot; ? res + abcDict[name[0]]! : res
}

// MARK: - 조이스틱 좌/우로 이동 후 커서와 이동횟수를 반환하는 메서드
func joystickMovesLeftorRight(_ isRight: Bool, _ cursor: Int, _ name: [String], _ initialName: [String]) -&amp;gt; [Int] {
    var cursor = cursor
    var moves = 0
    
    for _ in name {
        cursor = isRight ? cursor + 1 : cursor - 1 // 오른쪽으로 커서 이동시 + 1 / 왼쪽으로 커서 이동시 - 1
        moves += 1 // 이동횟수는 어떤 경우든 + 1
        
        if cursor &amp;gt; name.count - 1 {
            cursor = 0
        }
        
        if cursor &amp;lt; 0 {
            cursor = name.count - 1
        }
        
				// 찾아야하는 알파벳: A가 아니면서 아직 변환되지 않은 것
        if name[cursor] != &quot;A&quot; &amp;amp;&amp;amp; initialName[cursor] == &quot;A&quot; {
            break
        }
    }
    
    return [cursor, moves]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-04-04 16.51.52.png&quot; data-origin-width=&quot;986&quot; data-origin-height=&quot;1570&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qObxj/btr7T0GpOrX/KUrSLcJ0rDSPbR8nMxBqQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qObxj/btr7T0GpOrX/KUrSLcJ0rDSPbR8nMxBqQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qObxj/btr7T0GpOrX/KUrSLcJ0rDSPbR8nMxBqQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqObxj%2Fbtr7T0GpOrX%2FKUrSLcJ0rDSPbR8nMxBqQ1%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;438&quot; height=&quot;697&quot; data-filename=&quot;스크린샷 2023-04-04 16.51.52.png&quot; data-origin-width=&quot;986&quot; data-origin-height=&quot;1570&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;근데.. 풀이 후 실행을 시켜봤는데 테스트케이스 7번만 실패가 떴어요... ! &lt;br /&gt;40이 최소횟수가 아닌가&amp;hellip;? 기댓값이 왜 더 크지  &amp;nbsp; 함수 설계 잘못했나 아찔했습니다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 실패해서 공책에다 테스트케이스 직접 계산해봤는데,, 최소가 40이 맞는 것 같아서 제출을 해보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-04-04 16.52.01.png&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;1654&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D5mY8/btr74fPu01m/aJjglRTa7i5bi16EynHx7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D5mY8/btr74fPu01m/aJjglRTa7i5bi16EynHx7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D5mY8/btr74fPu01m/aJjglRTa7i5bi16EynHx7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD5mY8%2Fbtr74fPu01m%2FaJjglRTa7i5bi16EynHx7k%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;768&quot; data-filename=&quot;스크린샷 2023-04-04 16.52.01.png&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;1654&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;br /&gt;테스트 7번 정답이 42인 이유가 궁금합니다.....&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[테스트 7번 최소 이동로직]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JAANAAAAN (name)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;AAAAAAAAA (initial)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 58.1395%; height: 130px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;span&gt;1. 첫번째 알파벳 A -&amp;gt; J 로 변경&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;JAAAAAAAA (+9)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;2. 인덱스 0에서 왼쪽으로 커서를 이동시켜 끝 인덱스에 위치한 N으로 이동 (+1)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; A -&amp;gt; N 변경 (+13)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;3. 마지막 인덱스에서 오른쪽으로 커서를 이동시켜 인덱스 3의 N으로 도달 (+4)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; A -&amp;gt; N 변경 (+13)&lt;/span&gt;&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;= 9 + 1 + 13 + 4 + 13 = 40&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;제가 생각한 로직은 이러해서 40이 도출되었는데, 혹시 이상한 부분이 있다면 댓글로 알려주시면 감사하겠습니다..!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Programmers/level2/%EC%A1%B0%EC%9D%B4%EC%8A%A4%ED%8B%B1.swift&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Programmers/level2/%EC%A1%B0%EC%9D%B4%EC%8A%A4%ED%8B%B1.swift&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1680681152321&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - hwangJi-dev/swiftAlgorithm: Algorithm Practice with Swift&quot; data-og-description=&quot;Algorithm Practice with Swift. Contribute to hwangJi-dev/swiftAlgorithm development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Programmers/level2/%EC%A1%B0%EC%9D%B4%EC%8A%A4%ED%8B%B1.swift&quot; data-og-url=&quot;https://github.com/hwangJi-dev/swiftAlgorithm&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cEMoFf/hySa6fdNx2/ySkTe7b9abhxFqGIEh7oS0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Programmers/level2/%EC%A1%B0%EC%9D%B4%EC%8A%A4%ED%8B%B1.swift&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Programmers/level2/%EC%A1%B0%EC%9D%B4%EC%8A%A4%ED%8B%B1.swift&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cEMoFf/hySa6fdNx2/ySkTe7b9abhxFqGIEh7oS0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - hwangJi-dev/swiftAlgorithm: Algorithm Practice with Swift&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Algorithm Practice with Swift. Contribute to hwangJi-dev/swiftAlgorithm development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>iOS/Algorithm</category>
      <category>swift 조이스틱</category>
      <category>swift 조이스틱 그리디</category>
      <category>swift 조이스틱 문제 풀이</category>
      <category>swift 조이스틱 재귀</category>
      <category>swift 조이스틱 테스트 7번</category>
      <category>swift 조이스틱 풀이</category>
      <category>조이스틱 풀이</category>
      <author>보라봉_</author>
      <guid isPermaLink="true">https://borabong.tistory.com/50</guid>
      <comments>https://borabong.tistory.com/50#entry50comment</comments>
      <pubDate>Tue, 4 Apr 2023 17:53:13 +0900</pubDate>
    </item>
    <item>
      <title>[Swift] 불량 사용자 문제 풀이 [Programmers - Level3 (2019 카카오 개발자 겨울 인턴십)]</title>
      <link>https://borabong.tistory.com/49</link>
      <description>&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요 보라봉입니다 :)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;요즘&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;문제를&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;풀면서&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;이전보다&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;다른&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;풀이를&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;참고하는&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;일이&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;적어졌다는&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;걸&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;느꼈습니다!&lt;span&gt;&amp;nbsp;아주&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;조금은&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;발전한&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;것&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;같다는&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;생각이&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;들었고&lt;span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;그러면서&lt;span&gt;&amp;nbsp;블로그에&lt;/span&gt;&lt;span&gt;&amp;nbsp;저&lt;/span&gt;만의&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;알고리즘&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;풀이를&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;올리는&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;빈도가&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;늘게&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;된&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;것&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;같아요&lt;span&gt;. 특히 프로그래머스 레벨2를 풀기 시작하면서는 이렇게 푸는게 맞나 고민하는 시간도 많았고, 1시간이 지나도 끙끙대면서 결국 다른 분의 풀이를 참고해서 문제를 해결하는 경우가 많았습니다. 그러면서 자신감도 조금씩 사라졌었는데요.. 알고리즘을 계속 공부하고 또 도전하면서,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;점점&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;높은&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;레벨의&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;문제를&lt;span&gt;&amp;nbsp;도전하고&amp;nbsp;&lt;/span&gt;풀어보면서&lt;span&gt;&amp;nbsp;제&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;온전한&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;힘으로 문제를 풀게 되는 빈도도 늘어나는 것 같슴니다...!  &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;s&gt;(그렇지만 아직도 어려운 알고리즘의 길..)&lt;/s&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;재미와&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;희열감&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;때문에&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;개발공부가&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;즐거웠고&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;개발을&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;좋아하게&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;되었었는데.. 요즘&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;공부를&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;하면서&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;잊었던 열정이 조금씩 살아나는 것 같습니다. 특히 제가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;개발&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;공부를&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;시작하면서&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;느꼈던&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;재미를&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;다시&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;느끼고&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;있어서&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;너무&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;좋고&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;하루하루가&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;뿌듯한&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;것&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;같네요&lt;span&gt;&amp;nbsp;&lt;/span&gt;ㅎㅎ&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;더&lt;span&gt;&amp;nbsp;파&lt;/span&gt;이팅해야겠습니다!   이 글을 읽는 모든 분들께도 파이팅이 전달되면 좋겠네요  오늘도 같이 힘내봅시다 ~!&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/64064&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/64064&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1680519437008&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/64064&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eLvY4/hyR7ACaRgg/COXRpzmiudwIqXTarvguJK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bIZJDY/hyR9B7ilEH/xdIHk2OJQfjQW0IEFwFWKK/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/64064&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/64064&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eLvY4/hyR7ACaRgg/COXRpzmiudwIqXTarvguJK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bIZJDY/hyR9B7ilEH/xdIHk2OJQfjQW0IEFwFWKK/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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;Idea&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;불량 사용자 id에 해당하는 사용자 id의 인덱스를 저장할 수 있도록 dictionary를 만들고, 반복문을 돌면서 dictionary에 값을 채운다.&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;[&quot;fr*d*&quot;: [&quot;frodo&quot;, &amp;ldquo;fradi&amp;rdquo;],  &quot;*rodo&quot;: [&quot;frodo&quot;, &quot;crodo&quot;], &quot;*****&quot;: [&quot;abc123&quot;, &quot;frodoc&quot;]] 를 떠올리며 추후에 dfs를 수행할 때 편리하도록 실제 구현시에는 사용자 id의 인덱스값을 저장한다.&lt;/li&gt;
&lt;li&gt;&amp;rArr; [&quot;fr*d*&quot;: Set([0, 1]), &quot;*rodo&quot;: Set([0, 2]), &amp;ldquo;*****&amp;rdquo;: Set([3, 4])]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;dfs를 수행하며 불량 제재 아이디와 사용자 아이디를 맵핑한 쌍을 만든다.&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;dfs를 활용해야겠다고 떠올리면서, &lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;dfs의 깊이(=depth)&lt;/b&gt;&lt;/span&gt;를 &lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;banned_id 배열의 index&lt;/b&gt;&lt;/span&gt;로 응용하였다.&lt;/li&gt;
&lt;li&gt;즉, banned_id = [&quot;fr*d*&quot;, &quot;abc1**&quot;] 의 경우
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;depth가 0일 때 &amp;rarr; fr*d*에 해당하는 user_id가 결정되고&lt;/li&gt;
&lt;li&gt;depth가 1일 때 &amp;rarr; abc1** 에 해당하는 user_id가 결정된다.&lt;/li&gt;
&lt;li&gt;이렇게 depth가 깊어지면서 banned_id에 해당하는 유저의 id가 하나씩 결정되므로 depth의 최종 깊이가 되었을 때 하나의 제재 아이디 목록(bannedCase) 쌍이 생긴다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;  [ dfs 설계 ]&amp;nbsp;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #6164c6;&quot;&gt;visited: user_id의 방문 여부(=현재 쌍에 포함되었는지)를 저장하는 visited 배열이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #6164c6;&quot;&gt;depth : 불량 아이디 목록의 index로서, dfs의 깊이를 뜻한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #6164c6;&quot;&gt;userIdx: 유저 아이디의 인덱스이다. visited 여부를 파악하고, 제재 아이디 쌍을 만드는데 사용된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #6164c6;&quot;&gt;bannedCase: 제재 아이디 쌍이 저장되는 Set&amp;lt;String&amp;gt;형 배열이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #6164c6;&quot;&gt;현재 userIdx가 방문되지 않았다면, 현재 userIdx를 방문처리하고, bannedCase에 현재 user_id를 저장한다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #6164c6;&quot;&gt;이후 다음 깊이가 존재한다면 (&lt;span style=&quot;color: #6164c6; text-align: left;&quot;&gt;depth&lt;/span&gt; + 1가 banned_id의 개수보다 작다면)&lt;/span&gt;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #6164c6;&quot;&gt;다음 깊이에 해당하는 제재 id 후보들을 차례로 돌며 dfs를 수행한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #6164c6;&quot;&gt;제재 아이디 쌍의 개수가 깊이와 같아졌다면 제재 아이디 쌍을 저장하는 bannedCases에 해당 쌍을 저장하고 함수를 종료한다.&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;제재 아이디 목록들을 구했을 때 아이디들이 나열된 순서와 관계없이 아이디 목록의 내용이 동일하다면 같은 것으로 처리하여 하나로 세면 됩니다&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;라는 조건을 해결하기 위해서 Set&amp;lt;Set&amp;lt;String&amp;gt;&amp;gt; 자료구조를 사용해주었다.&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 조건을 처리하기 위해 처음에는 bannedCases를 Set&amp;lt;[String]&amp;gt; 으로 디자인하여 하나의 제재 아이디 목록(bannedCase)이 만들어지면 해당 배열을 정렬하여 bannedCases에 insert해주었다.&lt;/li&gt;
&lt;/ul&gt;
하지만 해당 작업이 시간초과를 유발한다는 것을 깨닫고 bannedCases 자체를 Set&amp;lt;Set&amp;lt;String&amp;gt;&amp;gt; 자료구조로 바꿔 구현해주었다. &lt;br /&gt;&amp;rarr; case3번 시간초과가 떴었는데, 해당 방법으로 해결할 수 있었다.  &lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;풀이&lt;/h2&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;import Foundation

func solution(_ user_id:[String], _ banned_id:[String]) -&amp;gt; Int {
    var banUserDict: [String: Set&amp;lt;Int&amp;gt;] = [:]
    var bannedCases: Set&amp;lt;Set&amp;lt;String&amp;gt;&amp;gt; = []

    for b in banned_id {
        if banUserDict[b] == nil {
            banUserDict[b] = []
        }

        for (udx, u) in user_id.enumerated() {
            if checkBanId(u, b) {
                banUserDict[b]?.insert(udx)
            }
        }
    }
    
    /// dfs 수행 재귀함수
    func dfs(_ depth: Int, _ userIdx: Int, _ bannedCase: Set&amp;lt;String&amp;gt;, _ visited: [Bool]) {
        var bannedCase = bannedCase
        var visited = visited
        
        // 현재 userIdx가 방문되지 않았다면
        if !visited[userIdx] {
            // 현재 userIdx를 방문처리
            visited[userIdx] = true
            // bannedCase에 현재 user_id를 저장
            bannedCase.insert(user_id[userIdx])
            
            // 다음 깊이가 존재한다면
            if depth + 1 &amp;lt; banned_id.count {
                // 다음 깊이에 해당하는 제재 id 후보들을 차례로 돌며
                for i in banUserDict[banned_id[depth + 1]]! {
                    // dfs를 수행
                    dfs(depth + 1, i, bannedCase, visited)
                }
            }
        }

        // 제재 아이디 쌍의 개수가 깊이와 같아졌다면
        if bannedCase.count == banned_id.count {
            // 제재 아이디 쌍을 저장
            bannedCases.insert(bannedCase)
            // 함수 종료
            return
        }
    }

    let visited = Array(repeating: false, count: user_id.count)
    
    for i in banUserDict[banned_id[0]]! {
        // 깊이 0부터 dfs 수행
        dfs(0, i, [], visited)
    }

    return bannedCases.count
}

// MARK: - 제한당한 id인지 확인하고 제한여부를 리턴하는 메서드
func checkBanId(_ user_id: String, _ banned_id: String) -&amp;gt; Bool {
    if banned_id.count != user_id.count { return false }

    let userID = Array(user_id)
    for (idx, i) in banned_id.enumerated() {
        if i != &quot;*&quot; &amp;amp;&amp;amp; i != userID[idx] { return false }
    }

    return true
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dfs 풀이.png&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;870&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SmRdR/btr7OyJnQrp/J9zSmcEbkH3V3ITzf6CEBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SmRdR/btr7OyJnQrp/J9zSmcEbkH3V3ITzf6CEBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SmRdR/btr7OyJnQrp/J9zSmcEbkH3V3ITzf6CEBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSmRdR%2Fbtr7OyJnQrp%2FJ9zSmcEbkH3V3ITzf6CEBk%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;403&quot; height=&quot;400&quot; data-filename=&quot;dfs 풀이.png&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;870&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;제출 후 해당 문제는 dfs가 중점이라기보단, HashSet을 잘 응용하여 문제를 푸는 능력이 요구되었던 것 같다는 생각이 들어서 순열(permutation)을 이용하여 해당 문제를 한번 더 풀이해보았다 !&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;Idea&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순열은 조합과 달리, index 정보에 따라 다른 조합을 만들어내므로 해당 문제에 순열이 적합하다는 생각이 들었다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;banned_id.count 크기의 순열을 생성하여 perm에 저장한다.&lt;/li&gt;
&lt;li&gt;이후 perm을 돌면서 perm의 원소의 index와 banned_id의 index를 맵핑하여 checkBanId를 수행한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;perm&lt;/b&gt; = [[&quot;frodo&quot;, &quot;fradi&quot;], [&quot;frodo&quot;, &quot;crodo&quot;], [&quot;frodo&quot;, &quot;abc123&quot;], [&quot;frodo&quot;, &quot;frodoc&quot;], [&quot;fradi&quot;, &quot;frodo&quot;], [&quot;fradi&quot;, &quot;crodo&quot;], [&quot;fradi&quot;, &quot;abc123&quot;], [&quot;fradi&quot;, &quot;frodoc&quot;], [&quot;crodo&quot;, &quot;frodo&quot;], [&quot;crodo&quot;, &quot;fradi&quot;], [&quot;crodo&quot;, &quot;abc123&quot;], [&quot;crodo&quot;, &quot;frodoc&quot;], [&quot;abc123&quot;, &quot;frodo&quot;], [&quot;abc123&quot;, &quot;fradi&quot;], [&quot;abc123&quot;, &quot;crodo&quot;], [&quot;abc123&quot;, &quot;frodoc&quot;], [&quot;frodoc&quot;, &quot;frodo&quot;], [&quot;frodoc&quot;, &quot;fradi&quot;], [&quot;frodoc&quot;, &quot;crodo&quot;], [&quot;frodoc&quot;, &quot;abc123&quot;]]&lt;/li&gt;
&lt;li&gt;&lt;b&gt;banned_id&lt;/b&gt; = [&quot;fr*d*&quot;, &quot;abc1**&quot;]&lt;/li&gt;
&lt;/ul&gt;
perm[0]인 [&quot;frodo&quot;, &quot;fradi&quot;] 를 예로 들어보자. (perm[0]을 p로 지칭하겠다.)&lt;br /&gt;p[0] = &quot;frodo&quot; 와 banned_id[0] = &quot;fr*d*&quot; 를 맵핑하여 checkBanId를 수행한다.&lt;/li&gt;
&lt;li&gt;p의 모든 원소가 banned_id와 맵핑된다면 해당 조합은 제재 아이디 목록에 해당됨을 뜻하므로 bannedCases에 넣어준다.&lt;/li&gt;
&lt;li&gt;bannedCases의 개수를 리턴한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;풀이&lt;/h2&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;import Foundation

func solution(_ user_id:[String], _ banned_id:[String]) -&amp;gt; Int {
    var bannedCases: Set&amp;lt;Set&amp;lt;String&amp;gt;&amp;gt; = []
    let perm = permutation(user_id, banned_id.count)

    for p in perm {
        var isValid = true
        for (idx, i) in p.enumerated() {
            if !checkBanId(i, banned_id[idx]) {
                isValid = false
            }
        }

        if isValid {
            bannedCases.insert(Set(p))
        }
    }

    return bannedCases.count
}

// MARK: - 순열 메서드
func permutation(_ array: [String], _ n: Int) -&amp;gt; [[String]] {
    var result = [[String]]()
    if array.count &amp;lt; n { return result }

    var visited = Array(repeating: false, count: array.count)

    func cycle(_ now: [String]) {
        if now.count == n {
            result.append(now)
            return
        }

        for i in 0..&amp;lt;array.count {
            if visited[i] {
                continue
            } else {
                visited[i] = true
                cycle(now + [array[i]])
                visited[i] = false
            }
        }
    }

    cycle([])

    return result
}

// MARK: - 제한당한 id인지 확인하고 제한여부를 리턴하는 메서드
func checkBanId(_ user_id: String, _ banned_id: String) -&amp;gt; Bool {
    if banned_id.count != user_id.count { return false }

    let userID = Array(user_id)
    for (idx, i) in banned_id.enumerated() {
        if i != &quot;*&quot; &amp;amp;&amp;amp; i != userID[idx] { return false }
    }

    return true
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;순열 풀이.png&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;932&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mXMgp/btr7TZerQSK/sUwpolXycIVlVE97yqa59K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mXMgp/btr7TZerQSK/sUwpolXycIVlVE97yqa59K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mXMgp/btr7TZerQSK/sUwpolXycIVlVE97yqa59K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmXMgp%2Fbtr7TZerQSK%2FsUwpolXycIVlVE97yqa59K%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;416&quot; height=&quot;394&quot; data-filename=&quot;순열 풀이.png&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;932&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;이렇게 불량 사용자 문제를 dfs로 풀어보고, 순열을 이용해서도 풀어보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;풀고 나서 살펴보니 두 가지 방법 중 어느 것을 사용하여 푸는지는 중요하지 않았던 것 같다. HashSet 자료구조를 알고, 활용할 줄 안다면 해당 문제를 어떤 방법으로든 풀 수 있기 때문이다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇지만 시간 복잡도 측면에서 불필요한 비교를 줄이는 dfs 방법이 훨씬 더 좋은 효율을 가지기 때문에 dfs가 더 좋은 풀이가 아닐까 생각이 들었다.  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Programmers/level3/%EB%B6%88%EB%9F%89%20%EC%82%AC%EC%9A%A9%EC%9E%90.swift&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Programmers/level3/%EB%B6%88%EB%9F%89%20%EC%82%AC%EC%9A%A9%EC%9E%90.swift&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1680520278259&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - hwangJi-dev/swiftAlgorithm: Algorithm Practice with Swift&quot; data-og-description=&quot;Algorithm Practice with Swift. Contribute to hwangJi-dev/swiftAlgorithm development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Programmers/level3/%EB%B6%88%EB%9F%89%20%EC%82%AC%EC%9A%A9%EC%9E%90.swift&quot; data-og-url=&quot;https://github.com/hwangJi-dev/swiftAlgorithm&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bcuMwz/hyR7z4l0sB/8Y02a7ffMqvMGkkyKkKxG1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Programmers/level3/%EB%B6%88%EB%9F%89%20%EC%82%AC%EC%9A%A9%EC%9E%90.swift&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Programmers/level3/%EB%B6%88%EB%9F%89%20%EC%82%AC%EC%9A%A9%EC%9E%90.swift&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bcuMwz/hyR7z4l0sB/8Y02a7ffMqvMGkkyKkKxG1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - hwangJi-dev/swiftAlgorithm: Algorithm Practice with Swift&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Algorithm Practice with Swift. Contribute to hwangJi-dev/swiftAlgorithm development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>iOS/Algorithm</category>
      <category>2019 카카오 개발자 겨울 인턴십 코테 풀이</category>
      <category>swift 불량 사용자</category>
      <category>swift 불량 사용자 시간초과</category>
      <category>swift 불량 사용자 풀이</category>
      <category>불량 사용자 3번</category>
      <category>불량 사용자 시간초과</category>
      <category>불량 사용자 풀이</category>
      <category>카카오 불량 사용자 풀이</category>
      <author>보라봉_</author>
      <guid isPermaLink="true">https://borabong.tistory.com/49</guid>
      <comments>https://borabong.tistory.com/49#entry49comment</comments>
      <pubDate>Mon, 3 Apr 2023 20:08:43 +0900</pubDate>
    </item>
    <item>
      <title>[Swift] 7576번: 토마토 문제 풀이 [BOJ - Gold5]</title>
      <link>https://borabong.tistory.com/48</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/7576&quot;&gt;https://www.acmicpc.net/problem/7576&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1680442052266&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;7576번: 토마토&quot; data-og-description=&quot;첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 &amp;le; M,N &amp;le; 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/7576&quot; data-og-url=&quot;https://www.acmicpc.net/problem/7576&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Gea0a/hyR9JRdtw7/XyYuRSUPUKq79sEhAa9O8k/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480,https://scrap.kakaocdn.net/dn/bekKji/hyR7yRkf20/qFwP4vgG2MCUPubYY92qnK/img.png?width=430&amp;amp;height=388&amp;amp;face=0_0_430_388&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/7576&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/7576&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Gea0a/hyR9JRdtw7/XyYuRSUPUKq79sEhAa9O8k/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480,https://scrap.kakaocdn.net/dn/bekKji/hyR7yRkf20/qFwP4vgG2MCUPubYY92qnK/img.png?width=430&amp;amp;height=388&amp;amp;face=0_0_430_388');&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;7576번: 토마토&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 &amp;le; M,N &amp;le; 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;Idea&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;토마토가 모두 익을 때까지의 최소 날짜&lt;/b&gt;를 구하기 위해서 &lt;b&gt;BFS를 수행&lt;/b&gt;하자.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;N X M 크기의 tomatos 2차원 배열을 만든다.&lt;/li&gt;
&lt;li&gt;저장될 때부터 익혀진 토마토 (=1)의 좌표를 찾아 ripeTomatos 배열에 저장해준다.&lt;/li&gt;
&lt;li&gt;만약 저장될 때부터 모든 토마토가 익어있는 상태라면 0을 출력하고, 그렇지 않으면 bfs를 수행한다.&lt;/li&gt;
&lt;li&gt;bfs를 수행하기에 앞서 queue에 시작 좌표인 ripeTomatos들을 저장해준다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;✅ 1이 여러 개인 경우 여러 지점에서 출발해 토마토를 익혀야함.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이후 queue의 원소를 꺼내면서 상 하 좌 우 좌표에 위치한 토마토들을 익힌다.&lt;/li&gt;
&lt;li&gt;bfs가 수행된 이후 모든 토마토가 익었다면 토마토가 모두 익기까지의 최소 날짜를 출력하고, 그렇지 않다면 -1을 출력한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;풀이&lt;/h2&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;import Foundation

func solution7576() {
    let box = readLine()!.split(separator: &quot; &quot;).map({ Int(String($0))! })
    var tomatos: [[Int]] = []
    var ripeTomatos: [[Int]] = []
    var lastDay = 0
    var isFirstAllRipe = true
    
    for n in 0..&amp;lt;box[1] {
        let tomato = readLine()!.split(separator: &quot; &quot;).map({ Int(String($0))! })
        tomatos.append(tomato)
        
        // 좌표 1 찾기
        for (mdx, m) in tomato.enumerated() {
            if m == 1 {
                ripeTomatos.append([n, mdx])
            } else if m == 0 {
                isFirstAllRipe = false
            }
        }
    }
    
    func bfs() {
        var queue: [[Int]?] = ripeTomatos 
        // queue는 FIFO이므로 이미 익은 좌표들부터 차례로 방문하여 토마토를 익힐 수 있다.
        var pointer = 0
        
        let dx = [-1, 1, 0, 0]
        let dy = [0, 0, -1, 1]
        
        while pointer &amp;lt; queue.count {
            let cx = queue[pointer]![0]
            let cy = queue[pointer]![1]
            queue[pointer] = nil
            pointer += 1
            
            for i in 0...3 {
                let nx = cx + dx[i]
                let ny = cy + dy[i]
                
                if nx &amp;lt; 0 || ny &amp;lt; 0 || nx &amp;gt; tomatos.count - 1 || ny &amp;gt; tomatos[0].count - 1 {
                    continue
                }
                
                if tomatos[nx][ny] == -1 {
                    continue
                }
                
                if tomatos[nx][ny] == 0 {
                    tomatos[nx][ny] = tomatos[cx][cy] + 1
                    queue.append([nx, ny])
                    lastDay = tomatos[nx][ny] - 1
                }
            }
        }
    }
    
    var isAllRipe = true
    
    // 만약, 저장될 때부터 모든 토마토가 익어있는 상태이면 0 출력
    if isFirstAllRipe {
        print(0)
    } else {
        bfs()
        
        for i in tomatos {
            if i.contains(0) {
                isAllRipe = false
            }
        }
        
        if isAllRipe {
            print(lastDay)
        } else {
            // 토마토가 모두 익지는 못하는 상황이면 -1을 출력
            print(-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를 수행할 때 queue의 첫번째 원소를 꺼내기 위해 removeFirst()를 사용한다면 시간초과가 발생할 수 있기 때문에&lt;br /&gt;본 풀이에서는 포인터의 원리를 이용하여 풀이해보았다  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Boj/7576_%ED%86%A0%EB%A7%88%ED%86%A0.swift&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Boj/7576_%ED%86%A0%EB%A7%88%ED%86%A0.swift&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1680521670960&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - hwangJi-dev/swiftAlgorithm: Algorithm Practice with Swift&quot; data-og-description=&quot;Algorithm Practice with Swift. Contribute to hwangJi-dev/swiftAlgorithm development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Boj/7576_%ED%86%A0%EB%A7%88%ED%86%A0.swift&quot; data-og-url=&quot;https://github.com/hwangJi-dev/swiftAlgorithm&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dSlid6/hyR9GguqaU/NK6kutmcrghwWN96iKGXE1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Boj/7576_%ED%86%A0%EB%A7%88%ED%86%A0.swift&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Boj/7576_%ED%86%A0%EB%A7%88%ED%86%A0.swift&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dSlid6/hyR9GguqaU/NK6kutmcrghwWN96iKGXE1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - hwangJi-dev/swiftAlgorithm: Algorithm Practice with Swift&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Algorithm Practice with Swift. Contribute to hwangJi-dev/swiftAlgorithm development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>iOS/Algorithm</category>
      <category>swift 토마토</category>
      <category>swift 토마토 백준</category>
      <category>swift 토마토 시간초과</category>
      <category>swift 토마토 풀이</category>
      <category>토마토 문제풀이</category>
      <category>토마토 풀이</category>
      <author>보라봉_</author>
      <guid isPermaLink="true">https://borabong.tistory.com/48</guid>
      <comments>https://borabong.tistory.com/48#entry48comment</comments>
      <pubDate>Sun, 2 Apr 2023 22:30:03 +0900</pubDate>
    </item>
    <item>
      <title>[Swift] 2178번: 미로 탐색 문제 풀이 [BOJ - Silver1]</title>
      <link>https://borabong.tistory.com/47</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2178&quot;&gt;https://www.acmicpc.net/problem/2178&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1680349175922&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;2178번: 미로 탐색&quot; data-og-description=&quot;첫째 줄에 두 정수 N, M(2 &amp;le; N, M &amp;le; 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/2178&quot; data-og-url=&quot;https://www.acmicpc.net/problem/2178&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cdWEIN/hyR7utoxub/gpiKHIURa5lkHlkwpmUqRk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2178&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/2178&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cdWEIN/hyR7utoxub/gpiKHIURa5lkHlkwpmUqRk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;2178번: 미로 탐색&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 두 정수 N, M(2 &amp;le; N, M &amp;le; 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;첫 Idea&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;입력값을 MxN의 2차원 배열로 만들기&lt;/li&gt;
&lt;li&gt;방문 여부를 저장하는 visited 배열 만들기&lt;/li&gt;
&lt;li&gt;dfs 재귀함수 만들기
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;이동할 수 있는 좌표계가 아니라면 함수 return하여 탈출&lt;/li&gt;
&lt;li&gt;방문되지 않았고, 1로 지나갈 수 있는 미로라면 &amp;rarr; 상 하 좌 우 좌표로 이동시키기 (재귀)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 그러나 dfs 재귀함수로는 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;시간초과가 발생&lt;/b&gt;&lt;/span&gt;했다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;그 이유인즉슨!! &lt;br /&gt;&lt;b&gt;dfs는 하나의 노드를 깊게 탐색&lt;/b&gt;하기 때문에&lt;b&gt; 해당 노드가 최선의 값을 도출하는 노드가 아닐 경우 기회비용이 더 들게 되기 때문&lt;/b&gt;이었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;풀이&lt;/h2&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;span style=&quot;color: #ee2323;&quot;&gt;시간초과 발생&lt;/span&gt; DFS 재귀 풀이&lt;/b&gt;  &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;import Foundation

func solution2178() {
    let NM = readLine()!.split(separator: &quot; &quot;).map({ Int($0)! })
    var miros: [[Int]] = []
    
    for _ in 0..&amp;lt;NM[0] {
        let miro = readLine()!
        miros.append(Array(miro).map({ Int(String($0))! }))
    }
    
    var visited = Array(repeating: Array(repeating: false, count: miros[0].count), count: miros.count)
    var minDistance = Int.max
    
    func dfs(start: [Int], count: Int) {
        // 이동할 수 있는 좌표계가 아니라면 함수 return
        if start[0] &amp;lt; 0 || start[0] &amp;gt; miros.count - 1 || start[1] &amp;lt; 0 || start[1] &amp;gt; miros[0].count - 1 { return }
        
        // N, M에 도달했다면
        if start == [NM[0] - 1, NM[1] - 1] {
            if minDistance &amp;gt; count {
                minDistance = count
            }
            return
        }
        
        // 방문되지 않았고, 1로 지나갈 수 있는 미로라면
        if !visited[start[0]][start[1]] &amp;amp;&amp;amp; miros[start[0]][start[1]] == 1 {
            // 방문 처리
            visited[start[0]][start[1]] = true
            
            // 상 하 좌 우 좌표로 이동
            dfs(start: [start[0] + 1, start[1]], count: count + 1)
            dfs(start: [start[0] - 1, start[1]], count: count + 1)
            dfs(start: [start[0], start[1] + 1], count: count + 1)
            dfs(start: [start[0], start[1] - 1], count: count + 1)
            visited[start[0]][start[1]] = false
        }
    }
    
    dfs(start: [0,0], count: 1)
    print(minDistance)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;정답 Idea&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;입력값을 MxN의 2차원 배열로 만들기&lt;/li&gt;
&lt;li&gt;BFS함수 만들기 &lt;br /&gt;(BFS는 &lt;b&gt;시작 지점에서 가까운 노드부터 차례대로 그래프의 모든 노드를 탐색&lt;/b&gt;하기 때문에 BFS를 이용하면 효율적으로 풀이할 수 있다.)
&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;상 하 좌 우 4가지 경우를 반복문으로 돌면서 처음 지나가는 미로인 경우 (미로 노드 정보가 1인 경우) &lt;br /&gt;-&amp;gt; &lt;b&gt;현재 지점의 거리 정보에 1을 더한 값을 저장&lt;/b&gt;한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;정답 풀이&lt;/h2&gt;
&lt;pre class=&quot;swift&quot;&gt;&lt;code&gt;func solution2178() {
    let NM = readLine()!.split(separator: &quot; &quot;).map({ Int($0)! })
    var miros: [[Int]] = []
    
    for _ in 0..&amp;lt;NM[0] {
        let miro = readLine()!
        let miroArr = Array(miro).map({ Int(String($0))! })
        miros.append(miroArr)
    }
    
    // 이동할 네 방향 정의 (좌, 우, 상, 하)
    let dx = [-1, 1, 0, 0]
    let dy = [0, 0, -1, 1]
    
    func bfs(x: Int, y: Int) -&amp;gt; Int {
        var queue: [[Int]] = []
        queue.append([x, y])
        
        while !queue.isEmpty {
            let c = queue.removeFirst()
            // 현위치 cx, cy
            let cx = c[0]
            let cy = c[1]
            
            // 현위치에서 네 방향으로 위치 확인
            for i in 0..&amp;lt;4 {
                let nx = cx + dx[i]
                let ny = cy + dy[i]
                
                // 미로찾기 공간을 벗어난 경우 무시
                if nx &amp;lt; 0 || ny &amp;lt; 0 || nx &amp;gt; miros.count - 1 || ny &amp;gt; miros[0].count - 1 {
                    continue
                }
                
                // 벽인 경우 무시
                if miros[nx][ny] == 0 { continue }
                
                // 해당 노드를 처음 방문하는 경우라면 1이 저장되어 있을 것이므로
                // 해당 경우에만 최단 거리를 기록한다
                if miros[nx][ny] == 1 {
                    // 현재 위치의 거리 정보 + 1
                    miros[nx][ny] = miros[cx][cy] + 1
                    queue.append([nx, ny])
                }
            }
        }
        
        return miros[NM[0] - 1][NM[1] - 1]
    }
    
    print(bfs(x: 0, 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;&lt;b&gt;미로 탐색&lt;/b&gt; 문제를 풀어보면서 해당 문제처럼 &lt;b&gt;경로의 최단 거리를 구하는 문제&lt;/b&gt;는 &lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;BFS로 풀이해야 효율적&lt;/b&gt;&lt;/span&gt;이라는걸 몸소 체감할 수 있었습니다   !!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Boj/2178_%EB%AF%B8%EB%A1%9C%ED%83%90%EC%83%89.swift&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Boj/2178_%EB%AF%B8%EB%A1%9C%ED%83%90%EC%83%89.swift&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1680521736827&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - hwangJi-dev/swiftAlgorithm: Algorithm Practice with Swift&quot; data-og-description=&quot;Algorithm Practice with Swift. Contribute to hwangJi-dev/swiftAlgorithm development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Boj/2178_%EB%AF%B8%EB%A1%9C%ED%83%90%EC%83%89.swift&quot; data-og-url=&quot;https://github.com/hwangJi-dev/swiftAlgorithm&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/nUVMX/hyR9JxwYUD/sZX9luQT3f06VbNkZSuCk0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Boj/2178_%EB%AF%B8%EB%A1%9C%ED%83%90%EC%83%89.swift&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Boj/2178_%EB%AF%B8%EB%A1%9C%ED%83%90%EC%83%89.swift&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/nUVMX/hyR9JxwYUD/sZX9luQT3f06VbNkZSuCk0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - hwangJi-dev/swiftAlgorithm: Algorithm Practice with Swift&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Algorithm Practice with Swift. Contribute to hwangJi-dev/swiftAlgorithm development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>iOS/Algorithm</category>
      <category>swift 미로 탐색</category>
      <category>swift 미로 탐색 문제 풀이</category>
      <category>swift 미로 탐색 풀이</category>
      <category>swift 미로탐색</category>
      <category>swift 미로탐색 시간초과</category>
      <category>미로 탐색 시간초과</category>
      <category>미로탐색 시간초과</category>
      <category>미로탐색 시간초과 swift</category>
      <author>보라봉_</author>
      <guid isPermaLink="true">https://borabong.tistory.com/47</guid>
      <comments>https://borabong.tistory.com/47#entry47comment</comments>
      <pubDate>Sat, 1 Apr 2023 20:41:45 +0900</pubDate>
    </item>
    <item>
      <title>[Swift] [3차] 압축 문제 풀이 [Programmers - Level2 (2018 KAKAO BLIND RECRUITMENT)]</title>
      <link>https://borabong.tistory.com/46</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/17684&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/17684&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1680176126468&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/17684&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/CgszO/hyR5k0qCfH/o6M3VgSxYrtjj9uSS842A1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/AJR1M/hyR6QQPMTz/LiNrwtE3GZObX5riH8o8Q0/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/17684&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/17684&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/CgszO/hyR5k0qCfH/o6M3VgSxYrtjj9uSS842A1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/AJR1M/hyR6QQPMTz/LiNrwtE3GZObX5riH8o8Q0/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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;Idea&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;먼저 msg 문자열을 Array형태로 변환한 뒤 &lt;b&gt;배열을 뒤집는다&lt;/b&gt;.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;가장 첫번째 문자를 popLast()하기 위해&lt;/b&gt; (배열을 뒤집지 않고 removeFirst()를 수행하게 되면 효율성이 아주 떨어지기 때문이다)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1680176256767&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1. 현재 입력과 일치하는 가장 긴 문자열을 찾기 위해 msg의 마지막 원소가 있을 때까지 popLast()를 수행한다.
   -&amp;gt; popLast()한 값을 word 변수에 더해준다.
	✅ 이 때 word + c(msg의 last값)가 사전에 있다면 또 다음 긴 문자를 찾기 위해 반복한다.
	✅ 이 때 word + c(msg의 last값)가 사전에 없다면 해당 값을 사전에 등록하고 반복문을 멈춘다.
	   -&amp;gt; 사전에 등록할 때 사전의 마지막 값을 + 1 하여 업데이트 해준다.

2. 현재 입력과 일치하는 가장 긴 문자열은 word 변수와 일치하므로 ans 배열에 사전의 word 값을 append해준다.
3. msg 배열이 빌 때까지 1,2 과정을 반복한다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;풀이&lt;/h2&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;func solution(msg: String) -&amp;gt; [Int] {
    var msg = Array(msg).reversed().map({ String($0) })
    var dict: [String: Int] = [&quot;A&quot;: 1, &quot;B&quot;: 2, &quot;C&quot;: 3, &quot;D&quot;: 4, &quot;E&quot;: 5, &quot;F&quot;: 6, &quot;G&quot;: 7, &quot;H&quot;: 8, &quot;I&quot;: 9, &quot;J&quot;: 10, &quot;K&quot;: 11, &quot;L&quot;: 12, &quot;M&quot;: 13, &quot;N&quot;: 14, &quot;O&quot;: 15, &quot;P&quot;: 16, &quot;Q&quot;: 17, &quot;R&quot;: 18, &quot;S&quot;: 19, &quot;T&quot;: 20, &quot;U&quot;: 21, &quot;V&quot;: 22, &quot;W&quot;: 23, &quot;X&quot;: 24, &quot;Y&quot;: 25, &quot;Z&quot;: 26]
    var dictLastVal = 26
    var ans: [Int] = []
    
    while !msg.isEmpty {
        var word = &quot;&quot;
        while let w = msg.popLast() {
            word += w
            if let c = msg.last {
                if dict[word + c] == nil {
                    dictLastVal += 1
                    dict[word + c] = dictLastVal
                    break
                }
            }
        }
        ans.append(dict[word]!)
    }
    
    return ans
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Programmers/level2/%5B3%EC%B0%A8%5D%20%EC%95%95%EC%B6%95.swift&quot;&gt;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Programmers/level2/%5B3%EC%B0%A8%5D%20%EC%95%95%EC%B6%95.swift&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1680521806180&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - hwangJi-dev/swiftAlgorithm: Algorithm Practice with Swift&quot; data-og-description=&quot;Algorithm Practice with Swift. Contribute to hwangJi-dev/swiftAlgorithm development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Programmers/level2/%5B3%EC%B0%A8%5D%20%EC%95%95%EC%B6%95.swift&quot; data-og-url=&quot;https://github.com/hwangJi-dev/swiftAlgorithm&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eKM01/hyR9G8DlGl/0weL9YYklrwkmo2G3fv3n1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Programmers/level2/%5B3%EC%B0%A8%5D%20%EC%95%95%EC%B6%95.swift&quot; data-source-url=&quot;https://github.com/hwangJi-dev/swiftAlgorithm/blob/main/Programmers/Programmers/level2/%5B3%EC%B0%A8%5D%20%EC%95%95%EC%B6%95.swift&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eKM01/hyR9G8DlGl/0weL9YYklrwkmo2G3fv3n1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - hwangJi-dev/swiftAlgorithm: Algorithm Practice with Swift&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;Algorithm Practice with Swift. Contribute to hwangJi-dev/swiftAlgorithm development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;더 나은 방법?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제를 풀면서 사전에 이미 정의되어있는 1개의 단어들을 일일이 초기화해줬는데, &lt;br /&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;Unicode.Scalar를 통해 숫자를 이용해서 알파벳을 차례대로 표현할 수 있다&lt;/b&gt;&lt;/span&gt;는 걸 알게되었다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대문자 알파벳 A를 Unicode.Scalar(65)로 표현할 수 있다.&lt;/li&gt;
&lt;li&gt;이후 차례대로 26개의 알파벳을 표현한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;swift&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;var dict: [String: Int] = [:]

for i in 1...26 {
    if let scalar = Unicode.Scalar(64 + i) {
        dict[scalar.description] = i
    }
}

// dict
// [&quot;A&quot;: 1, &quot;B&quot;: 2, &quot;C&quot;: 3, &quot;D&quot;: 4, &quot;E&quot;: 5, &quot;F&quot;: 6, &quot;G&quot;: 7, &quot;H&quot;: 8, &quot;I&quot;: 9, &quot;J&quot;: 10, &quot;K&quot;: 11, &quot;L&quot;: 12, &quot;M&quot;: 13, &quot;N&quot;: 14, &quot;O&quot;: 15, &quot;P&quot;: 16, &quot;Q&quot;: 17, &quot;R&quot;: 18, &quot;S&quot;: 19, &quot;T&quot;: 20, &quot;U&quot;: 21, &quot;V&quot;: 22, &quot;W&quot;: 23, &quot;X&quot;: 24, &quot;Y&quot;: 25, &quot;Z&quot;: 26]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;알게된 것&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅&amp;nbsp;Unicode.Scalar&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;크기가 가변적인 String 문자열을 하나하나 개별적으로 접근하기 위한 방법.&lt;/li&gt;
&lt;li&gt;Unicode기반 21-bit 코드&lt;/li&gt;
&lt;li&gt;UTF-32랑 거의 동일하다.&lt;/li&gt;
&lt;li&gt;하나 이상의 Unicode Scalar가 모여 Character를 이룬다.&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;Unicode.Scalar(65) // &amp;ldquo;A&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;참고&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@haze5959/Swift-Unicode-Scalar-그리고-문자열-count-시간-복잡도-관계&quot;&gt;https://velog.io/@haze5959/Swift-Unicode-Scalar-그리고-문자열-count-시간-복잡도-관계&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>iOS/Algorithm</category>
      <category>2018 KAKAO BLIND RECRUITMENT swift 풀이</category>
      <category>2018 KAKAO BLIND RECRUITMENT 압축 풀이</category>
      <category>2018 KAKAO BLIND RECRUITMENT 풀이</category>
      <category>swift [3차] 압축</category>
      <category>swift [3차] 압축 풀이</category>
      <category>[3차] 압축 풀이</category>
      <author>보라봉_</author>
      <guid isPermaLink="true">https://borabong.tistory.com/46</guid>
      <comments>https://borabong.tistory.com/46#entry46comment</comments>
      <pubDate>Thu, 30 Mar 2023 20:40:45 +0900</pubDate>
    </item>
  </channel>
</rss>