2024/12 27

(간단한 코드)리트코드 20. Valid Parentheses

괄호가 제대로 닫혀 있는지 확인 하는 문제이다.  처음에는 two pointer을 사용해서 확인해야 하나? 아니면 하나하나 일일히 기록해야 하나?라는 생각을 많이 했지만, 전혀 다른 방식으로 푸는 것이었다. 우선 여기서 사용되는 것은 딕셔너리와 stack이라는 개념이다.stack이 생소할 수 있지만, 리스트를 활용한다 라고 생각하면 된다. 우선 사전 준비를 해야 하는데, 다음과 같다.ans = [] # answer의 약자bracket = {')':'(', '}':'{', ']':'['} 이렇게 준비하는 이유는 ans라는 빈 리스트 안에는 괄호의 왼쪽 부분만 넣을 거기 때문이다. -> ( { [  이 녀석들만 넣을 것이다. 그리고 "괄호의 오른쪽 부분"이 나타날 경우에는, 기존에 있는 ans의 "마지막" ..

(간단한 코드)리트코드 682. Baseball Game

이 문제는 숫자와 문자 그리고 기호가 섞여 있는 리스트를 통해 각 조건을 만족시키면서 점수를 계산 하는 것을 의미한다. 이 문제를 푸는 방법은 생각보다 간단하다. 그냥 if문을 주구장창 쓰면 된다.class Solution: def calPoints(self, operations: List[str]) -> int: score = [] for lead in operations: if lead == '+': score.append(score[-2]+score[-1]) elif lead == 'C': score.pop() elif lead == 'D': ..

(간단한 코드)리트코드 125. Valid Palindrome

우선 Palindrome의 뜻은 다음과 같다. "영문을 전부 소문자로 바꾸고, 특수기호와 공백을 제거 한 후에 나온 결과물이, 앞뒤 대칭이면 palindrome이다" 여기서 주의 해야 할 점은, 저 문자열에는 "숫자"도 포함이라는 것이다.우선 공백과 특수기호들을 없애줘야 하는데, 굳이 특별한 함수를 쓸 필요없이 for문을 사용하면 간단하다.ans = ''for char in s: if char.isaplha(): #char이 문자인지 확인 ans += char.lower() #소문자로 바꿔서 ans에 더하기 elif char.isdigit(): #char이 숫자인지 확인 ans += char여기서 ans는 알고리즘에서 자주 사용되는 answer의 약어이고, char는 charac..

(간단한 코드)리트코드 169. Majority Element

리스트 안에 가장 많이 있는 숫자를 출력하면 되는 문제이다. 그리고 가장 많이 있는 숫자는 전체의 반 이상을 차지하고 있다. 처음에는 이렇게 접근을 했다. 결국은 딕셔너리로 찾으면 되지 않을까?class Solution: def majorityElement(self, nums: List[int]) -> int: h = defaultdict(int) for num in nums: h[str(num)] += 1 return int(max(h,key=h.get)) 여기 나오는 defaultdict(int)은 딕셔너리를 만들 때 if문을 덜 쓰게 도와주는 녀석이다 안에 int라고 타입을 지정해줘야 하고, 실제로는 from collect..

(간단한 코드)리트코드 56. Merge Intervals

블로그를 찾아본다는 것은 이미 이 문제의 뜻을 알고 있다고 생각한다. 우리는 이 문제에서 주의해야 할 점이, "문제에서 리스트 안의 원소가 순서대로 나열되어 있다는 말이 없다"는 것이다. 다른 말로는 순서가 뒤죽박죽일 수 있으니, 우선 "정렬"을 해주는게 최우선이다.1.sort와 lambda를 활용한 리스트 순서 정렬하기intervals.sort(key = lambda interval : interval[0]) 이게 가장 먼저 해야 하는 코드다.  해석은 다음과 같다: 우선 sort(key = )라고 하면, "무엇을 기준으로 순서를 나열 할 것"인지 정하는 부분이다. lambda interval : interval[0]에서 lambda는 함수를 짧게 만든 것이라는 것을 어디선가 들었을 것이라고 생각한다...

(간단한 코드)리트코드 1189. Maximum Number of Balloons

주어진 문자열 text에 있는 알파벳으로 balloon을 몇개 만들 수 있는지 물어보는 문제이다.  물론 처음에 생각을 할때, 리스트를 만들고, 줄여나가는 방식을 생각하는 사람들도 있을 것이다. 코드를 복잡하게 짜는 경험을 하는 것은 정말로 값지 경험이지만, 거기서 만족을 하면 안된다는 점이 있다.  우선 이것을 하기 위해서는 딕셔너리가 가장 효율적이다.  위에 있는 이 딕셔너리 모습이, 하나의 balloon을 만들 수 있는 최소 조건이다. 그렇다면, 아래와 같이 무작위로 있는 경우, 무엇을 판단을 할까? 그림에도 적었듯이, 가장 작은 수를 기준으로 선발을 하면 된다. 코드는 다음과 같다.class Solution: def maxNumberOfBalloons(self, text: str) -> in..

(간단한 코드)리트코드 242. Valid Anagram

우선 "아나그램"의 정의는 하나의 문자열의 순서를 바꾸어서 새로 만들어진 문자열을 의미한다. 따라서 t라는 문자열에 있는 요소들로 s를 만들 수 있는지 물어본다.  여기서는 두개의 문자열의 요소가 일치하는지만 확인하면 된다.  이를 가장 빨리 확인할 수 있는 방법이 딕셔너리를 활용하는 방법인데,  단순하게 딕셔너리를 개별적으로 (s에 관한 딕셔너리 만드는 for문 하나, t에 관한 딕셔너리 만드는 for문 하나) 만들어도 되지만 단순하게 여러번 만드는것은 크게 의미가 없으니까, 파이썬 내장함수인 "defaultdict"에 관해 배워 보겠다.h = {}for chr in s: if chr in h: h[chr] += 1 else: h[chr] = 0이게 우리가 알고 있는 일반적으로..

(간단한 코드)리트코드 383. Ransom Note

이 문제는 다음과 같다. magazine이라는 문자열에 있는 문자들로 ransomNote의 문자열을 만들 수 있는가이다.여기서 주의해야 할 점은 magazine의 문자열들은 각각 "한번씩"만 사용할 수 있다는 점이다. 그렇다면, 개수에 한계가 있다는 것을 들었을 때는 무조건 딕셔너리를 사용해야 한다(이를 해쉬맵 이라고도 부른다). 우선 magazine문자열 이용해 딕셔너리로 만들어주고, 만들어진 딕셔너리와 ransomNote의 문자열을 비교해서, 성립하는지 확인 하면 된다.class Solution: def canConstruct(self, ransomNote: str, magazine: str) -> bool: if len(ransomNote) > len(magazine): retur..

(간단한 코드)리트코드 217. Contains Duplicate

제목에서 Duplicate는 "중복"을 의미한다.  다시 말해서, 주어진 리스트에 중복이 있는가?라는 것을 확인하면 끝인데. 일단 "리스트 원소의 중복"이라는 단어가 나올때 먼저 떠올려야 하는것은 set()이다.  초보자일 경우에 가장 먼저 떠올리는 방법은 "하나하나 확인"일 것이다. 다음과 같이 코드를 짤 수 있다.class Solution: def containsDuplicate(self, nums: List[int]) -> bool: h = set() for num in nums: if num in h: return True else: h.add(num) ..

(간단한 코드)리트코드 771. Jewels and Stones

이 문제는 jewels는 문자열 형태로 한가지 문자들만 담고 있고, stones 안에는 다양한 문자열들이 있다.그리고 여기서 문자를 "돌"이라고 칭하고, stones는 내가 가지고 있는 돌 중에, jewels에 해당하는 돌이 몇개 있는지 알아보는 것이다.  class Solution: def numJewelsInStones(self, jewels: str, stones: str) -> int: cnt = 0 for s in stones: if s in jewels: cnt += 1 return cnt 그냥 내가 가지고 있는 돌들 중에, jewels안에 몇개 있는지 확인하는 것이 가장 간단한 방법이다.c..