컴퓨터공학/알고리즘 문제 풀이 35

[LeetCode] 70. Climbing Stairs

접근 처음 DFS로 풀이 시도 허나 도식화 후 Memoization이 가능함을 보고 DP로 솔루션 작성이 가능함을 판단 DP 방식 중 Top Down 으로 푸는 방법이 도저히 생각이 나지 않아 Bottom-up으로 고민 후 솔루션 작성 DP의 가장 교과서적인 문제 중 하나... 알고리즘 수업 때도 보았던 문제로 기억남 문제 링크 https://leetcode.com/problems/climbing-stairs/description/ 솔루션 class Solution: def climbStairs(self, n: int) -> int: DP = [1 for _ in range(n+1)] # Bottom-up for i in range(n-2, -1, -1): DP[i] = DP[i+1] + DP[i+2] ..

[LeetCode] 2370. Longest Ideal Subsequence

접근 O(N^2) 으로 처음에 시도했다가 TLE에 걸렸음 알파벳의 갯수와 k를 활용하여 이에 적합한 솔루션을 짜는 것이 핵심 문제를 제대로 이해한다면 올바른 솔루션을 짜는 것이 가능하니.. 문제를 정확히 이해할 것... 문제 링크 https://leetcode.com/problems/longest-ideal-subsequence/description/ 시도1(TLE) O(N^2) 으로 모두 비교하는 방법으로 처음 솔루션을 작성했습니다. 하지만 이 시도는 TLE에 걸려 통과하지 못했습니다. class Solution: def longestIdealString(self, s: str, k: int) -> int: s_length = len(s) DP = [1 for _ in range(s_length)] f..

[LeetCode] 300. Longest Increasing Subsequence

접근 다이나믹 프로그래밍을 활용하여 문제를 풀어야 함 subsequence의 특징 중 앞의 원소에서 가능했던 갯수를 포함할 수 있다는 점을 캐치해야 함 문제 링크 https://leetcode.com/problems/longest-increasing-subsequence/description/ 솔루션 class Solution: def lengthOfLIS(self, nums: List[int]) -> int: nums_length = len(nums) dp = [1 for _ in range(nums_length)] for i in range(nums_length): for j in range(i): if nums[i] > nums[j]: dp[i] = max(dp[i], dp[j]+1) return ..

[LeetCode] 11. Container With Most Water

접근 O(n) 시간복잡도 탐색을 통해 문제에서 요구하는 성능을 만족하는 것이 핵심 two pointers 기법을 사용해야 한다. 문제 링크 https://leetcode.com/problems/container-with-most-water/description/ O(n^2) 시도 TLE: 해당 솔루션은 오답입니다. class Solution: def maxArea(self, height: List[int]) -> int: answer = 0 left = 0 height_length = len(height) while left < height_length-1: for i in range(left+1, height_length): WIDTH, HEIGHT = i-left, min(height[left], h..

[LeetCode] 1306. Jump Game III

접근 기존 점프 게임처럼 그리디를 쓰는 방법도 있겠지만, DFS 와 백트래킹을 통해 문제를 풀 수도 있음. DFS를 활용할 때에는 Runtime error를 조심하도록 합시다. visited 리스트를 활용해 불필요한 재귀를 줄여야 함 문제 링크 https://leetcode.com/problems/jump-game-iii/description/ 솔루션 class Solution: def canReach(self, arr: List[int], start: int) -> bool: arr_length = len(arr) visited = [False for _ in range(arr_length)] def dfs(index): # if out of bound or already visited if index..

[LeetCode] 45. Jump Game II

접근 그리디로 풀면 되는 문제 기술적인 스킬이 부족해서 안될 코드를 계속 붙잡고 있었다. 머리를 써야 한다. 왜 상황 이해를 제대로 하지 않는 듯 문제 링크 https://leetcode.com/problems/jump-game-ii/description/ 솔루션 class Solution: def jump(self, nums: List[int]) -> int: nums_length = len(nums) left = right = 0 answer = 0 while right < nums_length-1: max_index = 0 # get max index of available range for i in range(left, right+1): max_index = max(max_index, i+nums..

[LeetCode] 55. Jump Game

접근 처음에 백트래킹으로 풀었으나 TLE로 인해 승인되지 않았음 찾아본 결과 백트래킹+DP 로 풀거나 그리디 알고리즘을 사용하여 풀어야 함을 알게 되었음 그리디 알고리즘을 통해 문제를 해결 https://www.youtube.com/watch?v=Yan0cv2cLy8 참고하였음 문제 링크 https://leetcode.com/problems/jump-game/ 솔루션 class Solution: def canJump(self, nums: List[int]) -> bool: nums_length = len(nums) point = nums_length-1 for index in range(nums_length-1, -1, -1): # if available to move point from place of..

[LeetCode] 36. Valid Sudoku

접근 스도쿠에 문제 풀이 방식을 알고 있으면 가볍게 풀 수 있을 것으로 보임 문제 접근 방식은 매우 다양함. 논리를 세우고 방법이 나오지 않는다면 처음부터 다시 다른 방향으로 빠르게 바꾸는 것 또한 지혜인 듯 함 set 함수를 응용하여 코드를 간결화하는 것이 좋음 문제 링크 https://leetcode.com/problems/valid-sudoku/description/ 솔루션 class Solution: def isValidSudoku(self, board: List[List[str]]) -> bool: SUBSQ = [[[] for _ in range(3)] for _ in range(3)] # check ROWS for i in range(9): ROW = [] for j in range(9): ..

[LeetCode] 79. Word Search

접근 항상 리스트 자료형을 활용할 때에는 조심해야 한다. 대중적인 접근법을 사용해서 문제 풀이, 가능 여부와 관계없이 선행 탐색 후 올바르지 않는 경우를 조건문을 통해 거르는 로직 진행 백트래킹 함수 구현 시 boolean 형을 리턴하는 방식을 추천, 괜찮은 테크닉을 구현할 수 있다. 문제 https://leetcode.com/problems/word-search/description/ 솔루션 class Solution: def exist(self, board: List[List[str]], word: str) -> bool: ROW_length = len(board) COL_length = len(board[0]) WORD_length = len(word) def backtrack(ROW, COL, i..

[LeetCode] 200. Number of Islands

접근 오히려 easy난이도보다 쉬운 문제인 것 같다 제공되는 자료형이 숫자가 아니라 문자임을 감안하지 않아 조금 고민 일반적인 방법의 코드도 숙지하는 것이 중요해 보임 문제 https://leetcode.com/problems/number-of-islands/description/ 솔루션 class Solution: def numIslands(self, grid: List[List[str]]) -> int: answer = 0 ROW_length = len(grid) COL_length = len(grid[0]) visited = [[False for _ in range(COL_length)] for _ in range(ROW_length)] def dfs(ROW, COL): # update this p..