알고리즘 70

[리트코드/leetcode/python] 209. Minimum Size Subarray Sum

처음에 그냥 생각나는 로직대로 푼 알고리즘은 다음과 같습니다. nums를 처음부터 더하는데, target보다 같거나 커지면, check 변수를 통해 플래그를 걸어 놓고 여태 더했던 순회 횟수, 즉 길이를 저장합니다. 그리고 다음 인덱스로부터 또 같은 행동을 반복하는데, 최소 길이가 갱신 된다면 최소 길이를 갱신하고 그렇지 않다면 그냥 패스합니다. 풀었던 코드는 아래와 같습니다. 푼 코드는 아래와 같습니다. class Solution(object): def minSubArrayLen(self, target, nums): for i in range(len(nums)): tmp = 0 for j in range(i,len(nums)): tmp += nums[j] if tmp >= target : length ..

[리트코드/leetcode/python] 347. Top K Frequent Elements

이 문제를 처음 봤을 때 계수정렬을 생각해봤습니다. nums[i]의 범위가 -10^4 부터 시작되므로, 음수도 포함될 수 도 있기에, 음수일 때와 양수일 때를 나눠서 계수정렬로 로직을 짰었습니다. 하지만, 계수정렬을 한 리스트가 내림차순되면서, k 번째까지 리스트를 슬라이싱 하는데에, 원소 순서가 변하기에 한계가 있었습니다. 어떤 수가 몇 번 나왔는지를 체크해야 하므로, 계수정렬보다는 딕셔너리 등을 사용하는 것이 더 적합했습니다. follow up을 보면, O(n log n)의 시간복잡도를 구현해보라고 하는데, 딕셔너리로 풀 때, O(n)으로 풀리는 것이 아닌가 하는 의구심으로 문제를 풀기 시작했습니다. 푼 코드는 아래와 같습니다. class Solution(object): def topKFrequent..

[리트코드/leetcode/python] 102. Binary Tree Level Order Traversal

이 문제는 지난 PreOrder 문제에 이어 Level Order Traversal 문제입니다. Level Order는 말그대로 레벨 순으로 순회를 하는 것인데, 트리에서는 보통 root 노드부터 레벨 1로 시작되고 아래로 내려오면서 level이 증가합니다. 해당 문제에서는 레벨별로 노드를 묶는 것이 관건인데요, 코드를 살펴보면서 설명드리겠습니다. # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right from collections import deque ..

[리트코드/leetcode/python] 1. Two Sum

리트코드에서의 1번문제입니다. 문제를 설명해보자면, 입력값으로 nums 라는 숫자배열이 주어집니다. 그리고 target값도 입력값으로 주어지는데요, nums배열에서 두 숫자를 더해 target을 만들 수 있다면, 해당 두 숫자의 인덱스 값을 배열 형태로 출력하는 문제입니다. 문제 자체는 비교적 간단한 문제입니다만, 이 문제를 어떻게 효율적으로 풀어야 할지는 고민해봐야 할 부분입니다. 해당 문제를 직관적으로 풀자면 for문을 두 번 돌면 됩니다. 대략적인 코드는 아래와 같겠죠. for i in range(len(nums)): for j in range(i+1,len(nums)): if (nums[i] + nums[j]) == target: return [i,j] 하지만, 위와 같이 푼다면, 이미 시간복잡도..

[리트코드/leetcode/python] 733. Flood Fill

이 문제는 전형적인 bfs,dfs 문제입니다. 문제 설명을 간단히 하자면, 주어진 image 그래프에서 (sr, sc) 위치에서부터 시작해 상,하,좌,우 4방향을 탐색하면서 image[sr][sc]와 값이 같다면, 해당 자리를 color 값으로 치환하는 문제입니다. 간단히 말해서, 시작하는 위치와 값이 같으면서 연결된 자리를 color 값으로 바꾸면 됩니다. 먼저, 코드를 살펴보면서 설명을 해보겠습니다. import copy class Solution(object): def floodFill(self,image, sr, sc, color): """ :type image: List[List[int]] :type sr: int :type sc: int :type color: int :rtype: List[L..

[리트코드/leetcode/python] 589. N-ary Tree Preorder Traversal

주어진 트리배열을 보고 PreOrder 로 출력하는 문제입니다. PreOrder은 아래와 같은 로직을 가지는데요, 부모를 먼저 출력하고, 자식 중에서 왼쪽->오른쪽 순으로 출력하는 로직을 가집니다. PreOrder traversal 말고도 순회 종류에는 크게 4가지가 있습니다. 순회 종류 4가지 (노드 방문 순서에 따라) 전위 순회 (Preorder Traversal) 중위 순회 (Inorder Traversal) 후위 순회 (Postorder Traversal) 레벨 오더 순회(level-order Traversal) 전위 순위는 root -> left -> right 중위 순위는 left -> root -> right 후위 순위는 left -> right -> root 순으로 순회를 하며 root를 ..

[리트코드/leetcode/python] 409. Longest Palindrome

주어진 문자열 s를 이용해서 만들 수 있는 가장 긴 팰린드롬을 구하는 문제입니다. 문자열 s는 대문자와 소문자가 구분해서 주어지고 만들어 질 수 있는 가장 긴 팰린드롬의 길이를 답으로 출력하면 됩니다. 처음에 접근했던 방법은 Discussion에서 해당 코멘트를 봤습니다. 한 유저가 남긴 코멘트였는데, 해시맵을 사용하면 된다고 해서 바로 딕셔너리를 생각해봤습니다. 주어진 문자열에서 문자가 나온 횟수를 value로 저장하고, 해당 문자를 key값으로 저장하는 딕셔너리를 생각해본다면, 가장 긴 팰린드롬의 길이는 짝수의 횟수를 가진 key값과 홀수값 중에서 최댓값을 가진 key값의 구성으로 만들어지겠다라는 것이 추론됩니다. 예를 들어서 설명해볼까요? "aabbsserrr" 이라는 문자열이 있다고 하면, 이 문..

[리트코드/leetcode/python] 121. Best Time to Buy and Sell Stock

위 문제는 그리디 문제입니다. 리스트를 순회하면서 최적의 값을 찾아나가는 문제이죠. 맨 처음에 저는 O(n^2))의 복잡도로 문제를 풀었습니다. 그래서, 시간초과의 문제에 걸렸습니다. 제약조건을 보면 prices의 길이가 최대 100000이기 때문에, O(n^2)의 복잡도로 풀어버리면 10의 8승을 넘기 때문에 시간초과에 걸리는 것은 당연한 소리겠죠! 처음, 시간초과에 걸렸던 코드는 아래와 같습니다. class Solution: def maxProfit(self, prices: List[int]) -> int: is_reversed_sorted = all(prices[i] >= prices[i+1] for i in range(len(prices)-1)) if is_reversed_sorted: retur..

[리트코드/leetcode/python] 21. Merge Two Sorted Lists

위 문제는 정렬된 두 리스트를 병합하는 문제입니다. 단순 알고리즘 문제를 푸는 것이 아니라 자료구조를 고려해서 풀어야 하는 문제였는데요, 자료구조의 필요성이 느껴진 문제이기도 했습니다. 문제를 접근하는 방식에는 2가지 방법이 있는데요, 하나는 재귀적 알고리즘을 사용하는 방법과 두번째로는 더미노드를 만들어 그 뒤에 이어 붙이는 방법이었습니다. 시간 복잡도는 둘다 O(n+m)이 나오는데요, 두 번째 방법으로 푼 코드를 살펴봅시다. # Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution: def mergeT..

[리트코드/leetcode/python] 392. Is Subsequence

이 문제는 주어진 문자열 t 안에 s문자열이 있는지 아닌지를 판단하는 문제입니다. 예를 들어서, t가 ahbgdc 이고, s가 abc 라면, ahbgdc에서 h,g,d,를 제거하면 abc가 되므로 true를 반환합니다. 반면, 만약 t가 abcde이고, s가 aec 라면, abcde 문자열에서 어떤 수를 써서라도 aec를 만들 수 없기에 false를 반환합니다. 즉, t의 원래의 문자열에서 순서는 유지한 채 수열을 이루는 항 중에 일부만 모아 s가 만들어진다면, true를 반환하고, 그렇지 않다면 false를 반환하면 됩니다. 코드를 통해 살펴보죠. class Solution: def isSubsequence(self, s: str, t: str) -> bool: idx = 0 cnt = 0 if len..

반응형