알고리즘/파이썬 41

[파이썬 알고리즘]큐를 이용한 스택 구현

문제: - push(x) : 요소 x를 큐 마지막에삽입한다. - pop() : 스택 처음에 있는 요소를 삭제한다. - top() : 스택 처음에 있는 요소를 가져온다. - empty() : 스택이 비어 있는지 여부를 리턴한다. MyQueue queue = new MyQueue(); queue.push(1); queue.push(2); queue.push(); // 1리턴 queue.pop(); // 1리턴 queue.empty(0; // false 리턴 - 큐를 이용해서 스택을 만들어라 1) 생각한 것 - 큐랑 스택의 가장 큰 차이점을 생각해보면 push할 때 스택은 FIFO이고, 큐는 LIFO니까 이 부분을 수정하면 되겠구나. - 값을 push 할때 큐의 값을 역순으로 출력하게 하면 되겠다. 2) 알아..

[파이썬 알고리즘] 일일 온도

- 내가 생각하는 출제의도 스택을 써야하는 것 같은데 ... 스택을 처음쓰려니까 구현이 안된다. 그래서 책에 있는 풀이를 한줄 한줄 주석처리하며 이해를 해보겠다. - 풀이를 보면서 알게 된 내용 1)enumerate()는 '열거하다'는 뜻의 함수로, 여러 가지 자료형(list, set,tuple 등)을 인덱스를 포함한 enumerate 객체로 리턴한다. 사용 방법은 다음과 같다. >>>a = [1,2,3,2,45,2,5] >>>a [1,2,3,2,45,2,5] >>>enumerate(a) >>> list(enumerate(a)) [(0, 1), (1, 2), (2, 3), (3, 2), (4, 45), (5, 2), (6, 5)] enumertae를 사용해서 a =['a1', 'b2', 'c3']를 출력..

[파이썬 알고리즘] 중복 문자 제거

문제 이해 /출제 의도를 찾자 1) Example2를 보면 사전식 순서에서 제일 빠른 a 값을 가져와 그전에 있던 char들을 없앤다. 2) 사전식 순서에서 제일 빠른 char를 찾고, 그 뒤에서부터 먼저 온 c를 가져온다 그리고 그뒤에 d가 그냥 오고, c가 다시나오는데 c는 앞에 나왔으니까 무시 그다음 b 나왔으니 b 출력 알아낸 것 1) set() 함수는 중복을 없애주고, 중복없는 값 먼저 나오고 중복 있는 값이 뒤로 쫘르륵 나열. 2) index 함수는 그 값의 위치를 알려준다. 재귀를 이용한 분리 Input = "cbacdcbc" 가정 def removeDuplicateLetters(self, s: str) -> str: # 집합으로 정렬 for char in sorted(set(s)): # s..

[파이썬 알고리즘] 스택 구현 기초

이것도 가장 기초중에 기초 무조건 알아야하는 내용이다. 파이썬에선 stack =[] 이 리스트를 stack으로 써도 된다. 하지만 스택을 더 공부하기 위해 파이썬으로 스택을 구현해보았다. class Node: def __init__(self, item, next): self.item = item self.next = next class stack: def __init__(self): self.top = None def is_empty(self): return self.top is None def push(self, val): self.top = Node(val, self.top) def pop(self): if self.top is None: return None node = self.top self.t..

[파이썬 알고리즘] 홀짝 연결 리스트

생각해본것 1. 또 배열로 정렬해서 풀고 싶지만 이런 풀이는 좋지 못한 풀이라해서.. 다른 방식으로 풀어보자 2. 홀수 노드인것 뒤에 짝수 노드를 붙히면 되겠네 3. swap이란 걸 써볼까? class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def oddEvenList(self, head: ListNode) -> ListNode: # 예외 처리 if head in None: return None odd = head even = head.next even_head = head.next #반복하면서 홀짝 노드 처리 while even and even.next: odd.next, even.next = odd..

[파이썬 알고리즘]가장 긴 팰린드롬 부분 문자열

테스트 케이스 1) - 입력 : "babad" - 출력 : "bab" - 설명 : "bab" 외에 "aba" 도 정답이다. 테스트 케이스 2) - 입력 : "cbbd" - 출력 : "bb" - 앞뒤로 똑같은 단어를 찾는것 토마토, 기러기 이렇게.. - 그중에서 제일 긴 값을 찾는 것 풀이) 중앙을 중심으로 확장하는 풀이 def longestpalindrome(self, s: str) -> str: # 팰린드롬 판별 및 투 포인터 확장 def expand(left: int, right: int) -> str: while left >= 0 and right < len(s) and s[left] == s[right]: left -=1 right +=1 return s[left + 1:right] #해당사항이 ..

[파이썬 알고리즘] 역순 연결 리스트

- 입력 1->2->3->4->5->NULL - 출력 5->4->3->2->1->NULL 생각해 본것 1) 순서를 바꿔야 하므로 이걸 배열로 풀어서 바꿔보자. 2) 배열로 풀어서 다시 리스트로 넣는 방식 # Definition for singly-linked list. class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next class Solution: def reverseList(self, head) -> ListNode: q = [] if not head: return head node = head # 리스트 변환 while node is not None: q.append(node.val) node = n..

[파이썬 알고리즘] 연결리스트(Linked List) 기초.

- 배열 vs 연결리스트 배열 : 파이썬의 리스트, 접근은 쉬우나 삽입이 어렵다. 연결리스트 : 직접 구현해야 하고, 삽입이 쉽고, 접근은 어렵다. 경우 Array LinkedList 특정 원소 조회 O(1) O(N) 중간에 삽입 삭제 O(N) O(1) 데이터 추가 데이터 추가 시 모든 공간이 다 차버렸다면 새로운 메모리 공간을 할당받아야 한다. 모든 공간이 다 찼어도 맨 뒤의 노드만 동적으로 추가하면 된다. 정리 데이터에 접근하는 경우가 빈번하다면 Array를 사용하자 삽입과 삭제가 빈번하다면 LinkedList를 사용하는 것이 좋다 강의에서도 말했듯이 이 연결리스트는 자신이 직접 구현해 봐야한다. 하얀 도화지 위에서 이걸 다 적어낼수 있어야한다. class ListNode: def __init__(s..

[파이썬 알고리즘] 두 정렬 리스트의 병합

-입력 1 -> 2 > 4 , 1 -> 3 -> 4 -출력 1 -> 1 -> 2 -> 3 -> 4 -> 4 생각해본것 1) 두 연결 리스트는 정렬 돼있다. 흠 .. 그런 sorted 함수는 필요 x 2) 두 노드를 비교해서 작은 값부터 순서대로 넣어주면 되겠구나. 3) 그러면 어떻게 두 노드를 가지고 와서 비교를 할까? 4) l1.val < l2.val 로 비교를 해보자 5) 작으면 넣어주고 크면 뒤로 빼주자. 근데.. 이렇게 생각을 했는데 구현을 하기까지의 과정이 안되더라구요 그래서 책에 있는 걸 봤어요.. 코드를 봤는데 복잡하게 보이는 코드가 보기가 싫더라구요 구글링을 해봐서 https://www.google.com/search?q=21.+merge+two+sorted+lists+py&oq=&aqs=..

[파이썬 알고리즘] 그룹 애너그램

입력 : ["eat", "tea", "tan", "ate", "nat", "bat"] 출력 : [ ["ate", "eat", "tea"], ["nat", "tan"], ["bat"] ] 풀이 1) 정렬하여 딕셔너리에 추가! 1. 정렬하여 비교하는 방법이 가장 간단 ! , 애너그램 관계인 단어들을 정렬하면, 서로 같은 값을 갖게 되기 때문 2. sorted()는 문자열도 잘 정렬하고 결과를 리스트 형태로 리턴 3. 같은 애너그램을 가진 원소들끼리 묶어야 하므로, 애너그램을 key, 원래 단어를 value로 하는 딕셔너리를 만든다. 4. 출력이 count 값이 아니라, 원래 단어들이 묶인 리스트이기 때문에, 같은 key인 단어가 나올 때마다 value 리스트에 원소를 추가하는 식으로 만든다. class So..