
import array
arr = array.array('b', [10, 40, 22, -4, 9])
print(arr)

비어있는 리스트를 생성하는 연산자(__init__())

리스트가 비어있는지 확인하는 연산자(is_empty())
리스트의 앞에 개체를 삽입하는 연산자(prepend())

리스트의 뒤에 개체를 삽입하는 연산자(append())

리스트의 첫 머리(head)를 결정하는 연산자(set_head())

주어진 인덱스에 접근하는 연산자(access(), get())

주어진 인덱스에 삽입하는 연산자(insert())

주어진 인덱스의 요소를 제거하는 연산자(remove())

1) 리스트 arr의 모든 자료에 대해서, 짝수 데이터들의 평균과 홀수 데이터들의 평균을 각각 계산하시오. 출력은 2개의 출력을 리스트로 묶어 출력하시오.
def solution(arr):
even_arr = arr[1::2]
odd_arr = arr[::2]
return [sum(even_arr) / len(even_arr),
sum(odd_arr) / len(odd_arr)]
if __name__ == '__main__':
arr = [1, 3, 5, 7, 9, 2, 5, 1, 4]
sol = solution(arr)
print(sol)
2) 리스트의 자료 순서를 거꾸로 변경하시오. 추가 리스트를 생성하지 말고, 주어진 리스트에서 in-place로 하시오.
def solution(arr):
N = len(arr)
for i in range(N // 2):
arr[N-i-1], arr[i] = arr[i], arr[N-i-1]
return arr
if __name__ == '__main__':
arr = [1, 3, 5, 7, 9, 5]
sol = solution(arr)
print(sol)
3) 리스트 arr에 존재하는 모든 피크 값을 출력하시오. 단, 피크 인덱스란 'arr[i-1] < arr[i], arr[i+1] < arr[i]' 를 동시에 만족하는 인덱스 i를 말하며, 피크 값은 이 떄 arr[i]를 말한다.
def solution(arr):
res = []
for i in range(1, len(arr)-1):
if arr[i-1] < arr[i] and arr[i+1] < arr[i]:
res.append(arr[i])
return res
if __name__ == '__main__':
arr = [3, 1, 2, 6, 2, 2, 5, 1, 9, 10, 1, 11]
sol = solution(arr)
print(sol)
4) 이차원 리스트 arr를 시계방향으로 90도 회전시킨 결과를 출력하시오.
def solution(arr):
N = len(arr)
M = len(arr[0])
res = [[0 for _ in range(N)] for _ in range(M)]
for i in range(N):
for j in range(M):
res[j][N-i-1] = arr[i][j]
return res
if __name__ == '__main__':
arr = [[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10],
[11, 12, 13, 14, 15]]
sol = solution(arr)
print(sol)
단방향 연결 리스트: 자료의 값과 연결 정보를 가진 노드(node)로 구성

양방향 연결 리스트: 양방향으로 노드를 연결하는 이중 연결 구조

비어있는 리스트를 생성하는 생성자 (__init__())

리스트가 비어있는지 확인하는 연산자 (is_empty())
리스트의 앞에 개체를 삽입하는 연산자 (prepend())

리스트의 뒤에 개체를 삽입하는 연산자 (append())

리스트의 첫 머리를 결정하는 연산자 (set_head())

주어진 인덱스에 접근하는 연산자 (access(), get())

주어진 인덱스에 삽입하는 연산자 (insert())

주어진 인덱스의 개체를 제거하는 연산자 (remove())

class Node:
def __init__(self, value, next):
self.value = value
self.next = next
class LinkedList:
def __init__(self):
self.head = None
def is_empty(self):
return self.head is None
def prepend(self, value):
# 1. 일반적인 경우에 잘 동작 하는가?
# 2. 처음에 연결리스트가 비어있을 떄 잘 동작 하는가?
node = Node(value, self.head)
self.head = node
def append(self, value):
# 1. 일반적인 경우에 잘 동작 하는가?
curr = self.head
if curr is None:
# 2. 처음에 연결리스트가 비어있을 떄 잘 동작 하는가?
self.head = Node(value, None)
return
while curr.next is not None:
curr = curr.next
node = Node(value, None)
curr.next = node
def set_head(self, index):
# 1. 일반적인 경우에 잘 동작 하는가?
curr = self.head
for _ in range(index):
# 2. index > N
if curr is None:
return
curr = curr.next
# 3. index == N
if curr is None:
return
self.head = curr
def access(self, index):
# 1. 일반적인 경우에 잘 동작 하는가?
curr = self.head
for _ in range(index):
# 2. index > N
if curr is None:
return None
curr = curr.next
# 3. index == N
if curr is None:
return None
return curr.value
def insert(self, index, value):
# 2. 0번 인덱스에 삽입하는 경우
if index == 0:
self.prepend(value)
return
# 1. 일반적인 경우
curr = self.head
prev = None
for _ in range(index):
if curr is None:
return
prev = curr
curr = curr.next
node = Node(value, curr)
prev.next = node
def remove(self, index):
# 3. 비어있는 연결리스트에 적용하는 경우
if self.head is None:
return
# 2. index = 0인 경우
if index == 0:
self.head = self.head.next
return
# 1. 일반적인 경우
curr = self.head
prev = None
for _ in range(index):
if curr is None:
return
prev = curr
curr = curr.next
# 4. index == N인 경우
if curr is None:
return
prev.next = curr.next
def print(self):
curr = self.head
while curr is not None:
print(curr.value, end=' ')
curr = curr.next
print()
if __name__ == '__main__':
my_list = LinkedList()
my_list.print()
for i in range(10):
my_list.append(i + 1)
my_list.print()
for i in range(10):
my_list.prepend(i + 1)
my_list.print()
value = my_list.access(3)
print('my_list.access(3) = ' + str(value))
my_list.insert(8, 128)
my_list.print()
my_list.remove(4)
my_list.print()
my_list.set_head(10)
my_list.print()
이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다