목록분류 전체보기 (190)
거누의 개발노트
문제 중복된 문자를 제외하고 사전식 순서로 나열하라. 입력 s1 = 'bcabc' s2 = 'cbacdcbc' 출력 r1 = 'abc' r2 = 'acdb' 작성한 코드 def removeDuplicateLetters(s: str) -> str: counter = collections.Counter(s) stack = [] seen = set() for char in s: counter[char] -= 1 if char in seen: continue # 1. stack 안에 값이 존재하는지 # 2. char 값보다 스택 top에 있는 값이 크면 # 3. 스탭 top의 숫자가 0보다 크면 while(stack and char 0): # ..
문제 괄호로 된 입력값이 올바른지 판별하라. 입력 '()[]{}' 출력 True 스택으로 풀이 def isValid(s: str) -> bool: if len(s) % 2 != 0: return False default = { ')':'(', ']':'[', '}':'{' } open = '({[' stack = [] for i in s: if i in opedn: stack.append(i) else: if not stack: return False if default.get(i) != stack.pop(): return False return not stack 리코드에서 확인 https://leetcode.com/problems/valid-parentheses/ Valid Parentheses - L..
문제 연결 리스트를 뒤집어라 입력 1->2->3->4->5->NULL 출력 5->4->3->2->1->NULL 작성한 코드 def reverseList(head): node, prev = head, None while node: # 1 2 3 next = node.next # 2 3 node.next = prev # Null 1 prev = node # 1 2 node = next # 2 3 return prev 책에 있는 코드 def reverseList(self, head) -> ListNode: # SOL 1) Recursive Way def reversef(node, prev=None): if not node: # node가 비어있는 경우 return prev next, node.next = n..
문제 정렬되어 있는 두 연결 리스트를 합쳐라 입력 1->2->4 1->3->4 출력 1->1->2->3->4->4 책에 있는 코드 class solution: def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode: if (not l1) or (l2 and l1.val > l2.val): l1, l2 = l2, l1 if l1: l1.next = self.mergeTwoLists(l1.next, l2) return l1 찾은 코드 # 이해하기 쉬운 풀이 def mergeTwoLists(list1, list2): if (list1 == None and list2 == None): return None head = result = ListNode()..
문제 n개의 페어를 이용한 min(a, b)의 합으로 만들 수 있는 가장 큰 수를 출력하라. 입력 [1, 4, 3, 2] 출력 4 설명 n은 2가 된다. ( 2개씩 묶어서 한쌍! ), 최대합은 min(1, 2) + min(3,4) = 4 작성한 코드 def array_pair_sum(nums: List[int]) -> int: sum = 0 nums.sort() for i, n in enumerate(nums): # 인덱스가 짝수 번째인 값의 계산 if i % 2 == 0: sum += n return sum 회고 아직 문법이나 어떤 함수를 써야할지 잘 몰라서 계속 검색하면서 풀었다. 그래도 이문제는 쉽게 이해가 되었던 것 같다. https://programmers.co.kr/learn/challeng..
문제 배열을 입력받아 합으로 0을 만들수 있는 3개의 엘리먼트를 출력하라. 입력 nums = [-1, 0, 1, 2, -1, -4] 출력 [ [-1, -1, 2], [-1, 0, 1] ] 작성한 코드 def threeSum(nums: List[int]): lists = [] for a in itertools.combinations(sorted(nums), 3): if sum(a) == 0: lists.append([*a]) rtn = [] for l in lists: if l not in rtn: rtn.append(l) return rtn 리코드에서 시간 초과가 나왔다. - 숫자가 많아지면 조합해야 할 숫자가 많기 때문에 초과된걸로 생각된다. 책에 있는 코드 def threeSum(nums: list..
문제 가장 긴 팰린드롬 부분 문자열을 출력하라. 팰린드롬? 회문 또는 팰린드롬은 거꾸로 읽어도 제대로 읽는 것과 같은 문장이나 낱말, 숫자, 문자열 등이다. 보통 낱말 사이에 있는 띄어쓰기나 문장 부호는 무시한다. 예를들어 다시 합창 합시다, 소주 만병 만 주소 등이 있다. 입력 "babad" "cbbd" 출력 "bab" "bb" 작성한 코드 def logestPalindrome(s: str) -> str: def expand(left: int, right: int) -> str: # 팰린드롬 여부를 체크하며 포인터 확장 while left >= 0 and right
문제 문자열 배열을 받아 애너그램 단위로 그룹핑하라 애너그램? 일종의 말장난으로 어떠한 단어의 문자를 재배열하여 다른 뜻을 가지는 다른 단어로 바꾸는 것을 말한다. 고대 유대인들이 히브리어로 하곤 했고, 중세 유럽에도 큰 인기를 끌었다. 프랑스 궁정에서는 '왕을 위해 애너그램을 하는 사람'을 고용하기도 했을 정도다. 중세의 대표적인 어구전철은 라틴어로 된 아베 마리아 의 애너그램이다. 우리나라 말로는 '문전박대' 를 '대박전문' 으로 바꿔 부르는 단어 등이 있다. 입력 ['eat', 'tea', 'tan', 'ate', 'nat', 'bat'] 출력 [ ['eat', 'tea', 'ate'], ['tan', 'nat'], ['bat'] ] 작성한 코드 def groupAnagrams(strs: List..