내배캠 16일차

·2022년 11월 28일
3

내일배움캠프

목록 보기
16/142
post-thumbnail

오늘의 목표
타임어택
git 강의 1주차
algorithm 강의 4주차 찍먹
http/https cs강의(보다말았음)

타임어택

각도

def solution(angle):
    answer = 0
    if 0 < angle < 90:
        answer = 1
    elif angle == 90:
        answer = 2
    elif 90 < angle < 180:
        answer = 3
    elif angle == 180:
        answer = 4
    return answer

print(solution(70))
print(solution(91))
print(solution(180))

할인

import math

def solution(price):
    answer = 0
    
    if 10 <= price <= 1000000:
        if price >= 500000:
            answer = price * ((100 - 20) / 100)
        elif price >= 300000:
            answer = price * ((100 - 10) / 100)
        elif price >= 100000:
            answer = price * ((100 - 5) / 100)
        else:
            answer = price
    else:
        return 'price가 잘못되었습니다.'
            
            
    return math.trunc(answer)

print(solution(150000))
print(solution(580000))

369

def solution(order):
    answer = 0
    list = [3, 6, 9]

    if 1 <= order <= 1000000:
        string = str(order)
        for index in range(len(list)):
            for i in range(len(string)):
                if list[index] == int(string[i]):
                    answer += 1

    return answer

print(solution(3333))

로그인

-내거(우중님 도움)

def solution(id_pw, db):
    answer = ''
    if id_pw not in db:
        for i in range(len(db)):
            if id_pw[0] not in db[i]:
                answer = 'fail'
            else:
                answer = 'wrong pw'
                break #우중님
    else:
        answer = 'login'
    return answer

-asher park 도움

def solution(id_pw, db):
    answer = ''
    if id_pw not in db:
        for i in range(len(db)):       #포문내용
            if id_pw[0] not in db[i]:
                answer = 'fail'
                continue
            else:
                if id_pw[1] not in db[i]:
                    answer = 'wrong pw'
                    break
                else:
                    answer = 'login'
                    break
    else:
        answer = 'login'

    return answer

-준호님 도움

def solution(id_pw, db):
    if id_pw not in db:
        for i in db:
            if id_pw[1] != i[1]:
                return 'wrong pw'
            elif id_pw[0] != i[0]:
                return 'fail'
    else:
        return 'login'

git 1주차

git 기본 개념

  • 버전관리를 한다는 것은 프로젝트 상태가 변경되는 정보를 알고 있다는 것.
    Git 은 commit 을 사용해서 버전이 달라지는 것을 관리.
  • 컴퓨터에 있는 프로젝트를 Git 이 관리하는 프로젝트로 만들 수 있음. 이 작업을 git 초기화(git initialize)한다고 표현합니다.
  • 현재 프로젝트의 상태를 저장하는 것을 commit 이라고 합니다.
  • commit 에는 아래를 포함.
    • 누가(author), 언제 commit 했는지의 정보와 프로젝트 변경 내용
    • 작업내역이 어떤 것인지 알아볼 수 있게 적는 메시지를 'commit 메시지'.
  • commit 에 반영할지 안할지는 파일 단위로 선택할 수 있음.
    commit 에 반영할 파일을 선택하는 것을 add (혹은 staging, 스테이징).
  • commit 한 기록은 history 로 볼 수 있음.
  • 소스트리에서 'git 초기화하기(initialize) - add(staging) - commit'.
    • git 초기화는 처음에 단 한번만 해 주면 된다. 작업 내역을 저장하기 위해서는 add - commit 만 하면 된다.

repo

  • 'Git으로 관리되는 프로젝트' 를 Git 에서는 repo(리포, repository 리포지토리의 약자) 라고 부른다.
  • 내 컴퓨터에 저장되어있는 리포지토리를 로컬 repo(local repository).
    Github 처럼 다른 곳에서 접속할 수 있는 공간에 저장되어있는 것을 원격 repo(remote repository) .
  • Github은 원격 repo 가 저장되어있고 + 개발자 커뮤니티 기능을 하는 서비스입니다. Github 을 사용해서 원격 repo 를 만들고 관리
  • Git은 클라우드 서비스로 두 군데의 내용을 동기화한 것처럼 원격 repo와 로컬 repo 를 연결시켜서 내용을 반영. (commit을 수동으로 반영해야한다)
    로컬 repo 가 원격 repo 를 연결하는 것을 추적(Tracking, 트랙킹 / branch tracking) 이라고 한다.
  • 로컬 repo(기준) 만이 내가 어떤 원격 repo 와 연결되어있는지를 알고 있음. 원격 repo 는 내가 어떤 로컬 repo 와 연결되어있는지 정보를 가지고 있지 않음.

push/pull/clone

  • 로컬 repo 의 commit 들을 원격 repo 에 반영하는 것을 push(푸쉬)이라고 해요. commit들을 밀어넣기!
  • 원격 repo 의 commit 들을 로컬 repo 에 반영하는 것을 pull(풀) 이라고 해요. commit들을 땡겨오기!
  • 원격 repo 를 내 컴퓨터에서도 사용할 수 있도록 가져올 수도 있어요. 일종의 초기 다운로드라고 생각하면 됩니다. 이걸 clone(클론, 복제) 라고 해요.

알고리즘 4주차

트리

  • 뿌리와 가지로 구성되어 거꾸로 세워놓은 나무처럼 보이는 계층형 비선형 자료 구조.
  • 선형구조 : 자료를 구성하고 있는 데이터들이 순차적으로 나열시킨 형태/ 자료를 저장하고 꺼내는 것에 초점 ( 큐 와 스택 )
  • 비선형구조 : 데이터가 계층적 혹은 망으로 구성/ 표현에 초점

트리에서 나오는 용어들

Node: 트리에서 데이터를 저장하는 기본 요소
Root Node: 트리 맨 위에 있는 노드
Level: 최상위 노드를 Level 0으로 하였을 때, 하위 Branch로 연결된 노드의 깊이를 나타냄
Parent Node: 어떤 노드의 상위 레벨에 연결된 노드
Child Node: 어떤 노드의 하위 레벨에 연결된 노드
Leaf Node(Terminal Node): Child Node가 하나도 없는 노드
Sibling: 동일한 Parent Node를 가진 노드
Depth: 트리에서 Node가 가질 수 있는 최대 Level

트리 종류

  • 이진 트리, 이진 탐색 트리, 균형 트리(AVL 트리, red-black 트리), 이진 힙(최대힙, 최소힙) 등 되게 다양한 트리
  • 이진트리(Binary Tree) : 각 노드가 최대 두 개의 자식을 가진다.
  • 완전이진트리 : 노드를 삽입할 때 최하단 왼쪽 노드부터 차례대로 삽입해야한다.
      o      Level 0
    o   o    Level 1
     o o     Level 2  # -> 이진 트리 O 완전 이진 트리 X

      o      Level 0
    o   o    Level 1
   o o o     Level 2  # -> 이진 트리 O 완전 이진 트리 O

트리구조를 배열에 저장하는 밥법

: 완전 이진 트리를 사용하는 경우
트리를 구현할 때는 편의성을 위해 0번째 인덱스는 사용되지 않습니다!
그래서 None 값을 배열에 넣고 시작합니다! [None]

      8      Level 0 -> [None, 8] 첫번째 레벨의 8을 넣고,
    6   3    Level 1 -> [None, 8, 6, 3] 다음 레벨인 6, 3을 넣고
   4 2 5     Level 2 -> [None, 8, 6, 3, 4, 2, 5] 다음 레벨인 4, 2, 5를 넣으면 됩니다!

자 그러면, [None, 8, 6, 3, 4, 2, 5] 라는 배열이 되는데
다시 역으로 이 배열을 활용해서 트리 구조를 분석해보겠습니다.
다음과 같은 방법으로 트리 구조를 파악할 수 있습니다.

1. 현재 인덱스 * 2 -> 왼쪽 자식의 인덱스
2. 현재 인덱스 * 2 + 1 -> 오른쪽 자식의 인덱스
3. 현재 인덱스 // 2 -> 부모의 인덱스

예를 들어서 1번째 인덱스인 8의 왼쪽 자식은 6, 오른쪽 자식은 3 입니다.
그러면 1 * 2 = 2번째 인덱스! 6!
그러면 1 * 2 + 1 = 3번째 인덱스! 3! 입니다!
부모를 찾아보면, 3 // 2 = 1번째 인덱스 8 이므로 부모를 찾을 수 있습니다.

이를 다시 생각해보면
[None, 8, 6, 3, 4, 2, 5]8 밑에 6, 3 이 있고, 6, 3 밑에 4, 2, 5가 있는 완전 이진 트리구나! 생각할 수 있습니다.

트리의 높이

  • 트리의 높이(Height)는, 루트 노드부터 가장 아래 리프 노드까지의 길이.
  • 각 레벨에 최대로 들어갈 수 있는 노드의 개수는 2^h개(h는 레벨)
    => 모든 노드의 개수는 1 + 2^1 + 2^2 + 2^3 + 2^4 ..... 2^h = 2^(h+1) - 1
    => 이때 최대 노드 개수를 N = 2^(h+1) - 1 라고 하면
    => h = log2(N+1)-1
    => 이진 트리의 높이는 최대가 O(log(N))
profile
개발자 꿈나무

2개의 댓글

comment-user-thumbnail
2022년 11월 30일

같이 놀자면서 혼자서 공부 엄청 했네요 배신감 듭니다

1개의 답글