이전 챕터에서 구구단을 출력해보자고 얘기 했다.

구구단을 출력해보기 위해 우선 알아야 할 것은

문자열과 숫자 같이 출력하기와 2중 반복문이다.

 

일단 문자열과 숫자 같이 출력하기를 해보겠다.

 

(1) print("out: %d" % 1) 를 입력해 보자.

출력 ->   out: 1

이 경우 " " 안에 있는 문자가 출력되지만, %d가 출력이 되지 않고, " " % 뒤에 있는 숫자가 출력된 것을 확인할 수 있다.

 

(2) print("%d x %d = %d" % (2, 1, 2)) 를 입력해 보자

2 x 1 = 2 라고 출력되는 것을 확인할 수 있다.

즉 %d 가 뒤에 있는 2, 1, 2 로 대체 되어 출력된 것을 확인할 수 있다.

 

(3) 이제 변수를 출력해 보자.

for i in range(2, 9):
  print("2 x %d = %d" % (i, 2 * i))

출력 

2 x 1 = 2

2 x 2 = 4

2 x 3 = 6

2 x 4 = 8

2 x 5 = 10

2 x 6 = 12

2 x 7 = 14

2 x 8 = 16

2 x 9 = 18

 

짠!! 2단이 출력된 것을 확인할 수 있다.

파이썬에서 계산한 값까지 같이 출력이 되었다.

 

(4) 2중 반복문을 실행해 보자.

아래와 같이 for 아래에서 또 for 반복문이 들어가면, 

2단부터 9단까지 출력을 할 수 있다.

for i in range(2, 10):
  for j in range(1, 10):
    print("%d x %d = %d" % (i, j, i * j))

 

출력은 너무 길어서 생략한다.

실행해 보면 알겠지만, 2단부터 9단까지 아래로 쭉 내려오니 너무 보기가 어렵다.

그래서 2장에서 배운 띄어 쓰기와 줄바꿈을 이용해 보자.

(5) 2중 반복문

for i in range(2, 10):
  for j in range(1, 10):
    print("%d x %d = %d" % (i, j, i * j), end = "\t")
  print()                                                           # 줄바꿈

여기서 end = " " 이 아니라, end = "\t"라고 써 줬는데, 이것은 띄어쓰기가 아니라 tab으로 정렬해 주라는 명령어이다.

# 뒤에 들어간 글자는 주석으로 소스코드에 영향을 주지 않는다.

출력 ->

2 x 1 = 2 2 x 2 = 4 2 x 3 = 6 2 x 4 = 8 2 x 5 = 10 2 x 6 = 12 2 x 7 = 14 2 x 8 = 16 2 x 9 = 18

3 x 1 = 3 3 x 2 = 6 3 x 3 = 9 3 x 4 = 12 3 x 5 = 15 3 x 6 = 18 3 x 7 = 21 3 x 8 = 24 3 x 9 = 27

4 x 1 = 4 4 x 2 = 8 4 x 3 = 12 4 x 4 = 16 4 x 5 = 20 4 x 6 = 24 4 x 7 = 28 4 x 8 = 32 4 x 9 = 36

5 x 1 = 5 5 x 2 = 10 5 x 3 = 15 5 x 4 = 20 5 x 5 = 25 5 x 6 = 30 5 x 7 = 35 5 x 8 = 40 5 x 9 = 45

6 x 1 = 6 6 x 2 = 12 6 x 3 = 18 6 x 4 = 24 6 x 5 = 30 6 x 6 = 36 6 x 7 = 42 6 x 8 = 48 6 x 9 = 54

7 x 1 = 7 7 x 2 = 14 7 x 3 = 21 7 x 4 = 28 7 x 5 = 35 7 x 6 = 42 7 x 7 = 49 7 x 8 = 56 7 x 9 = 63

8 x 1 = 8 8 x 2 = 16 8 x 3 = 24 8 x 4 = 32 8 x 5 = 40 8 x 6 = 48 8 x 7 = 56 8 x 8 = 64 8 x 9 = 72

9 x 1 = 9 9 x 2 = 18 9 x 3 = 27 9 x 4 = 36 9 x 5 = 45 9 x 6 = 54 9 x 7 = 63 9 x 8 = 72 9 x 9 = 81

짠~~ 예쁘게 출력 되었다.

Posted by 공놀이나하여보세
,

inorder 트리 구조가 어떤 것인지 알게 되었다.

 

class Solution:
    def __init__(self):
        self.traversal = []
        
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        if root is None:
            return []
        
        
        self.inorderTraversal(root.left)
        
        self.traversal.append(root.val)
        
        
        self.inorderTraversal(root.right)
        
        return self.traversal

 

위키백과에 따르면, 트리 구조는 아래와 같다.

이진 탐색 트리에서

  • 전위 순회: F, B, A, D, C, E, G, I, H (root, left, right)
  • 중위 순회: A, B, C, D, E, F, G, H, I (left, root, right)
  • 후위 순회: A, C, E, D, B, H, I, G, F (left, right, root)
  • 레벨 순서 순회: F, B, G, A, D, I, C, E, H

출처 : https://ko.wikipedia.org/wiki/%ED%8A%B8%EB%A6%AC_%EC%88%9C%ED%9A%8C

 

트리 순회 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 전산학에서 트리 순회(Tree traversal)는 트리 구조에서 각각의 노드를 정확히 한 번만, 체계적인 방법으로 방문하는 과정을 말한다. 이는 노드를 방문하는 순서에 따라 분류된다. 여기서 설명하는 알고리즘은 이진 트리에 대해서 작성되었지만, 다른 모든 트리에서도 일반화될 수 있다. 연결 리스트와 1차원 배열과 같은 선형 자료 구조에서는 한 가지의 논리적인 순회 방법만이 존재하지만, 트리 구조의 순회에는 많은 방법이

ko.wikipedia.org

 

Posted by 공놀이나하여보세
,

파이썬 그리고 트리에 익숙해지기

"""
# Definition for a Node.
class Node:
    def __init__(self, val, children):
        self.val = val
        self.children = children
"""

class Solution:
    def preorder(self, root: 'Node') -> List[int]:
        if not root:
            return []
        traversal = [root.val]
        for child in root.children:
            traversal.extend(self.preorder(child))
        return traversal

 

-> 뒤에 나오는 것은 리턴 타입이다

즉 List[int] 가 리턴 타입

 

Posted by 공놀이나하여보세
,