Just Do IT!

스파르타코딩클럽 내일배움캠프 10일차 본문

스파르타코딩클럽 내일배움캠프/TIL

스파르타코딩클럽 내일배움캠프 10일차

MOON달 2022. 11. 11. 21:00
728x90
반응형
오늘 일과 간단 요약
  1. 알고리즘 강의 2주차 완강
  2. CS 특강
  3. 알고리즘 특강
  4. 프로그래머스 Level 0 5문제 (풀이 링크)

 

 

 

 

 

알고리즘 강의 요약
클래스
  • 같은 속성과 기능을 가진 객체를 총칭하는 개념
  • 객체 : 세상에 존재하는 유일무이한 사물
  • 클래스를 이용하면 같은 속성과 기능을 가진 객체들을 묶어서 정의할 수 있다
  • 클래스에는 생성자(constructor)가 있어 객체를 생성할 때 데이터를 넣어주거나, 내부적으로 원하는 행동을 실행하게 할 수 있다.
    • 생성자 : 생성시에 호출되는 함수
    • self : 객체 자기 자신 (파라미터를 따로 넣어줄 필요 없이 그냥 호출하면 알아서 self에 자기 자신을 넣어준다)
      • self를 통해 객체에 데이터를 쌓을 수 있다
  • 메소드(method) : 클래스 내부의 함수
  • 파이썬에서 생성자 함수의 이름은 __init__으로 고정되어 있다

 

 

링크드 리스트 구현

 

 

  • 링크드리스트 기본 자료구조
    • Node : 데이터와 다음 데이터를 가리키는 주소(포인터)
    • Pointer : 각 노드에서 다음 데이터를 가리키는 주소값을 가진다.
    • Head : 링크드리스트에서 가장 시작점인 데이터를 의미
    • Tail : 링크드리스트에서 가장 마지막 데이터를 의미
    • Next=None(또는 Null) : 다음 데이터가 없을 경우 포인터의 주소값은 None(또는 Null)이다

예시

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None


class LinkedList:
    def __init__(self, value):
        self.head = Node(value)

    def append(self, value):
        cur = self.head
        while cur.next is not None:
            cur = cur.next
        cur.next = Node(value)

# 모든 원소 출력
    def print_all(self):
        cur = self.head
        while cur is not None:
            print(cur.data)
            cur = cur.next

    def get_node(self, index):
        node = self.head
        count = 0
        while count < index:
            node = node.next
            count += 1
        return node

# 원소 추가
    def add_node(self, index, value):
        new_node = Node(value)
        if index == 0:
            new_node.next = self.head
            self.head = new_node
            return

        node = self.get_node(index - 1)
        next_node = node.next
        node.next = new_node
        new_node.next = next_node

# 원소 삭제
    def delete_node(self, index):
        if index == 0:
        	self.head = self.head.next
            return
        node = self.get_node(index - 1)
        node.next = node.next.next


linked_list = LinkedList(5)
linked_list.append(12)
linked_list.add_node(0, 3)
linked_list.print_all()

 

 

이진 탐색
  • 범위의 절반인 50을 시도해보는 방법
  • 무작위로 정렬되어 있는 배열에서는 이진 탐색을 사용할 수 없다
  • 이진 탐색이 가능한 이유는 한 방향으로 정렬되어 있었기 때문
  • 일정한 규칙으로 정렬되어 있는 데이터일 때만 이진 탐색이 가능하다
  • 이분탐색을 위해서는 시간 복잡도가 O(logN) 만큼 걸린다.

예제

# 1~16 오름차순으로 정렬되어 있는 배열에서 14가 존재한다면 True, 존재하지 않는다면 False 반환

finding_target = 14
finding_numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]


def is_existing_target_number_binary(target, array):
    current_min = 0
		current_max = len(array) - 1
		current_guess = (current_min + current_max) // 2

		while current_min <= current_max:
				if array[current_guess] == target:
						return True
				elif array[current_guess] < target:
						current_min = current_guess + 1
				else:
						current_max = current_guess - 1
				current_guess = (current_min + current_max) // 2

    return False


result = is_existing_target_number_binary(finding_target, finding_numbers)
print(result)

 

 

재귀 함수
  • 재귀(Recursion) : 어떠한 것을 정의할 때 자기 자신을 참조하는 것
  • 재귀 함수 : 자기 자신을 호출하는 함수
    • 재귀 함수를 이용해서 간결하고 효율성 있는 코드를 작성할 수 있다
    • 탈출 조건을 만들어줌으로써 재귀 함수의 반복을 멈출 수 있다.
# 팩토리얼

def factorial(num):
		if n == 1:
				return 1
		return n * factorial(num - 1)

print(factorial(60))

 

 

 

 

CS 특강

CS 특강은...아이패드에 필기를 해놓았는데

나중에 보니까 이게 뭔말인지 싶어서 ㅋㅋㅋㅋㅋ 주말에 다시 공부해야 할듯 싶다.

 

이렇게 각잡고(?) CS에 관련해서 공부해본 적이 없어서 1시간이 거의 몇 시간 같았다.

바쁘게 적고 이해하고 했던 것 같은데 TIL 쓰려고 다시 돌아보니 물음표 투성이이다 ㅠㅠ

그나마 어떤 분이 (=인국님) 유튜브에서 한시간 내의 쉽게 이해할 수 있는 CS 특강을 공유해주셔서

아마 다음주나 주말에 그 강의를 보고 다시 복습할 듯 싶다.

 

솔직히 지금 할 게 너무 많아서 그런가 CS가 뒤로 밀리는 기분이다ㅠ

사실 할 게 너무 많은게 알고리즘 때문이라...일단 이놈부터(?) 해결하고 봐야 할것 같다.

 

나름 필기 열심히 했는데...공적으로 보여주기 뭔가 민망해서 나중에 정리하고 요기에 링크를 달던지 해야겠다.

 

 

 

프로그래머스 Level 0 5문제

가장 쉬운 순서대로 Level 0부터 차근차근 풀고 있다.

어제부터 시작했는데, 지금은 그래도 쉬운 문법으로도 풀 수 있어서 아주 쉽게쉽게 풀고 있다.

 

물론 실행해보고 오류가 생겨서 고치는 경우도 있지만,

알고리즘 강의를 들으며 어렵게 꼬였던 생각이 그나마 풀리는 기분이다.

 

Level 2까지는 무난히 풀어야 대기업 코테도 잘 볼 수 있다는데 아직 시작한지 얼마 안되었으니까!

어제도 욕심 부리지 말자고 다짐해놓고 풀어서 그런가 오늘은 왠지 어제보다 더 잘 풀린 기분이다 ㅋㅋㅋ

풀이는 따로 포스팅 해놓고 있는데 나중에 찾아보기 좋을 것 같아서 앞으로도 쭉 이럴 예정이다.

 

 

 

 

 

짧은 일기

이제 거의 습관처럼 마지막에 짧은 일기를 쓰는데, 하루를 돌아보는 것 같고 마무리 하는 기분이라서 좋다.

알고리즘...이번주 최대 난제다.

사실 계획에는 이렇게 강의를 듣는 진도가 느릴 줄 몰랐는데.

특강도 듣고 시간을 오래 쓰는데도 아직 처음이라서 접근 자체가 너무 어렵게 느껴지는 것 같다.

매니저님도, 튜터님도 너무 여기에 몰입하면 오히려 번아웃이 온다고 말씀해주셔서 마음을 편하게 먹으려고 하지만,

솔직히 마음처럼 쉽지는 않다.

 

그렇지만 진도를 느리게 나가면서 최대한 그림도 그려보고, 이해하는 중이다.

아니면 추가로 다른 강의를 더 듣거나 책을 보거나 해서 알고리즘을 천천히 이해하고 싶다.

정 버거우면 아예 멈추고 자바스크립트 문법을 더 보거나 하고.

 

파이썬을 하다가 아까 프로그래머스 문제는 자바스크립트로 풀려고 하니까 좀 헷갈리긴 했다 ㅋㅋㅋ

자바스크립트를 주로 써야 하는데 요 며칠 계속 파이썬을 써서 그런가 싶기도 하고.

주말동안 고민해보고 어떤 방향으로 가야할지 정해야겠다.

 

일단은 금요일이니까 즐겁게 마무리 하고 싶다.

이번주도 수고 많이했고, 알고리즘으로 힘들어하는 우리 조와 다른 분들 모두 화이팅이다!

728x90