2. 강의자 소개
2020 AL林 정기 스터디 2
이름 최문기
소속 서울시립대 컴퓨터과학부(16학번)
핸들 iknoom1107(BOJ) IKnoom(Codeforces) IKnoom(AtCoder)
ICPC 팀 (팀명 미정)
- 김정현, 오규민, 최문기
3. 스터디 공지(~3월 30일)
2020 AL林 정기 스터디 3
문제 풀이 스터디
그룹을 나누어 정규 세미나의 연습 문제를 함께 풀어보고 풀이를 공유
https://www.notion.so/AL-413334b2632447789e58c1daa64fa009
대회 스터디
ACM-ICPC, SCPC와 같은 알고리즘 대회를 준비
https://www.notion.so/AL-2364ec7bc77a49ffbd83abeaf484e7c2
4. 前 몇가지 선행 지식
2020 AL林 정기 스터디 4
파이썬 프로그래밍 : 반복문, 조건문, 배열
수학 : 순열, 조합, 수열의 일반항과 점화식
5. 今 오늘 할 것
2020 AL林 정기 스터디 5
• 시간복잡도, 공간복잡도
• 알고리즘을 분석하여 더 효율적인 알고리즘이 무엇인지 알기
• 알고리즘이 한정된 자원 내에서 실행 가능한지 예측하기
• 완전 탐색
• 완전 탐색과 효율적인 문제 해결 방법 비교해보기
• 다양한 상황에서 어떻게 완전 탐색을 하는지 간단하게 살펴보기
6. 後 세미나를 듣고 나서
2020 AL林 정기 스터디 6
문제를 풀어봅시다. 꼭 풀어봅시다.
발표자가 생각하는 문제를 푸는 능력 : 아이디어, 구현력, 배경지식
8. 알고리즘 분석의 필요성
2020 AL林 정기 스터디 8
우리는 앞으로 여러 알고리즘을 설계할 것입니다.
여러 알고리즘 중 어떤 알고리즘이 더 좋은 알고리즘일까요?
그리고 한정된 자원 내에서 알고리즘이 수행 가능할까요?
설계
분석
9. 1. 더 좋은 알고리즘
2020 AL林 정기 스터디 9
여러 알고리즘 중 어떤 알고리즘이 더 좋은 알고리즘일까요?
✓ 알고리즘을 평가하는 두가지 기준
1. 알고리즘의 수행 시간
2. 알고리즘의 필요 메모리
10. 알고리즘의 수행 시간
2020 AL林 정기 스터디 10
n = 5
arr = [1, 2, 3, 4, 5]
sum = 0
for i in range(n):
sum = sum + arr[i]
print(sum) # 15
입력의 크기가 n일 때, n번의 연산
11. 알고리즘의 수행 시간
2020 AL林 정기 스터디 11
입력의 크기가 n일 때, n(n–1)/2번의 연산
n = 5
arr = [1, 3, 5, 7, 9]
sum = 0
for i in range(n - 1):
for j in range(i + 1, n):
sum = sum + i * j
print(sum) # 35
12. 알고리즘의 수행 시간
2020 AL林 정기 스터디 12
입력의 크기가 n일 때, n(n+1)(n+2)/6번의 연산
n = 5
arr = [2, 4, 6, 8, 10]
sum = 0
for i in range(n):
for j in range(i, n):
for k in range(i, j + 1):
sum = sum + arr[k]
print(sum) # 210
13. 빅오 표기법(Big-O notation)
2020 AL林 정기 스터디 13
✓ 빅오 표기법(Big-O notation)
- 시간복잡도(문제를 해결하는데 걸리는 시간과 입력의 함수 관계)를 나타내는 방법.
- 𝑂 𝑓(𝑛) 은 최고차항의 차수가 𝑓(𝑛)과 일치하거나 더 작은 함수의 집합을 나타낸다.
“수행시간의 상한”
“아무리 오래걸린다 하더라도”
19. 알고리즘의 필요 메모리
2020 AL林 정기 스터디 19
공간복잡도(문제를 해결하는데 필요한 메모리와 입력의 함수 관계) 또한
시간복잡도와 동일하게 빅오 표기법으로 나타냅니다.
n = 5
arr = [1, 2, 3, 4, 5]
sum = 0
for i in range(n):
sum = sum + arr[i]
print(sum) # 15
→ 공간복잡도 O(n)
20. 2. 한정된 자원에서 짐작하기
2020 AL林 정기 스터디 20
한정된 자원 내에서 알고리즘이 수행 가능할까요?
21. 시간 제한 – 108 룰
2020 AL林 정기 스터디 21
✓ 108 룰
컴퓨터는 1초에 간단한 동작을 대략 108번 할 수 있다.
* 어림짐작이며 완전히 정확하지는 않습니다.
24. 시간 제한 – 108 룰
2020 AL林 정기 스터디 24
N의 크기 시간 제한 시간 복잡도
8 1초 𝑂 𝑁 , 𝑂 𝑁2 , 𝑂 𝑁3 , 𝑂 2𝑁 , 𝑂(𝑁!)
25 1초 𝑂 𝑁 , 𝑂 𝑁2
, 𝑂 𝑁3
, 𝑂 2𝑁
300 1초 𝑂 𝑁 , 𝑂 𝑁2
, 𝑂 𝑁3
5000 1초 𝑂 𝑁 , 𝑂 𝑁2
1000000 1초 𝑂 𝑁
입력의 제한과 시간 제한이 주어지면 허용되는 시간복잡도를 예측할 수 있다.
25. 메모리 제한
2020 AL林 정기 스터디 25
프로그램이 점유하는 메모리는 보통 계산하기 쉽습니다.
예를 들어 C언어에서 int 정수 하나는 4byte → int 106개의 배열은 4MB
따라서 분석하기 쉽기도하고 실제로 문제가 되는 경우도 적은 편입니다.
알고리즘 대회나 온라인 저지에서도 메모리 제한이 넉넉한 편입니다.
(가끔 32MB나 8MB로 적게 주어지기도 합니다.)
26. 더 공부해볼 것
2020 AL林 정기 스터디 26
왜 최악의 경우(빅오 표기법)만 분석하나요?
- 알고리즘의 효율성이 문제가 되는 것은 입력 크기가 충분히 클 때입니다. 입력이 작으면 알고리즘의
효율성에 상관없이 금방 결과를 확인할 수 있습니다. 최악의 경우를 개선하는 것이 알고리즘 문제해
결의 주 관심사입니다.
- 최선의 경우와 평균적 경우를 표현하는 방법도 있습니다.(오메가 표기법, 세타 표기법) 오메가 표기
법은 아예 쓰지 않는다고 보면 되고 세타 표기법은 확률적 알고리즘을 분석할 때 쓰기도 합니다. 하
지만 평균적인 경우라는게 일반적으로 분석이 어렵고 객관적인 평가도 어려워서 분석하지 않는 편입
니다.
27. 더 공부해볼 것
2020 AL林 정기 스터디 27
빅오 표기법(점근 표기법)의 엄밀한 수학적 정의
- https://en.wikipedia.org/wiki/Big_O_notation
- https://m.blog.naver.com/kks227/220769859177
시간복잡도가 애매하면 어떡하죠? ex) O(n2), n < 2만, 시간제한 1초
- 테스트를 해봐야합니다. 백준에 제출하고 기도합시다.
시간복잡도 분석이 이정도로 끝인가요?
- 아닙니다. 알고리즘의 수행시간을 지배하는 것은 반복된 작업입니다. 반복된 작업이 수행될 수 있는 방
법은 반복문 또는 재귀호출이지요. 반복문은 위에서 한 것과 같이 단순한 산술로 끝나지만 재귀호출
은 그렇지 않습니다. 4주차 재귀함수, 5주차 분할정복에서 연습해봅시다.
30. [BOJ 3040번] 백설 공주와 일곱 난쟁이
2020 AL林 정기 스터디 30
9개의 정수 중에서 합이 100이 되는 7개의 정수를 구한다.
→ 9개 중에서 2개를 제외했을 때 나머지 정수의 합이 100
→ 2개를 제외하는 모든 경우의 수는 9C2 = 36가지
→ 36가지 경우를 완전 탐색
31. [BOJ 3040번] 백설 공주와 일곱 난쟁이
2020 AL林 정기 스터디 31
arr = []
sum = 0
for i in range(9):
x = int(input())
sum += x
arr.append(x)
for i in range(9):
for j in range(9):
if i == j:
continue
if sum - arr[i] - arr[j] == 100:
arr[i] = -1
arr[j] = -1
for i in range(9):
if arr[i] != -1:
print(arr[i])
http://boj.kr/e20a7eef8f0241c394e510119e9ec2d9
42. 정리
2020 AL林 정기 스터디 42
• 알고리즘 분석(시간복잡도, 공간복잡도)
• 알고리즘이 효율적인지 평가하는 두가지 기준은 실행 시간과 메모리이다.
• 단순한 산술로 알고리즘의 시간복잡도를 구해보았다.
• 빅표 표기법(Big-O notation)을 통해서 시간복잡도를 나타내었다.
• 한정된 자원과 입력의 크기를 보고 주어진 알고리즘이 실행가능한지 예측하였다.
43. 정리
2020 AL林 정기 스터디 43
• 완전 탐색
• 완전 탐색은 답이 될 수 있는 모든 경우를 탐색하는 방법이다.
• 완전탐색은 비효율적인 방법일 수도 있다.
• 완전탐색(모든 경우의 수를 탐색한다는 아이디어)을 구현하는 것 만으로도 상당히
어려울 수도 있다. 상황에 따라 구현하는 방법을 더 알아야한다.
44. 정리
2020 AL林 정기 스터디 44
알고리즘을 구현하는 방법
(4주차) 재귀 함수
(6주차, 7주차) 자료구조
(8주차, 9주차) DFS, BFS
효율적인 알고리즘을 설계하는 방법
(3주차) 그리디 알고리즘
(5주차) 분할 정복
(10주차) 동적 프로그래밍
46. 연습 문제
2020 AL林 정기 스터디 46
완전 탐색
기본 문제
3040 백설 공주와 일곱 난쟁이
19532 수학은 비대면강의입니다
2798 블랙잭
연습 문제
(문제풀이 스터디 발표)
2231 분해합
10448 유레카 이론
1198 삼각형으로 자르기
1254 팰린드롬 만들기
2503 숫자 야구
구현하는 연습을 꼭 합시다.
47. 연습 문제
2020 AL林 정기 스터디 47
완전 탐색
도전 문제
2615 오목
17085 십자가 2개 놓기
1182 부분수열의 합
구현하는 연습을 꼭 합시다.