TIL 21/05/13
- 카테고리 없음
- 2021. 5. 14.
1.
코딜리티 레슨 pdf를 읽던중 range의 경우 메모리를 많이 할당한다고 한다. 근데 이 내용은 python2에 해당하는 내용이고 현재 python3에서는 range와 xrange동일한 방식으로 메모리를 할당한다고함.
다음 블로그에서는 다음과 같은 말을 한다
하지만, xrange() 를 실행할 경우는 동작 방식이 조금 다르다. 자신에 속한 데이터값을 한꺼번에 메모리에 로드 하는 것이 아니라 해당 값에 접근 할때마다 그 값을 하나씩 로딩하는 방식이다. 그 구조가 마치 generator의 yield 를 사용했을때와 동일한 효과라고 생각하면 된다.
https://bluese05.tistory.com/57
2
리트코드의 Valid Perfect Score 문제를 다음과 같이 풀었다.
x
class Solution: def isPerfectSquare(self, num: int) -> bool: for i in range(1, 2**31-1): if i*i > num: return False if i*i == num: return True다른 사람을 풀이를 봤는데
x
class Solution: def isPerfectSquare(self, num: int) -> bool: square = int(num**(1/2)) return square*square == num훨씬 깔끔하다. 본받도록 하자
3
리트코드 Symmetric Tree를 풀어보려고 했다.
근데 Input이 root = [1,2,2,3,4,4,3] 이런형식이길레 리스트로 주어지는줄 알았는데 클래스로 구현된 TreeNode가 input으로 들어오는거여서 삽질햇다;
나는 입력값이 리스트라고 가정하고 다음과같이 구현했다.
x
# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left# self.right = rightclass Solution: def isSymmetric(self, root: TreeNode) -> bool: root1 = [1,2,2,None,3,None,3] length = len(root1) for i in range(1, 10): if 2**i-1 == length: iterNum = i break if iterNum == 1: return True if iterNum == 2: if root1[1] == root1[2]: return True else: return False for i in range(3, iterNum): leftStartIndex = 2**(i-1) - 1 rightEndIndex = 2*leftStartIndex midLength = (rightEndIndex - leftStartIndex + 1) // 2 leftEndIndex = leftStartIndex + midLength - 1 # rightStartIndex = rightEndIndex - midLength + 1 for i in range(leftStartIndex, rightEndIndex+1): if root1[i] != root1[rightEndIndex + leftStartIndex - i]: return False if leftEndIndex > i: break return True당연히 틀렸다고 나온다;; 그래서 별도로 VSCODE에 리스트 인풋을 줬을때 잘 동작함
재귀로 풀면 다음과 같이 풀 수 있다.
x
# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left# self.right = rightclass Solution: def isSymmetric(self, root: TreeNode) -> bool: if root == None: # 아무것도 없으면 대칭이니까 True 반환 return True return self.checkSymmetric(root.left, root.right) def checkSymmetric(self, leftNode, rightNode): if leftNode == None or rightNode == None: # 둘중 하나만 None 이면 False, 둘다 None이면 True return leftNode == rightNode if leftNode.val != rightNode.val: # 두 노드가 모든 None이 아니지만 값이 다르면 False return False # 이후 재귀를 돌면서 대칭인지 확인 return self.checkSymmetric(leftNode.left, rightNode.right) and self.checkSymmetric(leftNode.right, rightNode.left)