분류 전체보기 50

(간단한 코드)리트코드 643. Maximum Average Subarray I

이 문제는 "슬라이딩 윈도우"라고 부르는 문제다.  슬라이딩 윈도우는 딥러닝에서 정말로 자주 나오는 용어이며, 이는 통계학에서도 유래한 것으로 알고 있다(아닐 수도) k길이 만큼으로 리스트 안에 있는 숫자들을 더하고 평균을 구한 값들 중에서 가장 큰 수를 반환하면 된다.이런 방식은 통계학에서 moving average(이동 평균)이라고 하며, 데이터의 추세를 파악하는데 사용된다. 코드는 다음과 같다class Solution: def findMaxAverage(self, nums: List[int], k: int) -> float: n = len(nums) cur_sum = 0 for i in range(k): # 이부분은 k가 고정된 숫자가 아니므로, 처음에는 ..

(간단한 코드)리트코드 367. Valid Perfect Square

해당 문제는 루트 수식을 상용하지 않고서, 해당 숫자가 정수 제곱근이 있는지 알아보는 문제이다.class Solution: def isPerfectSquare(self, num: int) -> bool: root_num = num**(0.5) #num에 1/2 승을 제곱해주면, 루트를 하게 된다 return int(root_num) == root_num #정수형으로 변형해도 수치가 같으면(제외할 소수가 존재하지 않다면), True를 뱉는다이런 식으로 풀어도 되기는 하지만, 이는 문제의 의도가 아니므로, 다음과 같이 풀겠다.class Solution: def isPerfectSquare(self, num: int) -> bool: l, r = 1, ..

(간단한 코드)리트코드 278. First Bad Version

이 문제는 주어진 숫자 n까지 숫자들이 있고, bad라는 숫자 부터 그 뒤의 모든 숫자가 좋지 않다는 뜻을 담고 있다. 우리는 bad의 수치를 모르는 상태로, bad의 숫자를 찾는 것이 목표이다. 우선 이것은 리스트가 아니므로, 인덱스를 표현하듯이 0부터 시작을 하지 않아야 한다.코드는 다음과 같다.# The isBadVersion API is already defined for you.# def isBadVersion(version: int) -> bool:class Solution: def firstBadVersion(self, n: int) -> int: l,r=1,n while l 우선 isBadVersion()을 통해서 해당 숫자가 좋은지 나쁜지를 판..

(간단한 코드)리트코드 704. Binary Search

이 문제는 리스트 안에 특정 값을 찾는 문제이고, 답은 생각보다 훨씬 쉽게 찾을 수 있지만, 문제는 binary search 방법으로 해답을 찾는 것을 요구한다. 여기서 "바이너리 서치"란 무엇일까?이런 그림을 많이들 봤을 것이다. 이를 binary tree라고 하며, 항상 "두 가지 선택지에서 하나를 택한다"라는 조건이 있는 상황을 의미한다. (참고로 binary는 0과 1로 판단을 내리는 컴퓨터공학에서 나온 용어이다) 이 구조의 특징은 다음과 같다.여기 나오는 빨간색 점이, 백화점이나 지하철 같은 곳에서 지도를 볼 때, "현 위치"를 나타낸다고 하자. 해당 그림은 1번을 택해서 왼쪽을 가는 그림을 나타낸다.그렇다면, 현 위치가 당연히 바뀔 것이고, 이에 따라 선택하지 않았던 오른쪽은 영원히 볼 수 없..

(간단한 코드)리트코드 141. Linked List Cycle

이번 문제는 연결 리스트에 "싸이클"이 존재하는지 판단하는 문제이다. 여기서 사용하는 방법은 two pointer과 유사한 방법으로 할 것인데, 한칸씩 뒤로 가는 slow와 두칸씩 뒤로가는 fast를 의미한다. 코드는 다음과 같다. # Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: def hasCycle(self, head: Optional[ListNode]) -> bool: slow = fast = head while fast and f..

(간단한 코드)리트코드 21. Merge Two Sorted Lists

두개의 연결리스트를 크기 순서대로 연결하는 문제이다.  이 문제는 다음과 같은 단계로 값을 찾아 나갈 것이다. 연결 리스트 문제를 풀다보면, 정말로 자주 나오는 변수 dummy가 있다.dummy는 가짜의, 모조품 이라고 생각을 하면 되는데(바보라는 뜻도 있다)연결 리스트는 다음 원소를 찾는 과정에서 엉뚱한 곳으로 가는 경향이 있어서, 항상 우리가 반환 하고자 하는 첫번째 부분의 주소를 저장하기 위해서 dummy를 사용한다. 우선 코드를 보면 다음과 같다. (정답이 아니라 이해를 하고 싶다면, 코드보다는 설명을 먼저 보는 것을 권장한다)# Definition for singly-linked list.# class ListNode:# def __init__(self, val=0, next=None):..

(간단한 코드)리트코드 83. Remove Duplicates from Sorted List

우선 Duplicate는 "중복"이라는 의미로, 알고리즘 문제를 풀다보면, 자주 등장하는 녀석이다. 연결 리스트가 뭔지는 많은 사람들이 알겠지만, 어떤 구조로 되어 있는지는 잘 모르는 사람들이 많다.linked list 연결 리스트는 아래와 같이 만들어진다.class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next# 1->1->2->3->3->4 순서로 되어 있는 연결 리스트는 다음과 같이 만들어진다.head = ListNode(1, ListNode(1,ListNode(2,ListNode(3,ListNode(3,ListNode(4))))))cur = headprint(head.va..

(간단한 코드)리트코드 155. Min Stack

이 문제는 stack에 필요한 기능들을 담고 있는 클래스를 만드는 문제다.각 기능을 제대로 이해하는 것보다는 파이썬에서 클래스가 어떤 구성으로 이루어지는지 알아보는 방향으로 가겠다.class MinStack: def __init__(self): self.stk = [] self.min_stk = [] def push(self, val: int) -> None: self.stk.append(val) if not self.min_stk: self.min_stk.append(val) elif self.min_stk[-1] None: self.stk.pop() self.min_s..

(간단한 코드)리트코드 739. Daily Temperatures

이 문제는 온도 정보를 담고 있는 리스트의 각 인덱스가 날씨 순서라고 하면, 더 따뜻한 날이(더 큰 숫자가) 오기까지 얼마나 걸리는지 리스트로 정리하는 문제다.  그렇다면, 우선 온도를 비교할 기준이 되는 숫자 변수, 더 큰 숫자에 관한 변수, 숫자 끼리의 인덱스 거리를 나타내는 변수 등등많은 변수를 고려해야 하는 문제는 기본적으로 for문과 while문의 합작으로 이루어진다고 생각할 수 있다.  우선 오답 코드를 보면 다음과 같다.class Solution: def dailyTemperatures(self, temperatures: List[int]) -> List[int]: lt = len(temperatures) ans = [] i = 0 wh..

(간단한 코드)리트코드 150. Evaluate Reverse Polish Notation

숫자는 그냥 리스트에 넣고, "기호"가 들어오면, "앞의 숫자"와 "앞의앞 숫자"와 계산을 하면 되는 이해하기 쉬운 문제다. 이 문제는 노가다를 하면 된다(실제로는 대부분 같은 코드를 복붙하면 된다)class Solution: def evalRPN(self, tokens: List[str]) -> int: ans = [] for t in tokens: if t == '+': cur = ans.pop() #중복 pre = ans.pop() #중복 ans.append(pre + cur) elif t == '-': cur = ans.p..