[내일배움캠프] 11/9 수요일 TIL 회고록
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
실행 결과
오늘은 여기까지 밖에 못했다.
무작정 강의를 보고 바로 넘어가는건 너무 아닌 것 같아, 강의에 있는 내용들을 이해하려고 계속 강의 무한재생하고..
코드를 키보드로 타이핑 해 보느라 시간을 다썼다. 그런데도 아직 이해를 다 하진 못했다.
이 뒤에 알파벳 빈도수 세기 알고리즘도 해야하는데.. 쉽지않다 ㅋㅋㅋ
내일 오후 두시 창민 튜터님 강의를 보면서 또 연습해야겠다.. ㅠㅠ 점점 어려워진다