카테고리 없음

[내일배움캠프] 11/9 수요일 TIL 회고록

tft4rollz 2022. 11. 9. 21:19

9시에 입실 체크를 한 후 바로 강의를 들었다.

오늘은 강의를 많이 들어야해서 집중해서 들어야겠다.

 

 

두시에 튜터님이 줌으로 알고리즘 강의를 해주셨다. 말도 정말 재치있게 잘하셔서 정말 재밌게 봤다.

                             -요약-

코딩테스트는 보통 파이썬, 자바스크립트, C++로 한다.

프로그램: input , 가공: output 

재료,도구 : 자료구조, 레시피: 알고리즘

자주 쓰는건 외우자

 

1-10 파이썬 심화 문법 뽀개기

여기서 부터는 조금 더 심화된 문법들을 다룬다고 하는데 얼마나 어려운게 많이나오면 마음 편하게 들으라고 할까..

어렵겠지만 이해해서 내 것으로 만들어 봐야겠다! 튜플은 어디서 들어본거같다.. 기분탓인가?

 

1-11 튜플, 집합

1. 튜플

튜플은 리스트와 비슷하지만 불변인 자료형이다. 마찬가지로 순서가 존재한다.

 

아래 코드는 list 형식일때는 추가가 되었지만 튜플은 불변인 자료형이므로 추가가 안된다. 

a = (1,2,3)
a[0] = 99

튜플은 딕셔너리 대신 리스트와 튜플로 딕셔너리 비슷하게 만들어 사용해야 할때 많이 쓰인다.

a_dict = [('bob','24'),('john','29'),('smith','30')]

 

2. 집합

집합은 말 그대로 집합이다. 중복을 제거 해 준다.

a = [1,2,3,4,5,6,1,2,3,7,8]

a_set = set(a)

print(a_set)

실행 결과 , 중복이 사라졌다.

집합은 교집합/ 합집합/ 차집합도 구할 수 있다.

 

교집합

a = ['사과','감','배','딸기']
b= ['배','사과','포도','참외','수박']

a_set = set(a)
b_set = set(b)

print(a_set & b_set)

실행 결과, a b에 모두 들어가있는 사과, 배가 출력됐다.

 

합집합

| 는 키보드 ] 오른쪽에 있는 \ 버튼이다. SHIFT + \  하면 나온다.

a = ['사과','감','배','딸기']
b= ['배','사과','포도','참외','수박']

a_set = set(a)
b_set = set(b)

print(a_set | b_set

실행 결과

 

퀴즈1. A가 들은 수업 중 , B가 듣지 않은 수업을 찾아보기

강사님이 차집합은 구글링을 해서 찾아보라고 하셔서 구글링해서 찾았다. 교집합은 &, 합집합은 |, 차집합은 - 이다.

 

먼저 샘플을 이렇게 주셨다. a 는 들었는데 b는 안들은 것들을 표시 해 주면 되니 차집합 -을 쓰면 될 것같다.

student_a = ['물리2','국어','수학1','음악','화학1','화학2','체육']
student_b = ['물리1','수학1','미술','화학2','체육']

전체 코드

student_a = ['물리2','국어','수학1','음악','화학1','화학2','체육']
student_b = ['물리1','수학1','미술','화학2','체육']

a_set = set(student_a) # 집합 자료형 set() 함수를 이용해 a_set 함수 선언
b_set = set(student_b) # 집합 자료형 set() 함수를 이용해 b_set 함수 선언

print(a_set - b_set) # a_set 와 b_set의 차집합을 출력해 준다.

실행 결과

생각보다 막 어렵진 않았다. 자바랑 다르게 코드가 되게 편리한거같다 자바는 진짜 어지럽던데..

 

1-12 f-string

scores = [
    {'name':'영수','score':70},
    {'name':'영희','score':65},
    {'name':'기찬','score':75},
    {'name':'희수','score':23},
    {'name':'서경','score':99},
    {'name':'미주','score':100},
    {'name':'병태','score':32}
]

for s in scores : #for 반복문 실행
    name = s['name']  # scores 의 'name' 을 name으로 선언
    score = str(s['score']) #scores 의 'score' 를 score 으로 선언 , 숫자형 + 문자열은 불가능하므로 문자열 str() 추가
    print(name + '의 점수는 '+score+'점입니다.') # name = 영수,영희 등등 출력, +score+ = 70,65점 등등 출력

f-string은 출력할 글자 앞에다 f를 붙히고 중괄호로 변수를 넣어주기만 하면 되서 위에 코드보다 훨씬 더 보기 편하다.

print(f'{name}의 점수는 {score}점입니다.') # f-string 은 앞에 f만 붙여주고 중괄호로 변수를 넣어주면 된다.

 

1-13 예외처리 구문

try- except 문은 에러가 있어도 건너뛰게 할 수 있는 문이다.

people = [
    {'name': 'bob', 'age': 20},
    {'name': 'carry', 'age': 38},
    {'name': 'john', 'age': 7},
    {'name': 'smith', 'age': 17},
    {'name': 'ben', 'age': 27},
    {'name': 'bobby'},
    {'name': 'red', 'age': 32},
    {'name': 'queen', 'age': 25}
]
for person in people: # 반복문 시작
    try:  # try 문 : 시도하라고 명령을 내림
        if person['age'] > 20:
            print(person['name'])
    except: # 만약에 에러가 나면 밑에 print를 출력
        print(person['name'] ,'에러입니다.')

실행 결과 (에러가 난 곳에 에러입니다. 라고 적혀있음) (bobby는 name은 있지만 age는 없기 때문에 에러 발생)

이 구문의 사용 예는 서버한테 콜을 보내거나 서버 쪽이 문제 같은 경우에 사용한다.

그러나 이 코드를 남용하면 서버는 돌아는 가는데 뭔가 이상해지고 무슨 에러가 나는지를 모르므로 가급적 안쓰는걸 추천한다. 나도 잘 안 쓸것 같다.. ㅋㅋㅋ

 

1-14 파일 불러오기

먼저 이전에 만들었던 파이썬 파일은 지우고 main_test.py 와 main_func.py 파이썬 파일을 만들어준다.

그 다음 main_func 파일에 테스트 용 코드를 적는다.

def say_hi():
    print('안녕!')

def say_hi_to(name):
    print(f"{name}님 안녕하세요")

 

그 다음 main.test.py에 가서 밑에 코드를 적는다.

밑에 코드는 다른 파일에 있는 함수들을 다 가져올 수 있다.

from 파일 이름 import *

*은 전부를 가져오는거고, 만약 위에 적혀있는 say_hi 함수만 가져오고 싶다면 이렇게 적으면 된다.

from main_func import say_hi

 

1-15 한줄의 마법

 

간단한 if 문을 만들어보았다.

여기서 if 문을 한줄로 나타낼 수 있다.

num = 3 # num = 숫자형 3으로 선언

if num % 2 == 0: # 만약 num을 2로 나눴을때 나머지가 0이라면
    result = '짝수'
else:            # 나머지가 1이라면
    result = '홀수'

    print(f"{num}은 {result}입니다.") #f-string 이용

훨씬 더 보기 편하다.

result = ('짝수' if num % 2 == 0 else '홀수') 
# result = '짝수'인데 만약 num을 2로 나눈 값이 0이 아니면 '홀수'이다.

for문도 간단하게 한줄로 만들 수 있다.

.append() : 리스트 마지막에 요소 추가 

append(item)는 리스트의 마지막에 인자로 전달된 아이템을 추가한다.

a_list = [1,3,2,5,1,2]

b_list=[] 

for a in a_list:
    b_list.append(a*2) # b_list에 a*2 를 추가

print(b_list)

이건 아직 지금 수준에서는 안쓰인다고 하신다. 

b_list = [a*2 for a in a_list] 
# a_list 안에 있는 a를 돌리는데 그때마다 a*2를 해라 그리고 리스트로 묶어라

 

1-16 map, filter, lambda 식

  • map 함수는 반복문과 비슷하다.
  • map 사용 시 인자로 2가지를 넣는다. 함수와 집합 형태(iterable) 객체이다.
  • map이 실행되면서 값이 차례로 변수에 적용된다.
people = [
    {'name': 'bob', 'age': 20},
    {'name': 'carry', 'age': 38},
    {'name': 'john', 'age': 7},
    {'name': 'smith', 'age': 17},
    {'name': 'ben', 'age': 27},
    {'name': 'bobby', 'age': 57},
    {'name': 'red', 'age': 32},
    {'name': 'queen', 'age': 25}
]

def check_adult(person):
    return '성인' if person['age'] > 20 else '청소년'

result = map(check_adult, people) # map= people을 하나하나 돌면서 check_adult에다가 넣어라.

print(list(result)) # 그 return 값을 모아서 리스트로 정렬

lambda 함수를 이용하면 위에 코드들을 더 보기 편하게 만들 수 있다.

lambda 함수는 일회성 함수, 간편 함수라고 생각하면 편할 것 같다.

people = [
    {'name': 'bob', 'age': 20},
    {'name': 'carry', 'age': 38},
    {'name': 'john', 'age': 7},
    {'name': 'smith', 'age': 17},
    {'name': 'ben', 'age': 27},
    {'name': 'bobby', 'age': 57},
    {'name': 'red', 'age': 32},
    {'name': 'queen', 'age': 25}
]

result = map(lambda person :('성인' if person['age'] > 20 else '청소년'), people)
# people을 하나씩 돌면서 person에다가 넣을건데 그 person을 가지고 if 문을 리턴해라

print(list(result)) # result 값을 list 형식으로 출력

filter 함수는 map 함수와 유사하지만 True인 것들만 뽑아준다.

people = [
    {'name': 'bob', 'age': 20},
    {'name': 'carry', 'age': 38},
    {'name': 'john', 'age': 7},
    {'name': 'smith', 'age': 17},
    {'name': 'ben', 'age': 27},
    {'name': 'bobby', 'age': 57},
    {'name': 'red', 'age': 32},
    {'name': 'queen', 'age': 25}
]

result = filter(lambda person: person['age'] > 20, people)
#people의 요소를 하나하나 person에다 넣고 person['age']가 20보다 큰 딕셔너리만 result에 저장

print(list(result)) # result 값을 list 형식으로 출력

갑자기 수준이 확 올라갔다 ㅋㅋㅋ 너무 어렵다.. 이해해보려고 한 두번 계속 뒤로 돌려가며 강의를 봤는데 너무 어렵다..

 

1-17 함수 심화

나중에 모르는 부분이 생겼을때 참고 할 수 있게 올려둔다..

두 번 정도 봤는데 이해가 되는 부분도 있고 안되는 부분도 있다. 

확실한 거는 코드를 봤을 때 왜 저렇게 출력이 되는지는 이해가 가는데 직접 짤 수가 있을지가 모르겠다..

 

1-18 클래스

강의를 보면서 이해를 하면서 차근차근 주석을 적었다.

class Monster(): # Monster 클래스 생성
    hp = 100     # hp을 100으로 선언
    alive = True # alive를 True로 선언

    def damage(self, attack):
        self.hp = self.hp - attack # 내 hp가 (self 함수) attack 만큼 줄어든다.
        if self.hp < 0 :           # 만약 self.hp가 0보다 작으면
            self.alive = False     # self.alive를 False 로 선언

    def status_check(self):
        if self.alive:            # self.alive 가 True 이면
            print('살았다')        # 살았다 출력
        else:                     # self.alive 가 False 이면
            print('죽었다')        # 죽었다 츨력

m1 = Monster()    # m1 = 인스턴스
m1.damage(150)    # m1의 데미지를 150을 준다.
m1.status_check() # m1 self.alive의 값이 True 인지 False 인지 확인 후 출력

m2= Monster()     # m2 =  인스턴스
m2.damage(90)     # m2의 데미지를 90을 준다.
m2.status_check() # m2 self.alive의 값이 True 인지 False 인지 확인 후 출력

ㅋㅋㅋ 너무 어렵다.. 정신이없다.. 시간 날때 복습해야겠다.. 오늘 알고리즘까지 들어야해서 너무 시간이 없다 ㅠㅠㅠ

 

-- 여기서부터 알고리즘 강의

1-1, 1-2 는 파이썬 설치, 파이참 설치를 했다.

 

1-3 파이참으로 코딩하기

sparta_algorithm 폴더를 만들고 폴더 안에 week_1 파일을 만들고 00_hello.py 파일을 만들었다.

언더바( _ ) 를 쓰는 이유는 컴퓨터는 기본적으로 특수문자를 싫어해서 띄어쓰기 같은 특수문자들을 표시 해 주고 싶을때 언더바( _ ) 를 쓴다.

 

1-4 알고리즘과 친해지기(1)

 

첫번째 문제.

다음과 같이 숫자로 이루어진 배열이 있을 떄 , 이 배열 내에서 가장 큰 수를 반환하시오.

{3,5,6,1,2,4}

 

강의에서는 두가지 방법으로 풀어주셨다.

첫번째 방법은 for 반복문을 두개쓰는 이중 반복문을 이용하셨고

두번째 방법은 지정 변수를 사용하셨다.

 

첫번째 방법

input = [3, 5, 6, 1, 2, 4]


def find_max_num(array):
    for num in array: # 반복문 실행
        for compare_num in array: # 이중 반복문 실행
            if num < compare_num: #만약 num이 compare_num 보다 작으면
                break  # 다음 넘버인 5로 넘어감
        else:          # for 문이 끝날 때까지 break 문이 한번도 나오지 않으면 실행
            return num # num을 반환

result = find_max_num(input)
print(result)

두번째 방법

input = [3, 5, 6, 1, 2, 4]


def find_max_num(array):
    max_sum = array[0] # array의 0번째 원소를 지정해서 넣는다.
    for num in array:  # 반복문 실행
        if num > max_sum: # 만약 num이 max_sum 보다 크다면
            max_sum = num # max_sum 은 num 값으로 변한다.

    return max_sum  # 반복문이 끝났다면 max_sum 값을 불러온다.


result = find_max_num(input)
print(result)

튜터님이 두시에 강의 해 주셨는데 강의 끝나고 몇번 더 보고 풀어보고 했다.

이해는 되나 키보드로 칠려니 너무 뇌정지가 온다.. 너무 어렵다.. 처음부터 이렇게 어려우면 어떡하지 ㅋㅋㅋㅋ

 

1-5 알고리즘과 친해지기(2)

 

1. 알파벳 빈도수 세기

 

코드스니펫(샘플)

def find_alphabet_occurrence_array(string):
    alphabet_occurrence_array = [0] * 26

    # 이 부분을 채워보세요!

    return alphabet_occurrence_array


print(find_alphabet_occurrence_array("hello my name is sparta"))

파이썬의 내장 함수 str.isalpha() 를 이용하면 해당 문자열이 알파벳인지 확인할 수 있다.

 

 

밑에 함수는 알파벳 별 빈도수를 저장하기 위한 길이가 26인 0으로 초기화 된 배열로 만드는 함수다.

alphabet_occurrence_array = [0] * 26

먼저 이 배열의 각 원소에 알파벳 마다 빈도수를 추가해줘야 한다. a 일때는 0번째 원소에 1을 추가하고, b 일때는 

1번째 원소에 1을 추가 해줘야 한다. 이를 위해서 아스키 코드를 사용해야한다. (컴퓨터는 0과 1밖에 모르기 때문에)

https://shaeod.tistory.com/228

 

ASCII Table - 아스키 코드표

(아스키코드를 알면 C/C++이나 Java 등으로 문자열 함수를 다루거나 파일 함수를 다룰때 도움이 됩니다.) 컴퓨터는 0과 1 숫자 밖에 모르기 때문에 문자도 숫자로 기억합니다. 이때, 어떤 숫자와 어

shaeod.tistory.com

문자를 아스키 코드로 변경 해주는 함수는 ord이다. 

 

이번 알고리즘 문제를 위한 코드들은 다 적었으니 이제 알고리즘을 풀어보자.

 

일단은 for 문을 이용해서 문자열을 돌아보자.

for number in string: # 반복문 실행 

그 다음 문자가 알파벳인지 확인을 해야하므로 if not 문과 isalpha() 문을 사용한다. (띄어쓰기가 있을 수 있으므로)

if not number.isalpha(): # 먼저 문자가 알파벳인지 확인을 해야하므로 if not 문과 isalpha() 문 사용

만약 알파벳이 아니면 continue 함수를 통해 다음 문자를 보도록 한다.

continue   # 알파벳이 아니면 건너뛴다.

이제 이 밑에부터는 number가 알파벳인 경우에만 실행이 된다.

이제 알파벳을 alphabet_occurrence_array 에 맞게 찾아서 넣어줘야한다.

예를 들면 number가 현재 b 일 경우

a = 0 , b = 1 c =2 등등등..으로 저장되기 때문에 b는 1번째 인덱스로 업데이트를 해 줘야한다.

array_number = ord(number) - ord('a')

.ord에 number를 넣고 a의 ord 값을 빼면 된다.

예를 들어 number가 a라고 치면 ord에 의해 97이 됐으므로 ord(number) = 97 , ord('a') = 97 

97-97 = 0이 되므로 이게 배열의 인덱스 값이 된다. 이 값을 array_number 란 변수에 지정 해 준다.

 

alphabet_occurrence_array 의 [array_number] 값을 += 1 하나씩 증가 시켜주면 된다.

alphabet_occurrence_array[array_number] += 1

for문이 끝난 이후에 return을 이용해서 alphabet_occurrence_array 를 반납해 주면 된다.

return alphabet_occurrence_array

실행 결과

 

오늘은 여기까지 밖에 못했다.

무작정 강의를 보고 바로 넘어가는건 너무 아닌 것 같아, 강의에 있는 내용들을 이해하려고 계속 강의 무한재생하고.. 

코드를 키보드로 타이핑 해 보느라 시간을 다썼다. 그런데도 아직 이해를 다 하진 못했다.

이 뒤에 알파벳 빈도수 세기 알고리즘도 해야하는데.. 쉽지않다 ㅋㅋㅋ

내일 오후 두시 창민 튜터님 강의를 보면서 또 연습해야겠다.. ㅠㅠ 점점 어려워진다