3일에 걸친 실시간 알고리즘 수업이 끝났다. 오늘은 stack, que 자료구조와 재귀함수....를 배웠는데 대충 개념만 알았을 뿐 정확히 이해한 것 같지는 않다. 그중에서도 stack, que는 대학교에서 1학기 동안 배우는 과정이라고 한다. (라는 사실에 위안을 얻는 중...)
원래 stack과 que 전에 이진탐색과 재귀함수 강의를 들을 차례였지만,
아직은 깜냥이 아니다 싶어 알고리즘 기초 공부를 위한 책(모두를 위한 알고리즘 with 파이썬)을 샀다. 이 책을 보면서 알고리즘을 풀기 위한 사고 흐름부터 잡아야 될 것 같다.
(유치원생한테 중고등학교 교재 보여주면 이해를 하겠냐
다음 주 월요일에는 팀원들과 프로젝트를 대비한 git과 gitHub 스터디를 하기로 해서, 인프런 강의(모두의 깃 & 깃허브)로 예습했다.
내일배움캠프 영상 면접 때 '자기주도학습이란 무엇이라고 생각하는가?'라는 질문이 있다. 자기주도학습이 결국 내가 따로 돈 내고 강의 사고 책 사고 구글링해서 공부하는 거였다니...ㅎ.ㅎ 스파르타에서 제공하는 강의만으로도 충분하신 분들은 모르겠지만.. 나 같은 사람이 절반은 넘을 거라고 생각한다. (내일배움캠프 신청하실 분들은 꼭 참고하시길 바란다.)
저녁에는 매주 금요일 스파르타에서 해주는 실시간 CS 강의를 들었다. 오늘의 주제는 HTTP/HTTPS(통신 흐름, TLS/SSL 등)였다.
구구단, 주사위 2개의 합을 구하는 문제처럼 중첩 for문을 활용하면 된다.
def match_partner(a):
# a라는 리스트의 길이
n = len(a)
# 0번째 인덱스부터 마지막에서 2번째 사람까지 호출
for i in range(0, n-1):
# 1번째 인덱스부터 마지막 사람까지 호출
for j in range(i+1, n):
# 정해진 양식대로 출력
print(a[i], '-', a[j])
a = ["Tom", "Jerry", "Mike", "Ann"]
print(match_partner(a))
* 오늘의 옥의 티
이 코드에는 또 하나의 옥의 티가 숨어있다. 마지막 값이 None 으로 반환된다는 점이다.
함수 내부에서도 print 함수를 사용했는데, 함수 바깥에서 한번 더 print를 했기 때문이다.
이유를 찾아보니 함수 자체에 return하는 값이 설정되어 있지 않기 때문이라고 한다.
함수 내부의 print()를 삭제하고 함수 외부에서 print로 출력하면 된다.
Q. 1부터 n까지 연속한 정수의 곱을 구하는 알고리즘을 만들어 보세요.
def fact(n):
# 종료 조건
if n =< 1:
return 1
return n * fact(n-1)
print(fact(1)) # 1!=1
print(fact(5)) # 5!=120
재귀함수를 작성할 때는 항상 종료조건을 만들어줘야 한다. (여기서는 n이 1 이하일 때 1 반환)
그렇지 않으면 무한히 반복되어 stackoverflow(지정한 스택 메모리 사이즈보다 더 많은 스택 메모리를 사용하게 되어 에러가 발생하는 상황)를 만들 수 있다.
fact(5)가 동작하는 순서를 살펴보면 다음과 같이 호출된다.
n=5
5 * fact(4)
fact(4) 부분에 그 다음 함수가 호출되고
n=4
4 * fact(3)
fact(3) 부분에 그 다음 함수가 호출되고...
n=3
3 * fact(2)
n=2
2 * fact(1)
이런 식으로 진행되어 결과적으로 fact(5) = 5*4*3*2*1 와 같은 값이 된다.