인공지능/Python

인공지능 교육 2일차

익명의오리너구리 2020. 12. 2. 04:19
728x90
반응형

1일차는 쓰는걸 깜빡했다..;;

뭔가 쉬운 테스트들도 배운 queue나 linked list, 이진트리 등등으로 풀어보려고 노력하다 보니

오늘도 늦게 끝났다.. 결국 2문제는 배운걸로 완전 해결을 못해서 시간 있을때 다시 도전해보는 걸로

-12.02: 큰수 만들기 오류 수정 [0, 0, 0] != '000', [0, 0, 0] = '0'

 

linked list 맨앞 노드 지울때 tail도 신경쓰기
사칙연산할 때 숫자가 2자리가 넘어가는 경우도 신경쓰기

이진트리 탐색 중위(좌 중 우) 전위(중 좌 우) 후위(좌 우 중)

힙 - 불규칙적 원소들의 Max, Min 할때 좋음 ex)우선순위 큐, 힙 정렬

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
class Node:
 
    def __init__(self, item):
        self.data = item
        self.left = None
        self.right = None
 
    def insert(self, item):
        if self.data > item:
            if self.left:
                self.left.insert(item)
            else:
                self.left = Node(item)
        else:
            if self.right:
                self.right.insert(item)
            else:
                self.right = Node(item)
 
    def min_pop(self, parent):
        if self.left:
            return self.left.min_pop(self)
        else:
            if self.right:
                parent.left = self.right
            else:
                parent.left = None
            return self.data
 
 
class binary_tree:
 
    def __init__(self):
        self.root = None
 
    def insert(self, item):
        if self.root:
            self.root.insert(item)
        else:
            self.root = Node(item)
 
    def min_pop(self):
        if self.root.left:
            return self.root.left.min_pop(self.root)
        elif self.root.right:
            data = self.root.data
            self.root = self.root.right
            return data
        else:
            data = self.root.data
            self.root = None
            return data
 
    def is_Empty(self):
        return self.root is None
 
 
def solution(d, budget):
    answer = 0
 
    bin = binary_tree()
 
    for i in d:
        bin.insert(i)
 
    sum = 0
    while sum < budget and not bin.is_Empty():
        sum += bin.min_pop()
        answer += 1
 
    return answer - 1 if sum > budget else answer
cs

리스트를 작은 숫자 부터 뽑아오는 이진 트리

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
class Node:
    def __init__(self, data, speed):
        self.data = data
        self.speed = speed
 
class queue:
    def __init__(self):
        self.head = -1
        self.tail = -1
        self.data = []
        self.nodeCount = 0
 
    def enqueue(self, data, speed):
        self.data.append(Node(data, speed))
        self.tail += 1
        self.nodeCount += 1
 
    def dequeue(self):
        self.head += 1
        self.nodeCount -= 1
        return self.data[self.head]
 
    def day(self): #하루 경과 후 진행률 상승
        for i in range(1self.nodeCount + 1):
            self.data[self.head + i].data += self.data[self.head + i].speed
 
    def peek_done(self): #head의 진행도가 100이 넘었는지
        return self.data[self.head + 1].data < 100
 
    def is_Empty(self):
        return self.nodeCount == 0
 
def solution(progresses, speeds):
    answer = []
    jobs = queue()
 
    for i in range(0len(progresses)):
        jobs.enqueue(progresses[i], speeds[i])
 
    while not jobs.is_Empty():
        cnt = 0
        while jobs.peek_done():
            jobs.day()
 
        while not jobs.peek_done():
            jobs.dequeue()
            cnt +=1
            if jobs.is_Empty():
                break
 
        answer.append(cnt)
 
    return answer
cs

queue를 이용한 진행도 관리

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
class Node:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None
 
    #'num1num2'와 'num2num1'을 비교하여 작은 경우 왼쪽 크면 오른쪽으로 저장
    def insert(self, data):
        if str(self.data) + str(data) >  str(data) + str(self.data):
            if self.left:
                self.left.insert(data)
            else:
                self.left = Node(data)
        else:
            if self.right:
                self.right.insert(data)
            else:
                self.right = Node(data)
 
    #가장 오른쪽 노드 부터 뽑아냄
    def pop_max(self, parent):
        if self.right:
            return self.right.pop_max(self)
        else:
            data = self.data
 
            if self.left:
                parent.right = self.left
            else:
                parent.right = None
 
            return data
 
class Binary_tree:
    def __init__(self):
        self.root = None
 
    def insert(self, data):
        if self.root:
            self.root.insert(data)
        else:
            self.root = Node(data)
 
    def pop_max(self):
        if self.root.right:
            return self.root.pop_max(self.root)
        else:
            data = self.root.data
 
            if self.root.left:
                self.root = self.root.left
            else:
                self.root = None
 
            return data
 
    def is_Empty(self):
        return self.root == None
 
def solution(numbers):
    answer = ''
    bin = Binary_tree()
    
    #이진 트리에 데이터 입력
    for i in numbers:
        bin.insert(i)
 
    #이진 트리에 가장 오른쪽부터 전부 뽑아 answer에 더하기
    while not bin.is_Empty():
        answer += str(bin.pop_max())
        if answer == '00':
            answer = '0'
 
    return answer
cs

 

주어진 리스트에서 나올 수 있는 가장 큰 숫자 조합

 

728x90
반응형