<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Sett.log</title>
        <link>https://velog.io/</link>
        <description>안녕하세요</description>
        <lastBuildDate>Fri, 03 Sep 2021 05:46:44 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Sett.log</title>
            <url>https://images.velog.io/images/sett_park/profile/563f4a48-006b-48d5-bb6f-102232bcbd28/Mue.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. Sett.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/sett_park" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[네트워크]]></title>
            <link>https://velog.io/@sett_park/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC</link>
            <guid>https://velog.io/@sett_park/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC</guid>
            <pubDate>Fri, 03 Sep 2021 05:46:44 GMT</pubDate>
            <description><![CDATA[<h3 id="문제">문제</h3>
<p><a href="https://programmers.co.kr/learn/courses/30/lessons/43162">https://programmers.co.kr/learn/courses/30/lessons/43162</a></p>
<h3 id="문제-접근">문제 접근</h3>
<ol>
<li>내가 못 풀었다.</li>
<li>연결 되어 있지 않으면 answer 카운트</li>
<li>재귀를 통해 2차원 배열의 한 요소(배열)에 들어가, 모든 경우를 다 탐색한 다음,</li>
<li>방문 정보를 visit에 기록한다.</li>
<li>연결 점이 없을 경우, main의 for문에 들어오게 되며, 그때마다 answer를 하나씩 + 한다. (네트워크가 분리 되어있어서 개별의 개수를 가진다, 라는 표기)</li>
</ol>
<h3 id="소스-코드">소스 코드</h3>
<pre><code class="language-Swift">func solution(_ n:Int, _ computers:[[Int]]) -&gt; Int {
    var answer = 0
    var copycomputers = computers
    var visited = Array&lt;Bool&gt;(repeating: false, count: n)

    for i in 0..&lt;n {
        if !visited[i] {
            answer += 1
            dfs(point: i, visited: &amp;visited, computers: &amp;copycomputers, n: n)
        }
    }

    return answer
}
func dfs(point: Int, visited: inout [Bool], computers: inout [[Int]], n: Int) {
    visited[point] = true
    for i in 0..&lt;n {
        if !visited[i] &amp;&amp; computers[point][i] == 1 {
            dfs(point: i, visited: &amp;visited, computers: &amp;computers, n: n)
        }
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Binary Search]]></title>
            <link>https://velog.io/@sett_park/Binary-Search</link>
            <guid>https://velog.io/@sett_park/Binary-Search</guid>
            <pubDate>Thu, 02 Sep 2021 07:52:06 GMT</pubDate>
            <description><![CDATA[<h3 id="문제">문제</h3>
<p><a href="https://leetcode.com/problems/binary-search/">https://leetcode.com/problems/binary-search/</a></p>
<h3 id="문제-접근">문제 접근</h3>
<ol>
<li>일단 순차적으로 다 탐색 걸리면 브레이크! 반환! -&gt; 성능이 안 조음.</li>
<li>Binary Search의 개념 검색, 반으로 쪼개고 또 반으로 쪼개고 또 반으로 쪼개고,</li>
<li>반복문을 사용하는 방법 -&gt; 성능이 그게 그건데?</li>
<li>재귀를 사용하는 방법 -&gt; 성능이 더 안 조은데..?</li>
</ol>
<h3 id="소스-코드">소스 코드</h3>
<ol>
<li><p>단순 탐색</p>
<pre><code class="language-Swift">func search(_ nums: [Int], _ target: Int) -&gt; Int {
 var result = -1
 for i in 0..&lt;nums.count {
     if nums[i] == target {
         result = i
     }
 }
 return result
}</code></pre>
</li>
<li><p>반복문을 사용하는 이진 탐색</p>
<pre><code class="language-Swift">func search(_ nums: [Int], _ target: Int) -&gt; Int {
 var numscopy = nums
 numscopy.sort(by: &lt;)

 var low = 0
 var high = numscopy.count - 1
 var mid = 0

 while (low &lt;= high) {
     mid = (low + high) / 2
     if numscopy[mid] == target {
         return mid
     }
     else if numscopy[mid] &gt; target {
         high = mid - 1
     }
     else {
         low = mid + 1
     }
 }
 return -1</code></pre>
</li>
<li><p>재귀함수를 통한 이진 탐색</p>
<pre><code class="language-Swift">func search(_ nums: [Int], _ target: Int) -&gt; Int {
 let numscopy = nums.sorted(by: &lt;)

 return binarySerach(nums: numscopy, target: target, low: 0, high: numscopy.count - 1)
}
</code></pre>
</li>
</ol>
<p>func binarySerach(nums: [Int], target: Int, low: Int, high: Int) -&gt; Int {
    if low &gt; high {
        return -1
    }</p>
<pre><code>let mid = (low + high) / 2

if nums[mid] == target {
    return mid
}
else if (nums[mid] &gt; target) {
    return binarySerach(nums: nums, target: target, low: low, high: mid - 1)
}
else {
    return binarySerach(nums: nums, target: target, low: mid + 1 , high: high)
}</code></pre><p>}
```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Rotate Array]]></title>
            <link>https://velog.io/@sett_park/Rotate-Array</link>
            <guid>https://velog.io/@sett_park/Rotate-Array</guid>
            <pubDate>Tue, 31 Aug 2021 23:21:40 GMT</pubDate>
            <description><![CDATA[<h3 id="문제">문제</h3>
<p><a href="https://leetcode.com/problems/rotate-array/">https://leetcode.com/problems/rotate-array/</a></p>
<h3 id="문제-접근">문제 접근</h3>
<ol>
<li>k번 만큼 뒤에서 빼서 제일 앞에 삽입</li>
</ol>
<h3 id="소스코드">소스코드</h3>
<pre><code class="language-Swift">for _ in 0..&lt;k {
    let temp = nums.removeLast()
    nums.insert(temp, at: 0)
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Find the Winner of the Circular Game]]></title>
            <link>https://velog.io/@sett_park/Find-the-Winner-of-the-Circular-Game</link>
            <guid>https://velog.io/@sett_park/Find-the-Winner-of-the-Circular-Game</guid>
            <pubDate>Tue, 31 Aug 2021 06:12:51 GMT</pubDate>
            <description><![CDATA[<h3 id="문제">문제</h3>
<p><a href="https://leetcode.com/problems/find-the-winner-of-the-circular-game/">https://leetcode.com/problems/find-the-winner-of-the-circular-game/</a></p>
<h3 id="문제-접근">문제 접근</h3>
<ol>
<li>배열로 만들어서</li>
<li>배열의 인덱스 k만큼 +1 하다가</li>
<li>도중에 배열의 count를 넘으면, 0으로 초기화 </li>
<li>[1,2,3,6] 여기서 6을 지운 경우, 0으로 초기화</li>
</ol>
<h3 id="소스-코드">소스 코드</h3>
<pre><code class="language-Swift">func findTheWinner(_ n: Int, _ k: Int) -&gt; Int {
    var arr: [Int] = []
    var index: Int = 0
    for i in 0..&lt;n {
        arr.append(i+1)
    }
    while (arr.count != 1) {
        for _ in 0..&lt;k - 1 {
            if index &gt;= arr.count - 1 {
                index = 0
                continue
            }
            index += 1
        }
        arr.remove(at: index)
        if index &gt; arr.count - 1 {
            index = 0
        }
    }
    return arr[0]
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Rabbits in Forest]]></title>
            <link>https://velog.io/@sett_park/Rabbits-in-Forest</link>
            <guid>https://velog.io/@sett_park/Rabbits-in-Forest</guid>
            <pubDate>Wed, 25 Aug 2021 04:27:15 GMT</pubDate>
            <description><![CDATA[<h3 id="문제">문제</h3>
<p><a href="https://leetcode.com/problems/rabbits-in-forest/">https://leetcode.com/problems/rabbits-in-forest/</a></p>
<h3 id="문제-접근">문제 접근</h3>
<ol>
<li>처음엔 자기는 제외하고 몇 마리 있는지 알려주기 때문에</li>
<li>대답 유형 key, 대답 횟수 value 이런식으로 만들어서 dictionary에 저장한 다음,</li>
<li>key - (value - 1) 이렇게 일반식 만들어서 풀었는 데,</li>
<li>예외 처리해야할게 너무 많더라.</li>
<li>예외는 0이 등장하는 경우, key - (value - 1)이 음수가 되는 경우 (1이라고 대답하는 토끼가 2마리 이상인 경우)</li>
<li>예외처리 일반식을 못 짜서 풀이 참고함.</li>
</ol>
<h3 id="소스-코드">소스 코드</h3>
<ol>
<li><p>처음에 작성한 코드</p>
<pre><code class="language-Swift">class Solution {
 func numRabbits(_ answers: [Int]) -&gt; Int {
     var result = 0
     var collected: [Int:Int] = [:]
     for ans in answers {
         collected[ans, default: 0] += 1
     }
     collected.forEach { k, val in
         if k &lt; 1 {

         }
         else {
             result += k - (val - 1)
         }
     }
     result += answers.count
     return result
 }
}</code></pre>
</li>
<li><p>참고한 코드</p>
<pre><code class="language-Swift">class Solution {
 func numRabbits(_ answers: [Int]) -&gt; Int {
     var ans = 0
     var collected: [Int:Int] = [:]

     for count in answers {
         if collected[count] == nil {
             collected[count] = 0
             ans += count + 1
         }
         else {
             collected[count]! += 1
         }

         if collected[count] == count {
             collected.removeValue(forKey: count)
         }
     }

     return ans
 }
}</code></pre>
</li>
</ol>
<p>처음에 작성한 코드는 대답하면 대답하는 대로 다 딕셔너리의 벨류를 추가하고 예외의 가능성을 두지 않았는 데, 대답하면 결과에만 반영하고 값은 0으로 초기화 한다.</p>
<pre><code>if collected[count] == nil {
    collected[count] = 0
    ans += count + 1
}</code></pre><pre><code>else {
    collected[count]! += 1
}</code></pre><p>이후 등장하면 count up해서 논리의 오류 (1,1,1로 대답했는데 셋다 같은 색상일 순 없으니까)가 발생하면 아래의 구문으로 대답을 초기화 해서 새로운 색상에 접근하는 듯 했다.</p>
<pre><code>if collected[count] == count {
    collected.removeValue(forKey: count)
}</code></pre><p>접근이 어려운 게 아니라 바로 위의 코드를 생각하는 것이 너무 어려웠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Height Checker]]></title>
            <link>https://velog.io/@sett_park/Height-Checker</link>
            <guid>https://velog.io/@sett_park/Height-Checker</guid>
            <pubDate>Mon, 23 Aug 2021 02:29:48 GMT</pubDate>
            <description><![CDATA[<h3 id="문제">문제</h3>
<p><a href="https://leetcode.com/problems/height-checker/">https://leetcode.com/problems/height-checker/</a></p>
<h3 id="문제-접근">문제 접근</h3>
<ol>
<li>오름차순으로 정렬하고</li>
<li>정렬하지 않은 원본하고 비교해서 다를 때마다 count up!</li>
<li>반환!</li>
</ol>
<h3 id="소스-코드">소스 코드</h3>
<pre><code class="language-Swift">func heightChecker(_ heights: [Int]) -&gt; Int {
    let target = heights.sorted(by: &lt;)
    var cnt: Int = 0
    for i in 0..&lt;heights.count {
        if heights[i] != target[i] {
            cnt += 1
        }
    }
    return cnt
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[N과 M]]></title>
            <link>https://velog.io/@sett_park/N%EA%B3%BC-M</link>
            <guid>https://velog.io/@sett_park/N%EA%B3%BC-M</guid>
            <pubDate>Sun, 22 Aug 2021 12:12:00 GMT</pubDate>
            <description><![CDATA[<h3 id="문제">문제</h3>
<p><a href="https://www.acmicpc.net/problem/15649">https://www.acmicpc.net/problem/15649</a></p>
<h3 id="문제-접근">문제 접근</h3>
<ol>
<li><a href="https://velog.io/@sett_park/%EB%AA%A8%EB%93%A0-%EC%88%9C%EC%97%B4">https://velog.io/@sett_park/%EB%AA%A8%EB%93%A0-%EC%88%9C%EC%97%B4</a> -&gt; 여기서 백트래킹을 위해 풀었던 사전 지식을 이용했다.</li>
<li>처음에 repeating 값을 줄 때 n으로 주고 싶었는데, n으로 주니까 index 오버가 났다.</li>
<li>그래서 그냥 최댓값 주고 풀었다.</li>
</ol>
<h3 id="소스코드">소스코드</h3>
<pre><code class="language-Swift">import Foundation

let input = readLine()!
let myinput: [Int] = input.components(separatedBy: &quot; &quot;).map(){Int($0)!}
let n = myinput[0]
let m = myinput[1]
var visited: [Bool] = [Bool](repeating: false, count: 8)
var result: [String] = [String](repeating: &quot; &quot;, count: 8)

func solution(_ depth: Int) {
    if depth == m {
        var temp: [String] = []
        for i in 0..&lt;depth {
            temp.append(result[i])
        }
        print(temp.joined(separator: &quot; &quot;))
        return
    }

    for i in 0..&lt;n {
        if visited[i] {
            continue
        }
        visited[i] = true
        result[depth] = &quot;\(i+1)&quot;
        solution(depth + 1)
        visited[i] = false
    }
}

solution(0)</code></pre>
<p>최대를 8로 주고 푸니까 출력이 내 눈에는 1 2 3 4 이렇게 보이는데
컴퓨터는 1 2 3 4 (빈값) (빈값) (빈값) (빈값) 이렇게 보이나부다
자꾸 출력 형식 잘못되었다고 ㅋㅋ..
그래서 출력용 배열 그때, 그때 만들어주고 결과 출력함. 잘 됨.</p>
<p>백트래킹 한번 더 공부해야할듯..?</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[모든 순열]]></title>
            <link>https://velog.io/@sett_park/%EB%AA%A8%EB%93%A0-%EC%88%9C%EC%97%B4</link>
            <guid>https://velog.io/@sett_park/%EB%AA%A8%EB%93%A0-%EC%88%9C%EC%97%B4</guid>
            <pubDate>Sun, 22 Aug 2021 11:39:24 GMT</pubDate>
            <description><![CDATA[<h3 id="문제">문제</h3>
<p><a href="https://www.acmicpc.net/problem/10974">https://www.acmicpc.net/problem/10974</a></p>
<h3 id="문제-접근">문제 접근</h3>
<ol>
<li>백트래킹의 기본 이해를 예제 코드를 본 문제인데</li>
<li>재귀로 계속 접근하다가 조건을 걸어주는 듯..? (유망성 판단)</li>
<li>여기선 <code>Array&lt;Visited&gt;</code>와 <code>Array&lt;result&gt;</code>를 맵핑시켜서 문제를 해결 했다.</li>
<li>visited가 여부로 유망성을 판단하는 건가..?</li>
</ol>
<h3 id="소스-코드">소스 코드</h3>
<pre><code class="language-Swift">let input = Int(readLine()!)!
var result: [String] = [String](repeating: &quot; &quot;, count: input)
var visited: [Bool] = [Bool](repeating: false, count: input)

func solution(_ depth: Int) {
    if depth == input {
        print(result.joined(separator: &quot; &quot;))
        return
    }

    for i in 0..&lt;input {
        if visited[i] {
            continue
        }
        visited[i] = true
        result[depth] = &quot;\(i+1)&quot;
        solution(depth + 1)
        visited[i] = false
    }
}

solution(0)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Container With Most Water]]></title>
            <link>https://velog.io/@sett_park/Container-With-Most-Water</link>
            <guid>https://velog.io/@sett_park/Container-With-Most-Water</guid>
            <pubDate>Mon, 16 Aug 2021 04:50:18 GMT</pubDate>
            <description><![CDATA[<h3 id="문제">문제</h3>
<p><a href="https://leetcode.com/problems/container-with-most-water/">https://leetcode.com/problems/container-with-most-water/</a></p>
<h3 id="문제-접근">문제 접근</h3>
<ol>
<li>물을 많이 채우라고 하시네요.</li>
<li>가장 큰 수를 찾아서 그걸 기준으로 해볼까..? 하다가 작아도 가로가 길면? 이라는 예외가 생각나서 패스</li>
<li>그럼 그냥 하나하나 다 따져봐야겠네..?</li>
<li>이중 포문으로 해볼까..?? 시간초과남 ㅋ</li>
</ol>
<pre><code class="language-Swift">func maxArea(_ height: [Int]) -&gt; Int {
    var result = 0
    for i in 0..&lt;height.count {
        for j in (i+1)..&lt;height.count {
            let subject = min(height[i], height[j])
            let tempResult = subject * abs(i-j)
            if result &lt; tempResult {
                result = tempResult
            }
        }
    }
    return result
}</code></pre>
<ol start="5">
<li><p>같은 방법인데 2중 포문만 날려서 해보기로 함. (index 때문에 2중 포문 썼는 데 index 외부에서 주고 while문으로 처리하기)</p>
</li>
<li><p>근데 어차피 같은 방법인데 아래 같이 쓰다가 막힘.</p>
<pre><code class="language-Swift">var result = 0
     var index1 = 0
     let index2 = height.count - 1
     while index1 &lt; index2 {
         let subject = min(height[index1], height[index2])
         let width = abs(index1 - index2)
         let water = subject * width
         result = max(result, water)
         index1 += 1
     }
     return result</code></pre>
</li>
<li><p>다른 사람 거 참고 했는데 아래와 같이 조건을 넣어줌</p>
<pre><code class="language-Swift">if height[index1] &lt; height[index2] {
 index1 += 1
}
else {
 index2 -= 1
}</code></pre>
</li>
<li><p>최대한 큰 숫자 끼리만 해보려고 이러한 식을 넣은게 아닐까 추측해 봄
정확히는 모르겠네..요..?</p>
</li>
</ol>
<h3 id="소스-코드">소스 코드</h3>
<pre><code class="language-Swift">        var result = 0
        var index1 = 0
        var index2 = height.count - 1
        while index1 &lt; index2 {
            let subject = min(height[index1], height[index2])
            let width = abs(index1 - index2)
            let water = subject * width
            result = max(result, water)
            if height[index1] &lt; height[index2] {
                index1 += 1
            }
            else {
                index2 -= 1
            }
        }
        return result</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Validate Stack Sequences]]></title>
            <link>https://velog.io/@sett_park/Validate-Stack-Sequences</link>
            <guid>https://velog.io/@sett_park/Validate-Stack-Sequences</guid>
            <pubDate>Sun, 15 Aug 2021 07:04:58 GMT</pubDate>
            <description><![CDATA[<h3 id="문제">문제</h3>
<p><a href="https://leetcode.com/problems/validate-stack-sequences/">https://leetcode.com/problems/validate-stack-sequences/</a></p>
<h3 id="문제-접근">문제 접근</h3>
<ol>
<li>pushed를 뽑다가 poped의 첫번째 숫자하고 pushed의 방금 뽑은 숫자하고 같아야만 뽑을 수 있나..? 어쨌든 앞에서 부터 뽑아서 Queue를 적용하는 건 맞는데, 구체적인 이해가 안됐음.</li>
<li>pushed 뽑은걸 어디다 저장해놓고 저장해놓은 마지막 숫자가 poped의 첫번째 숫자와 동일하면 poped을 하기로 함.</li>
<li>이런식으로 해서 둘다 비워지면 되는 거 아닌가..?</li>
</ol>
<h3 id="소스-코드">소스 코드</h3>
<pre><code class="language-Swift">    func validateStackSequences(_ pushed: [Int], _ popped: [Int]) -&gt; Bool {
        var result: [Int] = []
        var mypoped = popped
        for item in pushed {
            result.append(item)

            while !result.isEmpty &amp;&amp; result.last == mypoped.first {
                result.removeLast()
                mypoped.removeFirst()
            }
        }
        return result.count == 0 ? true : false
    }
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Top K Frequent Elements]]></title>
            <link>https://velog.io/@sett_park/Top-K-Frequent-Elements</link>
            <guid>https://velog.io/@sett_park/Top-K-Frequent-Elements</guid>
            <pubDate>Sun, 15 Aug 2021 05:46:36 GMT</pubDate>
            <description><![CDATA[<h3 id="문제">문제</h3>
<p><a href="https://leetcode.com/problems/top-k-frequent-elements/">https://leetcode.com/problems/top-k-frequent-elements/</a></p>
<h3 id="문제-접근">문제 접근</h3>
<ol>
<li>문제가 너무 읽기 힘들어서.. output만 보고</li>
<li>같은 수면 넣지말고 크면 넣고를 반복해서,</li>
<li>k길이의 배열을 만든 다음 반환 해라. 인줄,</li>
<li>그게 아니라 가장 많이 등장한 놈들을 뽑으라는 k만큼 뽑으란 거 였음 (읽을걸..)</li>
<li>어느 정도 등장했는 지 표시하면 좋겠다. 하다가,</li>
<li>해쉬로 하면 쉽겠네 해서 풀음.</li>
<li>key를 배열에 있는 값으로 value를 등장한 수 만큼!</li>
<li>중간에 dictionary 문법을 몇개 몰라서 좀 해맨거 말고는 어렵지 않았다.</li>
</ol>
<h3 id="소스-코드">소스 코드</h3>
<pre><code class="language-Swift">var myValue: [Int:Int] = [:]
var result: [Int] = []
for num in nums {
    myValue[num, default: 0] += 1
}
let a = myValue.sorted { key1, key2 in
    key1.value &gt; key2.value
}
for i in 0..&lt;k {
    result.append(a[i].key)
}
return result</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Minimize Maximum Pair Sum in Array]]></title>
            <link>https://velog.io/@sett_park/Minimize-Maximum-Pair-Sum-in-Array</link>
            <guid>https://velog.io/@sett_park/Minimize-Maximum-Pair-Sum-in-Array</guid>
            <pubDate>Sun, 15 Aug 2021 04:47:55 GMT</pubDate>
            <description><![CDATA[<h3 id="문제">문제</h3>
<p><a href="https://leetcode.com/problems/minimize-maximum-pair-sum-in-array/">https://leetcode.com/problems/minimize-maximum-pair-sum-in-array/</a></p>
<h3 id="문제-접근">문제 접근</h3>
<ol>
<li>문제 이해 못함.</li>
<li>ㅋ 응애</li>
<li>문제의 output 과정을 보고 대충 가우스덧셈으로 구해야 하는 구나 했음.</li>
<li>근데 왜 그리디에요.. pair up을 할때 가장 격차가 적은 수 끼리 묶어 줘서 그런가..?</li>
</ol>
<h3 id="소스코드">소스코드</h3>
<pre><code class="language-Swift">func minPairSum(_ nums: [Int]) -&gt; Int {
    var result = 0
    var mynums = nums
    var resultNums: [Int] = []
    mynums.sort(by: &lt;)
    for i in 0..&lt;mynums.count / 2 {
        resultNums.append(mynums[i] + mynums[mynums.count - i - 1])
    }
    print(resultNums)
    for i in 0..&lt;resultNums.count {
        result = max(result, resultNums[i])
    }
    return result
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Find K Pairs with Smallest Sums]]></title>
            <link>https://velog.io/@sett_park/Find-K-Pairs-with-Smallest-Sums</link>
            <guid>https://velog.io/@sett_park/Find-K-Pairs-with-Smallest-Sums</guid>
            <pubDate>Sun, 08 Aug 2021 08:19:04 GMT</pubDate>
            <description><![CDATA[<h3 id="문제">문제</h3>
<p><a href="https://leetcode.com/problems/find-k-pairs-with-smallest-sums/submissions/">https://leetcode.com/problems/find-k-pairs-with-smallest-sums/submissions/</a></p>
<h3 id="문제-접근">문제 접근</h3>
<ol>
<li>일단 [u,v] 형태로 만들고 내부 u+v해서 대소 비교한 다음,</li>
<li>정렬함 작은 순서대로,</li>
<li>k 만큼 넣음</li>
<li>시간 초과 남 ㅋ</li>
<li><a href="https://leetcode.com/submissions/detail/535145859/testcase/">https://leetcode.com/submissions/detail/535145859/testcase/</a>
테스트 케이스 너무 살벌한 데.. 시간초과 해결할 방법 모르겠다.</li>
</ol>
<h3 id="소스-코드">소스 코드</h3>
<pre><code>func kSmallestPairs(_ nums1: [Int], _ nums2: [Int], _ k: Int) -&gt; [[Int]] {
    var result: [[Int]] = []
    var myarr: [[Int]] = []

    for i in 0..&lt;nums1.count {
        for j in 0..&lt;nums2.count {
            let tempArr = [nums1[i], nums2[j]]
            myarr.append(tempArr)
        }
    }
    myarr.sort { a, b in
        sum(arr: a) &lt; sum(arr: b)
    }
    for i in 0..&lt;k {
        if i &gt; myarr.count {
            break
        }
        result.append(myarr[i])
    }
    return result
}

func sum(arr : [Int]) -&gt; Int{
    var result = 0
    for i in 0..&lt;arr.count {
        result += arr[i]
    }
    return result
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Keys and Rooms]]></title>
            <link>https://velog.io/@sett_park/Keys-and-Rooms</link>
            <guid>https://velog.io/@sett_park/Keys-and-Rooms</guid>
            <pubDate>Sun, 08 Aug 2021 07:48:45 GMT</pubDate>
            <description><![CDATA[<h3 id="문제">문제</h3>
<p><a href="https://leetcode.com/problems/keys-and-rooms/">https://leetcode.com/problems/keys-and-rooms/</a></p>
<h3 id="문제-접근">문제 접근</h3>
<ol>
<li>이게 왜 dfs, bfs야..</li>
<li>그냥 배열있는거 다 들어가보면 되는 거 아닌가?</li>
<li>일단 다 들어가 봄. 들어갈 때마다 FLAG 세워서 표시할까 하다가...</li>
<li>flag 세울 때 별로 좋은 방법이 안 떠오르는 거임.. 들어간 방을 순차적으로 정렬해서 1,2,3,4가 다 있는지 따지거나 뭐 그런거 밖에 안 떠올라서,</li>
<li>보니까 방의 개수 비교하는 굉장한 방법이 있더라.</li>
</ol>
<h3 id="소스-코드">소스 코드</h3>
<pre><code>func canVisitAllRooms(_ rooms: [[Int]]) -&gt; Bool {
        var findedRooms: [Int] = []
        findRoom(rooms: rooms, roomNumber: 0, findedRooms: &amp;findedRooms)
        return findedRooms.count == rooms.count
    }

    func findRoom(rooms: [[Int]], roomNumber: Int, findedRooms: inout [Int]) {
        findedRooms.append(roomNumber)
        for i in 0..&lt;rooms[roomNumber].count {
            if !findedRooms.contains(rooms[roomNumber][i]) {
                findRoom(rooms: rooms, roomNumber: rooms[roomNumber][i], findedRooms: &amp;findedRooms)
            }
        }
    }</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[큰 수 만들기]]></title>
            <link>https://velog.io/@sett_park/%ED%81%B0-%EC%88%98-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@sett_park/%ED%81%B0-%EC%88%98-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Mon, 02 Aug 2021 18:32:40 GMT</pubDate>
            <description><![CDATA[<h3 id="문제">문제</h3>
<p><a href="https://programmers.co.kr/learn/courses/30/lessons/42883?language=swift">https://programmers.co.kr/learn/courses/30/lessons/42883?language=swift</a></p>
<h3 id="문제-접근">문제 접근</h3>
<ol>
<li>처음에 문제가 이해가 안감, 더 큰 수가 있는데?</li>
<li>정렬하지 말란 소리였음. 예를 들어서 1234, 2면 34인데 43이 왜 안되지 한참 고민함.</li>
<li>어떻게 큰 수를 뽑을까. 현재 들어온 거보다 나중에 들어온 값이 크면 현재꺼 날리고 나중꺼 갱신하고 이렇게 푸는 거 같은데 구체적인 예시를 못 들겠는 거임.</li>
<li>여러 자료 참고했는데 이거 다 싶은 게 없었음. C++이나 파이썬에 내공이 부족해서 그런 듯</li>
<li>그러다가 기가막힌 논리를 찾았는 데 그리디에 가장 적합한 거 같았음.</li>
</ol>
<h3 id="다시-접근">다시 접근</h3>
<ol>
<li>result.isEmpty면 일단 넣어</li>
<li>result.last가 내가 넣으려는 수보다 작아? 그럼 날려. 그리고 한번 버린거 표시해(k를 줄여)</li>
<li>1, 2를 반복하다가 내가 넣으려는 수가 더 작아? 그럼 넣어 또 1, 2를 반복해.</li>
<li>이렇게하면 나중일은 생각안하고 그냥 내가 마지막 놈 보다 작아? 커? 이거만 따져서 가장 그리디에 적합한 것 같았다.</li>
<li>그리고 append할때 k를 줄이지 않기 때문에 마지막에 자릿수 날리는 작업도 필요한 듯 하다. 아래의 소스 코드</li>
</ol>
<pre><code>while (mycount &gt; 0) {
        result.removeLast()
        mycount -= 1
    }</code></pre><h3 id="소스코드">소스코드</h3>
<pre><code class="language-Swift">func solution(_ number: String, _ k: Int) -&gt; String {
    let numarr = Array(number)
    var mycount = k
    var result: [Character] = []
    for i in 0..&lt;numarr.count {
        while (!result.isEmpty &amp;&amp; result.last! &lt; numarr[i] &amp;&amp; mycount &gt; 0) {
            result.removeLast()
            mycount -= 1
        }
        result.append(numarr[i])
    }

    while (mycount &gt; 0) {
        result.removeLast()
        mycount -= 1
    }

    return String(result)
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Reveal Cards In Increasing Order]]></title>
            <link>https://velog.io/@sett_park/Reveal-Cards-In-Increasing-Order</link>
            <guid>https://velog.io/@sett_park/Reveal-Cards-In-Increasing-Order</guid>
            <pubDate>Wed, 28 Jul 2021 19:33:47 GMT</pubDate>
            <description><![CDATA[<h3 id="문제">문제</h3>
<p><a href="https://leetcode.com/problems/reveal-cards-in-increasing-order/">https://leetcode.com/problems/reveal-cards-in-increasing-order/</a></p>
<h3 id="문제-접근">문제 접근</h3>
<ol>
<li>첨에는 오름차순?으로 정렬 후 반으로 쪼개서 하나씩 빼서 넣으려고 함.</li>
<li>근데 아무리 봐도 아닌 거임. Output이 <code>[2,13,3,11,5,17,7]</code> 이게 아닌 <code>[2,11,3,13,5,17,7]</code> 이거라면 모를까...</li>
<li>근데 Example 1을 보니까 다 만들고 나서 첫 번째 인덱스 값 빼고 그 다음 값 제일 뒤로 보내고, 이걸 반복함</li>
<li>그래서 제일 뒤로 보내고 인덱스값 넣고를 하면 되지 않을까!? 했는 데, 제일 처음에 17이 들어오는 거임?</li>
<li>그래서 내림차순?으로 정렬하고 Example에서 설명하는 로직 그대로 써서 해결함.</li>
</ol>
<h3 id="소스코드">소스코드</h3>
<pre><code>func deckRevealedIncreasing(_ deck: [Int]) -&gt; [Int] {
    var copydeck = deck
    copydeck.sort(by: &gt;)
    var result: [Int] = []
    for _ in 0..&lt;copydeck.count {
        if result.count == 0 {
            result.append(copydeck.removeFirst())
        }
        else {
            let last = result.removeLast()
            result.insert(last, at: 0)
            result.insert(copydeck.removeFirst(), at: 0)
        }
    }
    return result
}
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Queens That Can Attack the King]]></title>
            <link>https://velog.io/@sett_park/Queens-That-Can-Attack-the-King</link>
            <guid>https://velog.io/@sett_park/Queens-That-Can-Attack-the-King</guid>
            <pubDate>Mon, 26 Jul 2021 22:47:20 GMT</pubDate>
            <description><![CDATA[<h3 id="문제">문제</h3>
<p><a href="https://leetcode.com/problems/queens-that-can-attack-the-king/">https://leetcode.com/problems/queens-that-can-attack-the-king/</a></p>
<h3 id="문제-접근">문제 접근</h3>
<ol>
<li>처음엔 아래와 같이 지성있는 탐색을 하고 싶었으나,
<img src="https://images.velog.io/images/sett_park/post/072eef28-3724-44de-8f26-12d3ced64dab/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-07-27%2007.45.08.png" alt=""></li>
<li>그런거 모르겠고 그냥 상하좌우,대각선 8방향 탐색해서 풀었음.</li>
<li>솔직히 틀릴 줄 알았는 데, 한방에 맞았음..</li>
<li>알고리즘이라 하기도 창피하다... 그냥 2차원 배열 열심히 탐색함 ㅎㅎ..</li>
</ol>
<h3 id="소스코드">소스코드</h3>
<pre><code>class Solution {
    func queensAttacktheKing(_ queens: [[Int]], _ king: [Int]) -&gt; [[Int]] {
        var temp: [[Int]] = []
        var flag: [Int] = [0,0,0,0,0,0,0,0]
        for j in 1..&lt;9 {
            for i in 0..&lt;queens.count {
                if king[0] + j == queens[i][0] &amp;&amp; king[1] == queens[i][1] {
                    if flag[0] == 0 {
                        temp.append(queens[i])
                        flag[0] = 1
                    }
                }
                if king[0] - j == queens[i][0] &amp;&amp; king[1] == queens[i][1] {
                    if flag[1] == 0 {
                        temp.append(queens[i])
                        flag[1] = 1
                    }
                }
                if king[1] + j == queens[i][1] &amp;&amp; king[0] == queens[i][0] {
                    if flag[2] == 0 {
                        temp.append(queens[i])
                        flag[2] = 1
                    }
                }
                if king[1] - j == queens[i][1] &amp;&amp; king[0] == queens[i][0] {
                    if flag[3] == 0 {
                        temp.append(queens[i])
                        flag[3] = 1
                    }
                }
            }
        }

        for j in 1..&lt;9 {
            for i in 0..&lt;queens.count {
                if king[0] + j == queens[i][0] &amp;&amp; king[1] + j == queens[i][1] {
                    if flag[4] == 0 {
                        temp.append(queens[i])
                        flag[4] = 1
                    }
                }
                if king[0] - j == queens[i][0] &amp;&amp; king[1] + j == queens[i][1] {
                    if flag[5] == 0 {
                        temp.append(queens[i])
                        flag[5] = 1
                    }
                }
                if king[0] + j == queens[i][0] &amp;&amp; king[1] - j == queens[i][1] {
                    if flag[6] == 0 {
                        temp.append(queens[i])
                        flag[6] = 1
                    }
                }
                if king[0] - j == queens[i][0] &amp;&amp; king[1] - j == queens[i][1] {
                    if flag[7] == 0 {
                        temp.append(queens[i])
                        flag[7] = 1
                    }
                }
            }
        }
        return temp
    }
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Group Anagrams]]></title>
            <link>https://velog.io/@sett_park/Group-Anagrams</link>
            <guid>https://velog.io/@sett_park/Group-Anagrams</guid>
            <pubDate>Sun, 25 Jul 2021 20:18:25 GMT</pubDate>
            <description><![CDATA[<h3 id="문제">문제</h3>
<p><a href="https://leetcode.com/problems/group-anagrams/">https://leetcode.com/problems/group-anagrams/</a></p>
<h3 id="문제-접근">문제 접근</h3>
<ol>
<li>문제가 이해가 잘 안감</li>
<li>출력문을 보고 감을 잡았는데 <code>[&quot;eat&quot;,&quot;tea&quot;,&quot;tan&quot;,&quot;ate&quot;,&quot;nat&quot;,&quot;bat&quot;]</code> 이 배열 중에 <code>abt</code>를 가지는 문자는 <code>bat</code>밖에 없고 같은 원리로 <code>ant</code>를 가지는 문자는 <code>nat, tan</code> 이렇게 분류 하는 거 같았다.</li>
<li>그래서 배열의 한 요소 마다 정렬함수를 이용해서 정렬하고 그 것을 키 값으로 사용해서 Dictionary에 추가함. <code>tea</code>와 <code>ate</code>는 정렬에 의해서 똑같이 <code>aet</code>로 분류될 거 같았다.</li>
</ol>
<h3 id="소스코드">소스코드</h3>
<pre><code>func groupAnagrams(_ strs: [String]) -&gt; [[String]] {
        var temp = [String: [String]]()
        for i in 0..&lt;strs.count {
            let mytemp = String(strs[i].sorted())
            temp[mytemp, default: []] += [strs[i]]
        }
        return Array(temp.values)
    }</code></pre><p>오늘 첨 알았는데 if~else문을 쓰지 않고 default: []로 초기화 할 수 있더라. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Carpet]]></title>
            <link>https://velog.io/@sett_park/Carpet</link>
            <guid>https://velog.io/@sett_park/Carpet</guid>
            <pubDate>Wed, 21 Jul 2021 18:25:26 GMT</pubDate>
            <description><![CDATA[<h3 id="문제">문제</h3>
<p><a href="https://programmers.co.kr/learn/courses/30/lessons/42842">https://programmers.co.kr/learn/courses/30/lessons/42842</a></p>
<h3 id="문제-접근">문제 접근</h3>
<ol>
<li>가운데 있는 노랑을 어떻게 표현할까.. 갈색을 1 노랑을 0으로 해서</li>
<li>갈색이 8 노랑이 1인 경우 [1,1,1,1,0,1,1,1,1]</li>
<li>뭐 이런식으로 접근했는데 가운데 쯔음 있네... 이 정도 외에는 별다른 소득이 없었다. 근데 이것도 24, 24 적용하니까 좀 아닌 거 같고...</li>
<li>약수로 구해서 만약 12면 1,2,3,4,6,12 이런식으로 해서 뭘 해봐야 하나 하다가 결론을 도출할 때 약수의 가운데 부분을 뽑아서 큰 수로 정렬하면 얼추 맞더라.</li>
<li>그래서 가운데, 가운데 + 1 인덱스 값 (홀수일 경우 가운데 값 두번) 가져와서 풀어 봄.</li>
<li>테스트 케이스 3개 틀림. 다 틀릴 줄 알았는 데 놀람.</li>
<li>다시 살펴보니까 외곽의 브라운의 개수는 배치에 따라 달라지고 가로 세로 길이의 곱으로 알 수 있다고 생각해서</li>
<li>배치한 약수를 가우스의 덧셈 방식으로 두개 뽑아서 브라운 타일의 개수와 비교하였다. </li>
<li>(2 X 가로) + (2 X 세로) - 4 = 브라운 타일이 만족하면 값을 반환하였다. (여기서 -4를 해주는 이유는 대각선 모서리 끝의 타일이 겹쳐서 한번 더 계산되기 때문)</li>
</ol>
<h3 id="소스-코드">소스 코드</h3>
<pre><code>func solution(_ brown:Int, _ yellow:Int) -&gt; [Int] {
    let total = brown + yellow
    var i = 1
    var tiles: [Int] = []
    var result: [Int] = []
    while i &lt;= total {
        if total % i == 0 {
            tiles.append(i)
        }
        i += 1
    }
    for i in 0...tiles.count {
        let index = (tiles.count - 1) - i
        if (tiles[index] * 2) + (tiles[i] * 2) - 4 == brown {
            result.append(tiles[index])
            result.append(tiles[i])
            return result
        }
    }
    return result
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Sum Root to Leaf Numbers]]></title>
            <link>https://velog.io/@sett_park/Sum-Root-to-Leaf-Numbers</link>
            <guid>https://velog.io/@sett_park/Sum-Root-to-Leaf-Numbers</guid>
            <pubDate>Tue, 20 Jul 2021 16:20:03 GMT</pubDate>
            <description><![CDATA[<h3 id="문제">문제</h3>
<p><a href="https://leetcode.com/problems/sum-root-to-leaf-numbers/">https://leetcode.com/problems/sum-root-to-leaf-numbers/</a></p>
<h3 id="문제-접근">문제 접근</h3>
<ol>
<li>DFS 여서 인접 행렬로 만들고 하나의 큐와 하나의 스택으로 풀어야 겠다</li>
<li>input = [1,2,3,4,5]이 이렇게 생겨서 주어진 배열을 인접 행렬로 만드는 작업이 필요한가 의문이 들었음.</li>
<li>2가 아니고 그냥 Tree를 만들어서 주더라. 재귀로 풀기로 생각함.</li>
<li>DFS 재귀 호출하는 방식만 따지면 됐는데,</li>
<li>트리를 탐색할 때 아래의 트리에서 1,2,3 그리고 4 이렇게 탐색하면 되는데 1,2,3 한번 1,2,4 한번 이렇게 탐색하려고 하니까 문제가 잘 안풀렸다. 그냥 1,2,3 탐색한 후 4도 탐색해서 합에 반영해주면 되는 문제였는데
<img src="https://images.velog.io/images/sett_park/post/b5f9f61b-b091-436a-b703-cf6e566c66d9/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-07-21%2001.15.54.png" alt=""></li>
</ol>
<p>결론. 5와 같은 방식으로 해결</p>
<h3 id="소스-코드">소스 코드</h3>
<pre><code>func sumNumbers(_ root: TreeNode?) -&gt; Int {

    return sumDFS(node: root, curNum: 0)
}

func sumDFS(node: TreeNode?, curNum: Int) -&gt; Int {
    let curNum = 10 * curNum + node!.val

    if node?.left == nil, node?.right == nil {
        return curNum
    }

    var sum = 0

    if node?.left != nil {
        sum += sumDFS(node: node?.left, curNum: curNum)
    }

    if node?.right != nil {
        sum += sumDFS(node: node?.right, curNum: curNum)
    }

    return sum
}
</code></pre>]]></description>
        </item>
    </channel>
</rss>