내일배움캠프/TIL
알고리즘
91song4
2022. 11. 24. 02:03
클래스
- 객체
- 생성자
- 메소드
- self
single linked list
** join 은 배열요소값이 인트면 사용이 안된다.
오늘 강의에서 백준 1158 문제를 소개하길래 한 번 풀어봤습니다.
문제를 보니 왠지 배열로 가능할 것 같았습니다.
그러나 오늘 강의내용이 연결리스트 였기에 연결리스트로 만들어보았습니다.
class Node:
def __init__(self, data, head=None):
self.data = data
self.next = head
class Linked_list:
def __init__(self, count=1):
self.head = Node(1)
i = 1
while i < count:
self.append(i+1)
i += 1
def is_empty(self):
if self.head == None:
return True
return False
def append(self, data):
cur = self.head
while cur.next != self.head and cur.next != None:
cur = cur.next
cur.next = Node(data, self.head)
def get_last_node(self):
find_node = self.head
while find_node.next != self.head:
find_node = find_node.next
return find_node
def delete_node(self, node, step):
if self.head.next == self.head:
temp_node = self.head
self.head = None
return temp_node
del_node = node
count = 1
while count < step:
prev_node = del_node
del_node = del_node.next
count += 1
if del_node == self.head:
prev_node = self.get_last_node()
self.head = del_node.next
prev_node.next = self.head
else:
prev_node.next = del_node.next
return del_node
def josephus_problem(n, k):
linked_list = Linked_list(n)
temp_node = linked_list.head
del_arr = []
temp_node = linked_list.delete_node(temp_node, k)
del_arr.append(str(temp_node.data))
while linked_list.is_empty() != True:
temp_node = linked_list.delete_node(temp_node.next, k)
del_arr.append(str(temp_node.data))
return print(f'<{", ".join(del_arr)}>')
n, k = map(int, input().split())
josephus_problem(n, k)
분명 vscode에선 잘 작동하지만.. 백준에 답을 제출해보니 런타임 에러 (AttributeError)가 뜹니다.
이유를 찾아보려 했지만 아직 알아내지 못했습니다.
괜시리 정답을 맞췄다는 문구가 보고싶었던 저이기에
처음 문제를 봤을때 배열을 사용해서 풀 수 있을것같아서 다시 배열로 문제를 풀어보았습니다.
BOJ 1158
def josephus_problem(n, k):
arr_max = []
josephus_arr = []
for arr in range(1, n+1):
arr_max.append(arr)
i = 0
while len(arr_max):
if len(arr_max) == 1:
josephus_arr.append(str(arr_max.pop(0)))
break
i += k-1
while not i < len(arr_max):
i -= len(arr_max)
josephus_arr.append(str(arr_max.pop(i)))
if not i < len(arr_max):
i = 0
return print(f'<{", ".join(josephus_arr)}>')
n, k = map(int, input().split())
josephus_problem(n, k)
백준에서 맞았습니다!! 문구를 보니 마음이 편안합니다. 그러나 연결리스트로 만든건 왜 안되는지 아직 잘 모르겠습니다.
내일 한번 더 알아봐야겠습니다.