본문 바로가기

전체 글267

[LeetCode] Happy Number 파이썬 (dict, cycle) class Solution: def isHappy(self, n): lookup = {} while n != 1 and n not in lookup: lookup[n] = True n = self.nextNumber(n) return n == 1 def nextNumber(self, n): new = 0 for char in str(n): new += int(char)**2 return new 출처: github.com/jiapengwen/LeetCode/blob/master/Python/happy-number.py 2021. 4. 4.
[LeetCode] Fatorial Trailing Zeros 파이썬 (dp) cache = {} class Solution: def factorial_recursive(self,n): global cache if n in cache: return cache[n] elif n 1 else 1 def get_zeros(self, ls): ls = list(str(ls))[::-1] cnt = 0 for num in ls: if num == "0": cnt += 1 else: break return cnt def trailingZeroes(self, n: int) -> int: if n == 0: return 0 else: ans = self.factorial_recursive(n) ans = self.get_zeros(ans) return ans DP로 Factorial을 구하는 메.. 2021. 4. 3.
[LeetCode] Excel Sheet Column Number 파이썬 (ord) class Solution: def titleToNumber(self, columnTitle: str) -> int: result = 0 for i in range(len(columnTitle)): result *= 26 result += ord(columnTitle[i]) - ord('A') + 1 return result 첫 번째 A는 26x0 + ord("A") - ord("A") + 1 (A는 1로 문제에서 인식하기 때문에) 두 번째 B는 26x1 + ord("B") - ord("A") + 1 로 나타내기 때문에 result 초기값을 0으로 설정한 다음 계속 26을 곱해주고 해당 alphabet의 값을 더해준다 2021. 4. 3.
[LeetCode] Majority Element 파이썬 (dict, Counter, median) nums = [2,2,1,1,1,2,2] d = dict() for n in nums: if n in d: d[n] += 1 else: d[n] = 0 print(d) print(sorted(d.items(), key=lambda x: -x[1])[0][0]) # output # {2: 3, 1: 2} # [(2, 3), (1, 2)] #(key, value) # 2 dict에 넣어서 sorted key items()로 iterable하게 만든 다음 tuple로 나오는 값 중에서 뒤의 value 인 x[1]을 기준으로 오름차순으로 해야하기 때문에 -x[1] 으로 해준다. 제일 앞에 있는 tuple 중에서 key값을 return 해야되기 때문에 [0][0] 2021. 4. 2.
[LeetCode] Excel Sheet Column Title 파이썬 (divmod, chr, ord) class Solution: def convertToTitle(self, columnNumber: int) -> str: q = columnNumber ans = "" while True: if q == 0: break q, r = divmod(q-1,26) ans += chr(r + ord('A')) return ans[::-1] 0-indexing이기 때문에 q-1을 한 값에 divmod를 26으로 추출 대문자를 출력해야 되기 때문에 ord("A") ,즉 65를 기준으로 r(나머지) 를 더한 값을 chr에 인자로 넣어서 character를 ans에 추가해준다. return은 역순으로 해줘야 한다. dict을 활용한 방법 alpha = {} az = [chr(x) for x in range(ord("A.. 2021. 4. 2.
[LeetCode] Two Sum II - Input array is sorted 파이썬 class Solution: def twoSum(self, numbers: List[int], target: int) -> List[int]: seen = {} for i, v in enumerate(numbers): remaining = target - v if remaining in seen: return [seen[remaining]+1, i+1] seen[v] = i return [] 기존의 Two Sum 과 다른 점은 sorted array라는 점과 zero-indexed가 아니라 1-indexed이라는 점. 2021. 4. 2.
[LeetCode] Intersection of Two Linked Lists (switch) 솔루션 # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode: p1 = headA p2 = headB while p1 != p2: if p1: p1 = p1.next else: p1 = headB if p2: p2 = p2.next else: p2 = headA return p1 while 문 조건을 p1 != p2 기준으로 두 node가 같은 경우 while문 중단한다. node가 다른 경우 .. 2021. 4. 2.
[LeetCode] Linked List Cycle 파이썬 (is operator, id) 2가지 풀이법(1: fast & slow, 2: marked as read) 풀이 1 (fast, slow) class ListNode: def __init__(self, x): self.val = x self.next = None class Solution: # @param head, a ListNode # @return a boolean def hasCycle(self, head): fast, slow = head, head while fast and fast.next: fast, slow = fast.next.next, slow.next if fast is slow: return True return False 어떻게 풀어야 할지 전혀 감이 안왔던 문제 fast, slow라는 2개의 head 의 c.. 2021. 4. 1.
[LeetCode] Single Number python (linear complexity) class Solution: def singleNumber(self, nums: List[int]) -> int: for i in range(len(nums)): if nums.count(nums[i]) == 1: return nums[i] count 활용해서 하긴 했는데 통과 못할 줄 알았는데 통과가 되었다. 역시 하위 93%의 속도 😱 다른 풀이(136ms): dict 사용 class Solution: def singleNumber(self, nums: List[int]) -> int: seen = {} for i in range(len(nums)): if nums[i] not in seen: seen[nums[i]] = 1 else: seen[nums[i]] += 1 for k,v in seen.i.. 2021. 4. 1.