<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>seokmin-kim.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Tue, 15 Feb 2022 14:15:54 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>seokmin-kim.log</title>
            <url>https://images.velog.io/images/seokmin-kim/profile/7acaaee0-d004-4d2a-98db-578a537fea18/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. seokmin-kim.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/seokmin-kim" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[3. Longest Substring Without Repeating Characters]]></title>
            <link>https://velog.io/@seokmin-kim/3.-Longest-Substring-Without-Repeating-Characters</link>
            <guid>https://velog.io/@seokmin-kim/3.-Longest-Substring-Without-Repeating-Characters</guid>
            <pubDate>Tue, 15 Feb 2022 14:15:54 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/seokmin-kim/post/2b67836b-fa88-4f5e-8a13-cf907dcccbda/3.%20Longest%20Substring%20Without%20Repeating%20Characters.JPG" alt=""></p>
<p><a href="https://leetcode.com/problems/longest-substring-without-repeating-characters/">https://leetcode.com/problems/longest-substring-without-repeating-characters/</a></p>
<p>가장 긴 문자열을 찾는 문제
처음부터 끝까지 문자열을 스캔하면서 dictionary에 각 문자가 등장한 index를 저장하면서 가장 긴 문자열의 길이를 저장해나가는 방식
이미 등장한 문자가 또 등장했을 경우, 문자열의 시작 위치를 이전 문자열의 등장 idx와 현재 들고 있던(다른 문자들에 의한) idx와 비교하여 큰 쪽으로 설정</p>
<pre><code>class Solution:
    def lengthOfLongestSubstring(self, s: str) -&gt; int:
        buf = {}
        answer = 0
        now = 0
        start = 0
        for idx, elem in enumerate(s):
            if elem in buf:
                start = max(buf[elem] + 1, start) # 다른 문자에 의한 start와 현재 문자의 start중 큰값
                now = idx - start +1
            else:
                now+=1
            answer = max(answer, now)

            buf[elem] = idx
        return answer</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[길 찾기 게임]]></title>
            <link>https://velog.io/@seokmin-kim/%EA%B8%B8-%EC%B0%BE%EA%B8%B0-%EA%B2%8C%EC%9E%84</link>
            <guid>https://velog.io/@seokmin-kim/%EA%B8%B8-%EC%B0%BE%EA%B8%B0-%EA%B2%8C%EC%9E%84</guid>
            <pubDate>Sat, 12 Feb 2022 14:36:59 GMT</pubDate>
            <description><![CDATA[<p><a href="https://programmers.co.kr/learn/courses/30/lessons/42892">https://programmers.co.kr/learn/courses/30/lessons/42892</a>
이진트리를 구성하는 노드의 x,y 좌표가 주어질 때 이진트리를 구성한 후 preorder, postorder를 리턴하는 문제</p>
<pre><code>def solution(nodeinfo):
    # call stack이 100만을 넘어가는 경우가 문제에 존재하여 runtime error 발생 해결
    import sys
    sys.setrecursionlimit(10**6)

    #예외처리    
    if len(nodeinfo) == 1:
        return [[1], [1]]

    class BTree:
        def __init__(self, x, y, idx):
            self.x = x
            self.y = y
            self.idx = idx
            self.left = None
            self.right = None

    # 주어진 x, y좌표를 트리의 노드로 생성
    nodes = []
    for idx, (x, y) in enumerate(nodeinfo):
        node = BTree(x, y, idx+1)
        nodes.append(node)
    #노드들을 정렬하는데 트리의 높이, 트리의 x좌표를 기준으로 정렬
    nodes.sort(key = lambda elem: (elem.y, -elem.x))

    # 트리를 같은 level 에 속하는 node끼리 묶어줌
    node = nodes.pop()
    tree = [[node]]
    cache = node.y
    level = 0
    while nodes:
        node = nodes.pop()
        if not node.y == cache:
            level +=1
            cache = node.y
            tree.append([node])
        else:
            tree[level].append(node)

    # tree의 node들을 서로 연결. level 회수만큼 root에서 타고 내려가는데, x좌표를 기준으로 left rigt판별
    for level in range(1, len(tree)):
        for node in tree[level]:
            root = tree[0][0]
            for i in range(level-1):
                if node.x &lt; root.x :
                    root = root.left
                else:
                    root = root.right
            if node.x &lt; root.x:
                root.left = node
            else:
                root.right = node

    # 서치
    pre_answer = []
    post_answer = []
    def preorder(node):
        pre_answer.append(node.idx)
        if node.left:
            preorder(node.left)
        if node.right:
            preorder(node.right)
    def postorder(node):
        if node.left:
            postorder(node.left)
        if node.right:
            postorder(node.right)
        post_answer.append(node.idx)

    preorder(tree[0][0])
    postorder(tree[0][0])
    return [pre_answer, post_answer]</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[45. Jump Game 2]]></title>
            <link>https://velog.io/@seokmin-kim/45.-Jump-Game-2</link>
            <guid>https://velog.io/@seokmin-kim/45.-Jump-Game-2</guid>
            <pubDate>Mon, 07 Feb 2022 08:40:03 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/seokmin-kim/post/c81bea4f-124b-4fdd-9b6b-924e13a3955e/45.%20Jump%20Game2%201.JPG" alt="">
<a href="https://leetcode.com/problems/jump-game-ii/">https://leetcode.com/problems/jump-game-ii/</a></p>
<p>DP list에 각 nums 인덱스에 도달할 수 있는 최소 회수를 저장하도록 함</p>
<pre><code>class Solution:
    def jump(self, nums: List[int]) -&gt; int:
        INF = 1e9
        length = len(nums)

        dp = [INF for i in range(length)]
        dp[0] = 0

        for i in range(length-1):
            now = nums[i]
            for dx in range(now):
                dx+=1
                if i + dx &lt; length:
                    dp[i+dx] = min(dp[i+dx], dp[i] +1)

        return dp[-1]</code></pre><p>문제는 실행시간이 끔찍하게 느리다는 점. </p>
<p>문제점 1. if로 length 를 넘는지를 계속 체크한다 -&gt; 그냥 maximum list 사이즈를 확인한 후 dp list를 선언하면 length면 되는걸 length*평균(nums) 만큼 if를 더 태워버린 꼴</p>
<p>문제점 2. 애초에 이런 방식으로는 O(length * 평균(nums))임. 다른 방법을 찾아보니 시간복잡도 O(length)만으로 되는 코드를 발견</p>
<pre><code>class Solution:
    def jump(self, nums: List[int]) -&gt; int:
        last_index = len(nums) - 1
        max_reachable=[start_pos+nums[start_pos] for start_pos in range(last_index)]
        jump_range = (0, 0)
        n_jumps = 0
        while jump_range[1] &lt; last_index:
            n_jumps += 1
            jump_range = (jump_range[1], 
                            max(max_reachable[jump_range[0]:jump_range[1]+1]))
        return n_jumps</code></pre><p>각 time step 마다 도달할 수 있는 최대거리를 dp list에 저장하는 방식 </p>
]]></description>
        </item>
    </channel>
</rss>