SlideShare a Scribd company logo
1 of 89
Download to read offline
서울시립대 알고리즘 소모임
알고리즘 문제해결 테크닉
겨울방학 3주차
강의자 소개
2020 AL林 정기 스터디 2
이름 최문기
소속 서울시립대 컴퓨터과학부(16학번)
핸들 iknoom1107(BOJ) IKnoom(Codeforces) IKnoom(AtCoder)
ICPC 팀 ManManChiAnunTeam (2020 Seoul Regional 본선 진출 및 28위)
- 김정현, 최문기, 최연웅
오늘 할 것
2020 AL林 정기 스터디 3
원래는 비트마스크만 발표하려고 했으나 너무 짧을 것 같아서 이것저것 내가 하고싶은거 모아서 발표하기
• 비트마스크
• 누적 합
• 최대 부분 합
• 스위핑 기법
• 투 포인터
2020 AL林 정기 스터디 4
비트마스크
비트마스크
2020 AL林 정기 스터디 5
어떤 상태를 비트로 표현하여 저장하는 테크닉입니다.
그러면
① 연산이 빠르고
② 메모리가 적게 듭니다.
활용예 ① : 집합의 표현
2020 AL林 정기 스터디 6
1부터 8까지의 수가 있습니다.
그 중에서 몇 개의 수를 선택한 부분 집합를 비트로 표현해봅시다.
8 7 6 5 4 3 2 1
활용예 ① : 집합의 표현
2020 AL林 정기 스터디 7
00000000(2) = 0
8 7 6 5 4 3 2 1
활용예 ① : 집합의 표현
2020 AL林 정기 스터디 8
00000001(2) = 1
8 7 6 5 4 3 2 1
활용예 ① : 집합의 표현
2020 AL林 정기 스터디 9
00001001(2) = 9
8 7 6 5 4 3 2 1
활용예 ① : 집합의 표현
2020 AL林 정기 스터디 10
00011001(2) = 25
8 7 6 5 4 3 2 1
활용예 ① : 집합의 표현
2020 AL林 정기 스터디 11
10011001(2) = 153
8 7 6 5 4 3 2 1
활용예 ① : 집합의 표현
2020 AL林 정기 스터디 12
11111111(2) = 255
8 7 6 5 4 3 2 1
활용예 ① : 집합의 표현
2020 AL林 정기 스터디 13
이렇게 집합을 비트로 표현하면 C에서
int는 32비트이므로 최대 집합의 크기가 32이고
long long은 64비트이므로 최대 집합의 크기가 64입니다.
집합이 작은 경우 비트로 표현하여 저장하면 효율적입니다.
활용예 ② : 슬라이딩 퍼즐
2020 AL林 정기 스터디 14
이 슬라이딩 퍼즐도 비트마스킹으로 표현이 가능합니다.
퍼즐의 상태가 8 이하의 수 9개의 순열로 표현되기 때문이지요.
활용예 ② : 슬라이딩 퍼즐
2020 AL林 정기 스터디 15
왼쪽 슬라이딩 퍼즐은 “806547231”로 표현할 수 있습니다.
비트마스킹으로 줄여봅시다.
0
8 = 1000(2)
0 = 0000(2)
6 = 0110(2)
5 = 0101(2)
4 = 0100(2)
7 = 0111(2)
2 = 0010(2)
3 = 0011(2)
1 = 0001(2)
활용예 ② : 슬라이딩 퍼즐
2020 AL林 정기 스터디 16
“806547231”
= 1000 0000 0110 0101 0100 0111 0010 0011 0001(2)
= 34465935921
0
활용예 ② : 슬라이딩 퍼즐
2020 AL林 정기 스터디 17
15-퍼즐(4×4퍼즐)까지는 long long으로 표현이 가능합니다.
4비트의 양의 정수 16개로 표현 가능하기 때문이지요.
꼭 이렇게 해서 풀어야하는 건 아닙니다.
저는 백준에 있는 슬라이딩 퍼즐 문제 string으로 저장해서 풀었습니다.
비트마스킹을 하면 메모리나 시간이 더 효율적이겠지요.
연습문제 : BOJ 11723번 집합
2020 AL林 정기 스터디 18
비트마스킹을 활용하여 집합의 상태를 표현하는 기본 문제입니다.
<<, &, | 와 같은 비트 연산자를 활용해봅시다.
소스 코드 : http://boj.kr/656f225451174337b55f53049181168f
연습문제 : BOJ 11723번 집합
2020 AL林 정기 스터디 19
if query[0] == "add":
x = int(query[1]) - 1
SET |= (1 << x)
elif query[0] == "remove":
x = int(query[1]) - 1
if SET & (1 << x):
SET -= (1 << x)
# 또는 SET &= ~(1 << x)
elif query[0] == "toggle":
x = int(query[1]) - 1
SET ^= (1 << x)
연습문제 : BOJ 11723번 집합
2020 AL林 정기 스터디 20
elif query[0] == "check":
x = int(query[1]) - 1
if SET & (1 << x):
print(1)
else:
print(0)
elif query[0] == "all":
SET = (1 << 20) - 1
elif query[0] == "empty":
SET = 0
연습문제
2020 AL林 정기 스터디 21
BOJ 17453 두 개의 문 : 비트가 많아지면 분할하거나 std::bitset을 씁니다.
BOJ 2098 외판원 순회 : 방문한 마을을 비트로 표현 + DP
BOJ 1194 달이 차오른다, 가자. : 가진 열쇠를 비트로 표현 + BFS
BOJ 1525 퍼즐 : 슬라이딩 퍼즐의 상태를 비트로 표현 + BFS
비트마스킹 : 마무리..
2020 AL林 정기 스터디 22
- 알고리즘 문제해결 전략(종만북)을 575페이지를 보면 집합의 표현에 대한 더 자세
한 내용이 있습니다. 좋은 테크닉이 많지만 전부 알 필요는 없다고 생각됩니다.
- 비트마스킹은 보통 DP와 같이 활용되거나 상태공간을 BFS, DFS와 같은 탐색 알고
리즘을 써서 탐색할 때에도 활용됩니다. 보통 이런 경우에 상태에 어떤 값을 연관시
켜야하기 때문이지요.
2020 AL林 정기 스터디 23
누적 합
누적 합
2020 AL林 정기 스터디 24
부분합을 빠르게 구하는 테크닉입니다.
전처리 : O(N)
부분합을 구하는 쿼리 : O(1)
누적 합
2020 AL林 정기 스터디 25
a부터 b까지(a ≦ b)의 부분합을 구하는 것은
0부터 b까지의 부분합에서
0부터 a – 1까지의 부분합을 빼면 됩니다.
෍
𝑖=𝑎
𝑏
𝐴𝑖 = ෍
𝑖=0
𝑏
𝐴𝑖 − ෍
𝑖=0
𝑎−1
𝐴𝑖
누적 합
2020 AL林 정기 스터디 26
0부터 i까지의 합을 저장하는 배열 prefixSum을 만듭시다. -> O(N)
i 0 1 2 3 4 5 6 7
A 1 4 3 5 2 1 8 2
prefixSum 1 5 8 13 15 16 24 26
누적 합
2020 AL林 정기 스터디 27
이제 3부터 5까지의 구간합을 구해봅시다.
A[3] + A[4] + A[5]
= prefixSum[5] – prefixSum[2] = 16 – 8 = 8
i 0 1 2 3 4 5 6 7
A 1 4 3 5 2 1 8 2
prefixSum 1 5 8 13 15 16 24 26
연습문제
2020 AL林 정기 스터디 28
BOJ 11659 구간 합 구하기 4 : 기본 문제입니다.
BOJ 11660 구간 합 구하기 5 : 차원을 늘려봅시다.
누적 합 : 마무리..
2020 AL林 정기 스터디 29
- 부분합을 구하면서 배열의 값의 갱신이 일어나는 경우가 있습니다. 이런 경우에 누적
합은 갱신이 느려서 효율적으로 처리하기 위해서 세그먼트 트리나 펜윅 트리를 씁니
다.
- 이게 꼭 합(sum)이 아니어도 다른 연산에도 활용이 가능합니다. 예를 들어 Xor도
가능하겠지요.
2020 AL林 정기 스터디 30
최대 부분합
최대 부분합
2020 AL林 정기 스터디 31
이번에는 최대 부분합을 구해봅시다.
방금 누적 합을 응용하면 O(N^2)에 가능하겠지요?
prefixSum을 구해놓으면 a부터 b까지의 부분합은 O(1)에 구할 수 있고
[a, b] 구간의 수가 N(N-1)/2개이기 때문입니다.
최대 부분합
2020 AL林 정기 스터디 32
하지만 최대 부분합은 O(N)에 가능합니다. 구해봅시다.
maxSum[i] : A[i]를 가장 오른쪽 끝으로 가지는 최대 부분합
i 0 1 2 3 4 5 6 7
A 3 4 -3 10 -99 5 3 -1
maxSum
최대 부분합
2020 AL林 정기 스터디 33
i 0 1 2 3 4 5 6 7
A 3 4 -3 10 -99 5 3 -1
maxSum 3
i 0 1 2 3 4 5 6 7
A 3 4 -3 10 -99 5 3 -1
maxSum 3 7
최대 부분합
2020 AL林 정기 스터디 34
i 0 1 2 3 4 5 6 7
A 3 4 -3 10 -99 5 3 -1
maxSum 3 7 4
i 0 1 2 3 4 5 6 7
A 3 4 -3 10 -99 5 3 -1
maxSum 3 7 4 14
최대 부분합
2020 AL林 정기 스터디 35
i 0 1 2 3 4 5 6 7
A 3 4 -3 10 -99 5 3 -1
maxSum 3 7 4 14 -85
i 0 1 2 3 4 5 6 7
A 3 4 -3 10 -99 5 3 -1
maxSum 3 7 4 14 -85 5
최대 부분합
2020 AL林 정기 스터디 36
i 0 1 2 3 4 5 6 7
A 3 4 -3 10 -99 5 3 -1
maxSum 3 7 4 14 -85 5 8
i 0 1 2 3 4 5 6 7
A 3 4 -3 10 -99 5 3 -1
maxSum 3 7 4 14 -85 5 8 7
최대 부분합
2020 AL林 정기 스터디 37
maxSum[i] : A[i]를 가장 오른쪽 끝으로 가지는 최대 부분합
그럼 다음 점화식이 성립합니다.
maxSum[i] = max(maxSum[i – 1], 0) + A[i]
연습문제 : BOJ 1912 연속합
2020 AL林 정기 스터디 38
소스코드 : http://boj.kr/c31fcf4a82344dbdb84de73c845c7585
maxSum = 0
for i in range(N):
maxSum = max(maxSum, 0) + A[i]
answer = max(answer, maxSum)
최대 부분합 : 마무리..
2020 AL林 정기 스터디 39
- 이걸 누가 이름도 지어놨습니다. 카데인 알고리즘이라고 합니다.
최대 부분합 : 마무리..
2020 AL林 정기 스터디 40
- 최대 부분합을 구하는건 O(N)에 가능하지만 이게 구간쿼리로 들어오거나 갱신이 있
으면 처음 세그트리를 구축하고 나서 분할정복으로 쿼리를 O(logN)으로 처리하는
방법이 있습니다. 이 세그먼트 트리가 상당히 더럽고 복잡하고 구현하기 어렵습니다.
2019 ICPC 본선에 나온 적이 있지요.
2020 AL林 정기 스터디 41
스위핑
스위핑 기법
2020 AL林 정기 스터디 42
1. 어떤 기준으로 정렬하고
2. 순서대로 훑습니다.
바로 문제를 봅시다.
활용예 ① : BOJ 2170 선긋기
2020 AL林 정기 스터디 43
선을 그을 때에는 이미 선이 있는 위치에 겹쳐서 그릴 수도 있는데,
여러 번 그은 곳과 한 번 그은 곳의 차이를 구별할 수 없다고 하자.
이와 같은 식으로 선을 그었을 때, 그려진 선(들)의 총 길이를 구하는 프로그램을 작성하시오.
예제 입력
4
1 3
2 5
3 5
6 7
예제 출력
5
활용예 ① : BOJ 2170 선긋기
2020 AL林 정기 스터디 44
1. 시작점 기준으로 정렬합니다.
2. 정렬한 순서대로 구간을 봅시다.
이전까지 그은 선과 이어지면 합칩니다.
그게 아니면 끊습니다.
활용예 ① : BOJ 2170 선긋기
2020 AL林 정기 스터디 45
예제 입력
4
1 3
2 5
3 5
6 7
s = 1
e = 3
활용예 ① : BOJ 2170 선긋기
2020 AL林 정기 스터디 46
예제 입력
4
1 3
2 5
3 5
6 7
이전까지 그은 선과 이어지면 합칩니다.
s = 1
e = 3
활용예 ① : BOJ 2170 선긋기
2020 AL林 정기 스터디 47
예제 입력
4
1 3
2 5
3 5
6 7
이전까지 그은 선과 이어지면 합칩니다.
s = 1
e = 5
활용예 ① : BOJ 2170 선긋기
2020 AL林 정기 스터디 48
예제 입력
4
1 3
2 5
3 5
6 7
이전까지 그은 선과 이어지면 합칩니다.
s = 1
e = 5
활용예 ① : BOJ 2170 선긋기
2020 AL林 정기 스터디 49
예제 입력
4
1 3
2 5
3 5
6 7
이전까지 그은 선과 이어지면 합칩니다.
s = 1
e = 5
활용예 ① : BOJ 2170 선긋기
2020 AL林 정기 스터디 50
예제 입력
4
1 3
2 5
3 5
6 7 그게 아니면 끊습니다.
s = 6
e = 7
활용예 ① : BOJ 2170 선긋기
2020 AL林 정기 스터디 51
예제 입력
4
1 3
2 5
3 5
6 7 그게 아니면 끊습니다.
s = 6
e = 7
활용예 ① : BOJ 2170 선긋기
2020 AL林 정기 스터디 52
# 정렬
lines.sort()
# 스위핑
s, e = lines[0]
sumLength = 0
for s_i, e_i in lines[1:]:
if e < s_i:
sumLength += e - s
s, e = s_i, e_i
else:
e = max(e, e_i)
sumLength += e - s
# 출력
print(sumLength)
소스코드 : http://boj.kr/ede76a53e51042a2b61367e289fa4186
활용예 ② : BOJ 1689 겹치는 선분
2020 AL林 정기 스터디 53
1차원 좌표계 위에 선분 N개가 있다.
선분이 최대로 겹쳐있는 부분의 겹친 선분의 개수를 구해보자.
선분의 끝 점에서 겹치는 것은 겹치는 것으로 세지 않는다.
예제 입력
11
1 2
3 6
7 8
10 11
13 16
0 5
5 6
2 5
6 10
9 14
12 15
예제 출력
3
활용예 ② : BOJ 1689 겹치는 선분
2020 AL林 정기 스터디 54
시작점은 +1, 끝점은 -1을 매깁시다.
활용예 ② : BOJ 1689 겹치는 선분
2020 AL林 정기 스터디 55
이제 시작점, 끝점만 보면서 스위핑을 해봅시다.
시작점과 끝점은 2N개 밖에 없지요.
+1
+1
+1
+1 +1
-1
-1
-1
-1
-1
활용예 ② : BOJ 1689 겹치는 선분
2020 AL林 정기 스터디 56
+1
+1
+1
+1 +1
-1
-1
-1
-1
겹치는 선분 = 1개
-1
활용예 ② : BOJ 1689 겹치는 선분
2020 AL林 정기 스터디 57
+1
+1
+1
+1 +1
-1
-1
-1
-1
겹치는 선분 = 2개
-1
활용예 ② : BOJ 1689 겹치는 선분
2020 AL林 정기 스터디 58
+1
+1
+1
+1 +1
-1
-1
-1
-1
겹치는 선분 = 3개
-1
활용예 ② : BOJ 1689 겹치는 선분
2020 AL林 정기 스터디 59
+1
+1
+1
+1 +1
-1
-1
-1
-1
겹치는 선분 = 2개
-1
활용예 ② : BOJ 1689 겹치는 선분
2020 AL林 정기 스터디 60
+1
+1
+1
+1 +1
-1
-1
-1
-1
겹치는 선분 = 3개
-1
활용예 ② : BOJ 1689 겹치는 선분
2020 AL林 정기 스터디 61
+1
+1
+1
+1 +1
-1
-1
-1
-1
겹치는 선분 = 4개
-1
활용예 ② : BOJ 1689 겹치는 선분
2020 AL林 정기 스터디 62
+1
+1
+1
+1 +1
-1
-1
-1
-1
겹치는 선분 = 3개
-1
활용예 ② : BOJ 1689 겹치는 선분
2020 AL林 정기 스터디 63
+1
+1
+1
+1 +1
-1
-1
-1
-1
겹치는 선분 = 2개
-1
활용예 ② : BOJ 1689 겹치는 선분
2020 AL林 정기 스터디 64
+1
+1
+1
+1 +1
-1
-1
-1
-1
겹치는 선분 = 1개
-1
활용예 ② : BOJ 1689 겹치는 선분
2020 AL林 정기 스터디 65
+1
+1
+1
+1 +1
-1
-1
-1
-1
겹치는 선분 = 0개
-1
활용예 ② : BOJ 1689 겹치는 선분
2020 AL林 정기 스터디 66
# 시작점과 끝점만 넣습니다.
points = []
for s_i, e_i in lines:
points.append((s_i, 1))
points.append((e_i, -1))
# 정렬
points.sort()
# 스위핑
lineCnt = 0
maxCnt = 0
for x, diff in points:
lineCnt += diff
maxCnt = max(maxCnt, lineCnt)
# 출력
print(maxCnt)
소스코드 : http://boj.kr/d54636fd209e451f9604ad0a5ca7663e
활용예 ② : BOJ 1689 겹치는 선분
2020 AL林 정기 스터디 67
시작점과 끝점만 넣고 스위핑하는 테크닉은
이렇게 구간 쿼리를 한번에 갱신해버리거나
활용예 ② : BOJ 1689 겹치는 선분
2020 AL林 정기 스터디 68
시작점과 끝점만 넣고 스위핑하는 테크닉은
이렇게 여러 직사각형의 면적합을 구할 때도 사용할 수도 있습니다.
스위핑 기법 : 마무리..
2020 AL林 정기 스터디 69
- 스위핑으로 해결할 수 있는 문제는 정말 많고 이게 무슨 알고리즘이 아니라 그냥 정
렬하고 훑는거라 어디에 가져다가 붙여도 틀렸다고 하기 어렵고 그렇습니다..
- 다만 스위핑 기법으로 해결할 수 있는 어려운 문제 중에 풀이 방법이 유명한 문제들
이 몇 개 있습니다. 대표적으로 가장 가까운 두 점(스위핑 + BST), 2차 평면에서의
직사각형의 면적(스위핑 + 세그먼트 트리) 등등
- 선분을 시계방향으로 돌리면서 훑는 스위핑 기법도 있습니다. 기하 관련 알고리즘에
서 씁니다. ex) 컨벡스 헐
스위핑 기법 : 마무리..
2020 AL林 정기 스터디 70
스위핑 관련 tutorials & 문제
- https://www.topcoder.com/community/competitive-programming/tutorials/line-sweep-algorithms/
- https://codeforces.com/blog/entry/20377
- https://m.blog.naver.com/kks227/220907708368
2020 AL林 정기 스터디 71
투 포인터
투 포인터
2020 AL林 정기 스터디 72
배열의 원소를 가리키는 2개의 포인터를 이용하는 기법을 말합니다.
이거도 바로 예시를 봅시다.
활용예 ① : BOJ 2003 수들의 합 2
2020 AL林 정기 스터디 73
수열 A의 부분합이 M이 되는 경우의 수를 구하는 프로그램을 작성하시오.
수열 A의 각 원소는 자연수이다.
예) M = 5, A = {1, 2, 3, 4, 2, 5, 3, 1, 1, 2}이면 답은 3
예제 입력
10 5
1 2 3 4 2 5 3 1 1 2
예제 출력
3
활용예 ① : BOJ 2003 수들의 합 2
2020 AL林 정기 스터디 74
부분합을 모두 탐색하는 건 앞에서 O(N^2)이었지요.
투 포인터를 활용하여 O(N)에 문제를 해결해봅시다.
먼저 배열의 인덱스를 가리키는 변수인 포인터 l, r을 선언합시다.
l = 0, r = 0입니다.
활용예 ① : BOJ 2003 수들의 합 2
2020 AL林 정기 스터디 75
이제 r을 1씩 증가시킬 때마다 l을 관리해봅시다. lrSum은 l부터 r - 1까지의 합입니다.
1 2 3 4 2 5 3 1 1 2 M = 5
l
r
lrSum = 0
활용예 ① : BOJ 2003 수들의 합 2
2020 AL林 정기 스터디 76
1 2 3 4 2 5 3 1 1 2 M = 5
l
r
lrSum = 1
r = 1
활용예 ① : BOJ 2003 수들의 합 2
2020 AL林 정기 스터디 77
r = 2
1 2 3 4 2 5 3 1 1 2 M = 5
l
r
lrSum = 3
활용예 ① : BOJ 2003 수들의 합 2
2020 AL林 정기 스터디 78
r = 3
이때, lrSum >= M이고 l을 놔두고 r을 아무리 증가시켜도 lrSum > M이겠지요.
이제 l을 관리합시다.
1 2 3 4 2 5 3 1 1 2 M = 5
l
r
lrSum = 6
활용예 ① : BOJ 2003 수들의 합 2
2020 AL林 정기 스터디 79
r = 3
lrSum = M 인 구간을 찾았습니다. (l = 1, r = 3)
그리고 또 l을 관리합시다.
1 2 3 4 2 5 3 1 1 2 M = 5
l
r
lrSum = 5
활용예 ① : BOJ 2003 수들의 합 2
2020 AL林 정기 스터디 80
r = 3
lrSum < M이므로 다시 r을 증가시킵시다.
1 2 3 4 2 5 3 1 1 2 M = 5
l
r
lrSum = 3
활용예 ① : BOJ 2003 수들의 합 2
2020 AL林 정기 스터디 81
r = 4
1 2 3 4 2 5 3 1 1 2 M = 5
l
r
lrSum = 7
활용예 ① : BOJ 2003 수들의 합 2
2020 AL林 정기 스터디 82
r = 4
1 2 3 4 2 5 3 1 1 2 M = 5
l
r
lrSum = 4
활용예 ① : BOJ 2003 수들의 합 2
2020 AL林 정기 스터디 83
r = 5
1 2 3 4 2 5 3 1 1 2 M = 5
l
r
lrSum = 6
활용예 ① : BOJ 2003 수들의 합 2
2020 AL林 정기 스터디 84
r = 5
1 2 3 4 2 5 3 1 1 2 M = 5
l
r
lrSum = 2
활용예 ① : BOJ 2003 수들의 합 2
2020 AL林 정기 스터디 85
r = 6
1 2 3 4 2 5 3 1 1 2 M = 5
l
r
lrSum = 7
활용예 ① : BOJ 2003 수들의 합 2
2020 AL林 정기 스터디 86
r = 6
lrSum = M인 구간을 찾았습니다. (l = 5, r = 6)
1 2 3 4 2 5 3 1 1 2 M = 5
l
r
lrSum = 5
활용예 ① : BOJ 2003 수들의 합 2
2020 AL林 정기 스터디 87
(중략...) r = 9
lrSum = M인 구간을 찾았습니다. (l = 6, r = 9)
1 2 3 4 2 5 3 1 1 2 M = 5
l
r
lrSum = 5
활용예 ① : BOJ 2003 수들의 합 2
2020 AL林 정기 스터디 88
answer = 0
lrSum = 0
l = 0
for r in range(1, N + 1):
lrSum += A[r - 1]
while l < r and lrSum >= M:
if lrSum == M:
answer += 1
lrSum -= A[l]
l += 1
print(answer)
소스코드 : http://boj.kr/988018727c0e440f829616886c014bdd
투 포인터 : 마무리..
2020 AL林 정기 스터디 89
- 이거도 쓰이는 방법이야 다양하지만 [l, r] 구간을 관리하면서 푸는 유형이 대부분인데,
방금 연습문제에서 본 것과 같이 r을 선형으로 훑으면서 r이 증가할 때마다 l이 조건
을 만족하도록 관리하는 유형입니다.
- [l, r] 구간의 크기가 일정하게 하여 훑는 테크닉은 슬라이딩 윈도우라고 합니다.

More Related Content

What's hot

Elliptic Curve Cryptography
Elliptic Curve CryptographyElliptic Curve Cryptography
Elliptic Curve Cryptography
Kelly Bresnahan
 
Skiena algorithm 2007 lecture12 topological sort connectivity
Skiena algorithm 2007 lecture12 topological sort connectivitySkiena algorithm 2007 lecture12 topological sort connectivity
Skiena algorithm 2007 lecture12 topological sort connectivity
zukun
 
Skiena algorithm 2007 lecture11 breadth deapth first search
Skiena algorithm 2007 lecture11 breadth deapth first searchSkiena algorithm 2007 lecture11 breadth deapth first search
Skiena algorithm 2007 lecture11 breadth deapth first search
zukun
 
ACM ICPC 2013 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2013 NEERC (Northeastern European Regional Contest) Problems ReviewACM ICPC 2013 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2013 NEERC (Northeastern European Regional Contest) Problems Review
Roman Elizarov
 

What's hot (20)

Elliptic Curve Cryptography
Elliptic Curve CryptographyElliptic Curve Cryptography
Elliptic Curve Cryptography
 
Elliptic Curve Cryptography
Elliptic Curve CryptographyElliptic Curve Cryptography
Elliptic Curve Cryptography
 
Data structure
Data structureData structure
Data structure
 
Elliptic Curve Cryptography for those who are afraid of maths
Elliptic Curve Cryptography for those who are afraid of mathsElliptic Curve Cryptography for those who are afraid of maths
Elliptic Curve Cryptography for those who are afraid of maths
 
Elliptic Curve Cryptography
Elliptic Curve CryptographyElliptic Curve Cryptography
Elliptic Curve Cryptography
 
1524 elliptic curve cryptography
1524 elliptic curve cryptography1524 elliptic curve cryptography
1524 elliptic curve cryptography
 
Elliptic curve cryptography
Elliptic curve cryptographyElliptic curve cryptography
Elliptic curve cryptography
 
Arrays
ArraysArrays
Arrays
 
Skiena algorithm 2007 lecture12 topological sort connectivity
Skiena algorithm 2007 lecture12 topological sort connectivitySkiena algorithm 2007 lecture12 topological sort connectivity
Skiena algorithm 2007 lecture12 topological sort connectivity
 
Error control coding bch, reed-solomon etc..
Error control coding   bch, reed-solomon etc..Error control coding   bch, reed-solomon etc..
Error control coding bch, reed-solomon etc..
 
Ecc2
Ecc2Ecc2
Ecc2
 
Bch and reed solomon codes generation in frequency domain
Bch and reed solomon codes generation in frequency domainBch and reed solomon codes generation in frequency domain
Bch and reed solomon codes generation in frequency domain
 
Problem Solving with Algorithms and Data Structure - Graphs
Problem Solving with Algorithms and Data Structure - GraphsProblem Solving with Algorithms and Data Structure - Graphs
Problem Solving with Algorithms and Data Structure - Graphs
 
Data Security Using Elliptic Curve Cryptography
Data Security Using Elliptic Curve CryptographyData Security Using Elliptic Curve Cryptography
Data Security Using Elliptic Curve Cryptography
 
Skiena algorithm 2007 lecture11 breadth deapth first search
Skiena algorithm 2007 lecture11 breadth deapth first searchSkiena algorithm 2007 lecture11 breadth deapth first search
Skiena algorithm 2007 lecture11 breadth deapth first search
 
Topological Sort
Topological SortTopological Sort
Topological Sort
 
Understanding Reed-Solomon code
Understanding Reed-Solomon codeUnderstanding Reed-Solomon code
Understanding Reed-Solomon code
 
Elliptic curvecryptography Shane Almeida Saqib Awan Dan Palacio
Elliptic curvecryptography Shane Almeida Saqib Awan Dan PalacioElliptic curvecryptography Shane Almeida Saqib Awan Dan Palacio
Elliptic curvecryptography Shane Almeida Saqib Awan Dan Palacio
 
ACM ICPC 2013 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2013 NEERC (Northeastern European Regional Contest) Problems ReviewACM ICPC 2013 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2013 NEERC (Northeastern European Regional Contest) Problems Review
 
Graph Traversal Algorithms - Depth First Search Traversal
Graph Traversal Algorithms - Depth First Search TraversalGraph Traversal Algorithms - Depth First Search Traversal
Graph Traversal Algorithms - Depth First Search Traversal
 

Similar to 2020 겨울방학 정기스터디 3주차

Oct8 - 131 slid
Oct8 - 131 slidOct8 - 131 slid
Oct8 - 131 slid
Tak Lee
 
There are two types of ciphers - Block and Stream. Block is used to .docx
There are two types of ciphers - Block and Stream. Block is used to .docxThere are two types of ciphers - Block and Stream. Block is used to .docx
There are two types of ciphers - Block and Stream. Block is used to .docx
relaine1
 
Andrew_Hair_Assignment_3
Andrew_Hair_Assignment_3Andrew_Hair_Assignment_3
Andrew_Hair_Assignment_3
Andrew Hair
 
[This sheet must be completed and attached to the last page of.docx
[This sheet must be completed and attached to the last page of.docx[This sheet must be completed and attached to the last page of.docx
[This sheet must be completed and attached to the last page of.docx
hanneloremccaffery
 
Spring 2003
Spring 2003Spring 2003
Spring 2003
butest
 

Similar to 2020 겨울방학 정기스터디 3주차 (20)

2021 1학기 정기 세미나 2주차
2021 1학기 정기 세미나 2주차2021 1학기 정기 세미나 2주차
2021 1학기 정기 세미나 2주차
 
2020 1학기 정기스터디 1주차
2020 1학기 정기스터디 1주차2020 1학기 정기스터디 1주차
2020 1학기 정기스터디 1주차
 
Module 5. bsm
Module 5. bsmModule 5. bsm
Module 5. bsm
 
2020 1학기 정기스터디 2주차
2020 1학기 정기스터디 2주차2020 1학기 정기스터디 2주차
2020 1학기 정기스터디 2주차
 
Oct8 - 131 slid
Oct8 - 131 slidOct8 - 131 slid
Oct8 - 131 slid
 
Chapter0
Chapter0Chapter0
Chapter0
 
There are two types of ciphers - Block and Stream. Block is used to .docx
There are two types of ciphers - Block and Stream. Block is used to .docxThere are two types of ciphers - Block and Stream. Block is used to .docx
There are two types of ciphers - Block and Stream. Block is used to .docx
 
SMU BCA SUMMER 2014 ASSIGNMENTS
SMU BCA SUMMER 2014 ASSIGNMENTSSMU BCA SUMMER 2014 ASSIGNMENTS
SMU BCA SUMMER 2014 ASSIGNMENTS
 
Ap for b.tech. (mechanical) Assignment Problem
Ap for b.tech. (mechanical) Assignment Problem Ap for b.tech. (mechanical) Assignment Problem
Ap for b.tech. (mechanical) Assignment Problem
 
CASIO 991 ES Calculator Technique
CASIO 991 ES Calculator TechniqueCASIO 991 ES Calculator Technique
CASIO 991 ES Calculator Technique
 
Andrew_Hair_Assignment_3
Andrew_Hair_Assignment_3Andrew_Hair_Assignment_3
Andrew_Hair_Assignment_3
 
[This sheet must be completed and attached to the last page of.docx
[This sheet must be completed and attached to the last page of.docx[This sheet must be completed and attached to the last page of.docx
[This sheet must be completed and attached to the last page of.docx
 
Transportation and transshipment problems
Transportation  and transshipment problemsTransportation  and transshipment problems
Transportation and transshipment problems
 
3rd Semester Computer Science and Engineering (ACU) Question papers
3rd Semester Computer Science and Engineering  (ACU) Question papers3rd Semester Computer Science and Engineering  (ACU) Question papers
3rd Semester Computer Science and Engineering (ACU) Question papers
 
Alg complex numbers
Alg complex numbersAlg complex numbers
Alg complex numbers
 
3rd Semester Computer Science and Engineering (ACU) Question papers
3rd Semester Computer Science and Engineering  (ACU) Question papers3rd Semester Computer Science and Engineering  (ACU) Question papers
3rd Semester Computer Science and Engineering (ACU) Question papers
 
lecture8_Cuong.ppt
lecture8_Cuong.pptlecture8_Cuong.ppt
lecture8_Cuong.ppt
 
Spring 2003
Spring 2003Spring 2003
Spring 2003
 
Assignment6
Assignment6Assignment6
Assignment6
 
MATLAB Questions and Answers.pdf
MATLAB Questions and Answers.pdfMATLAB Questions and Answers.pdf
MATLAB Questions and Answers.pdf
 

More from Moonki Choi

More from Moonki Choi (13)

2021 2학기 정기 세미나 5주차
2021 2학기 정기 세미나 5주차2021 2학기 정기 세미나 5주차
2021 2학기 정기 세미나 5주차
 
2021 2학기 정기 세미나 4주차
2021 2학기 정기 세미나 4주차2021 2학기 정기 세미나 4주차
2021 2학기 정기 세미나 4주차
 
2021 여름방학 정기 세미나 3주차
2021 여름방학 정기 세미나 3주차2021 여름방학 정기 세미나 3주차
2021 여름방학 정기 세미나 3주차
 
2021 여름방학 정기 세미나 1주차
2021 여름방학 정기 세미나 1주차2021 여름방학 정기 세미나 1주차
2021 여름방학 정기 세미나 1주차
 
2021 알림 오세요
2021 알림 오세요2021 알림 오세요
2021 알림 오세요
 
2021 1학기 정기 세미나 6주차
2021 1학기 정기 세미나 6주차2021 1학기 정기 세미나 6주차
2021 1학기 정기 세미나 6주차
 
2021 1학기 정기 세미나 3주차
2021 1학기 정기 세미나 3주차2021 1학기 정기 세미나 3주차
2021 1학기 정기 세미나 3주차
 
2020 여름방학 정기스터디 6주차
2020 여름방학 정기스터디 6주차2020 여름방학 정기스터디 6주차
2020 여름방학 정기스터디 6주차
 
2020 여름방학 정기스터디 5주차
2020 여름방학 정기스터디 5주차2020 여름방학 정기스터디 5주차
2020 여름방학 정기스터디 5주차
 
2020 겨울방학 정기스터디 2주차
2020 겨울방학 정기스터디 2주차2020 겨울방학 정기스터디 2주차
2020 겨울방학 정기스터디 2주차
 
2020 2학기 정기스터디 8주차
2020 2학기 정기스터디 8주차2020 2학기 정기스터디 8주차
2020 2학기 정기스터디 8주차
 
2020 2학기 정기스터디 2주차
2020 2학기 정기스터디 2주차2020 2학기 정기스터디 2주차
2020 2학기 정기스터디 2주차
 
2020 2학기 정기스터디 1주차
2020 2학기 정기스터디 1주차2020 2학기 정기스터디 1주차
2020 2학기 정기스터디 1주차
 

Recently uploaded

Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak HamilCara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Kandungan 087776558899
 
Hospital management system project report.pdf
Hospital management system project report.pdfHospital management system project report.pdf
Hospital management system project report.pdf
Kamal Acharya
 

Recently uploaded (20)

AIRCANVAS[1].pdf mini project for btech students
AIRCANVAS[1].pdf mini project for btech studentsAIRCANVAS[1].pdf mini project for btech students
AIRCANVAS[1].pdf mini project for btech students
 
A Study of Urban Area Plan for Pabna Municipality
A Study of Urban Area Plan for Pabna MunicipalityA Study of Urban Area Plan for Pabna Municipality
A Study of Urban Area Plan for Pabna Municipality
 
School management system project Report.pdf
School management system project Report.pdfSchool management system project Report.pdf
School management system project Report.pdf
 
Employee leave management system project.
Employee leave management system project.Employee leave management system project.
Employee leave management system project.
 
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak HamilCara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
 
Linux Systems Programming: Inter Process Communication (IPC) using Pipes
Linux Systems Programming: Inter Process Communication (IPC) using PipesLinux Systems Programming: Inter Process Communication (IPC) using Pipes
Linux Systems Programming: Inter Process Communication (IPC) using Pipes
 
Introduction to Data Visualization,Matplotlib.pdf
Introduction to Data Visualization,Matplotlib.pdfIntroduction to Data Visualization,Matplotlib.pdf
Introduction to Data Visualization,Matplotlib.pdf
 
PE 459 LECTURE 2- natural gas basic concepts and properties
PE 459 LECTURE 2- natural gas basic concepts and propertiesPE 459 LECTURE 2- natural gas basic concepts and properties
PE 459 LECTURE 2- natural gas basic concepts and properties
 
457503602-5-Gas-Well-Testing-and-Analysis-pptx.pptx
457503602-5-Gas-Well-Testing-and-Analysis-pptx.pptx457503602-5-Gas-Well-Testing-and-Analysis-pptx.pptx
457503602-5-Gas-Well-Testing-and-Analysis-pptx.pptx
 
COST-EFFETIVE and Energy Efficient BUILDINGS ptx
COST-EFFETIVE  and Energy Efficient BUILDINGS ptxCOST-EFFETIVE  and Energy Efficient BUILDINGS ptx
COST-EFFETIVE and Energy Efficient BUILDINGS ptx
 
Online food ordering system project report.pdf
Online food ordering system project report.pdfOnline food ordering system project report.pdf
Online food ordering system project report.pdf
 
DC MACHINE-Motoring and generation, Armature circuit equation
DC MACHINE-Motoring and generation, Armature circuit equationDC MACHINE-Motoring and generation, Armature circuit equation
DC MACHINE-Motoring and generation, Armature circuit equation
 
fitting shop and tools used in fitting shop .ppt
fitting shop and tools used in fitting shop .pptfitting shop and tools used in fitting shop .ppt
fitting shop and tools used in fitting shop .ppt
 
Computer Graphics Introduction To Curves
Computer Graphics Introduction To CurvesComputer Graphics Introduction To Curves
Computer Graphics Introduction To Curves
 
Max. shear stress theory-Maximum Shear Stress Theory ​ Maximum Distortional ...
Max. shear stress theory-Maximum Shear Stress Theory ​  Maximum Distortional ...Max. shear stress theory-Maximum Shear Stress Theory ​  Maximum Distortional ...
Max. shear stress theory-Maximum Shear Stress Theory ​ Maximum Distortional ...
 
Tamil Call Girls Bhayandar WhatsApp +91-9930687706, Best Service
Tamil Call Girls Bhayandar WhatsApp +91-9930687706, Best ServiceTamil Call Girls Bhayandar WhatsApp +91-9930687706, Best Service
Tamil Call Girls Bhayandar WhatsApp +91-9930687706, Best Service
 
Ground Improvement Technique: Earth Reinforcement
Ground Improvement Technique: Earth ReinforcementGround Improvement Technique: Earth Reinforcement
Ground Improvement Technique: Earth Reinforcement
 
Bhubaneswar🌹Call Girls Bhubaneswar ❤Komal 9777949614 💟 Full Trusted CALL GIRL...
Bhubaneswar🌹Call Girls Bhubaneswar ❤Komal 9777949614 💟 Full Trusted CALL GIRL...Bhubaneswar🌹Call Girls Bhubaneswar ❤Komal 9777949614 💟 Full Trusted CALL GIRL...
Bhubaneswar🌹Call Girls Bhubaneswar ❤Komal 9777949614 💟 Full Trusted CALL GIRL...
 
Design For Accessibility: Getting it right from the start
Design For Accessibility: Getting it right from the startDesign For Accessibility: Getting it right from the start
Design For Accessibility: Getting it right from the start
 
Hospital management system project report.pdf
Hospital management system project report.pdfHospital management system project report.pdf
Hospital management system project report.pdf
 

2020 겨울방학 정기스터디 3주차

  • 1. 서울시립대 알고리즘 소모임 알고리즘 문제해결 테크닉 겨울방학 3주차
  • 2. 강의자 소개 2020 AL林 정기 스터디 2 이름 최문기 소속 서울시립대 컴퓨터과학부(16학번) 핸들 iknoom1107(BOJ) IKnoom(Codeforces) IKnoom(AtCoder) ICPC 팀 ManManChiAnunTeam (2020 Seoul Regional 본선 진출 및 28위) - 김정현, 최문기, 최연웅
  • 3. 오늘 할 것 2020 AL林 정기 스터디 3 원래는 비트마스크만 발표하려고 했으나 너무 짧을 것 같아서 이것저것 내가 하고싶은거 모아서 발표하기 • 비트마스크 • 누적 합 • 최대 부분 합 • 스위핑 기법 • 투 포인터
  • 4. 2020 AL林 정기 스터디 4 비트마스크
  • 5. 비트마스크 2020 AL林 정기 스터디 5 어떤 상태를 비트로 표현하여 저장하는 테크닉입니다. 그러면 ① 연산이 빠르고 ② 메모리가 적게 듭니다.
  • 6. 활용예 ① : 집합의 표현 2020 AL林 정기 스터디 6 1부터 8까지의 수가 있습니다. 그 중에서 몇 개의 수를 선택한 부분 집합를 비트로 표현해봅시다. 8 7 6 5 4 3 2 1
  • 7. 활용예 ① : 집합의 표현 2020 AL林 정기 스터디 7 00000000(2) = 0 8 7 6 5 4 3 2 1
  • 8. 활용예 ① : 집합의 표현 2020 AL林 정기 스터디 8 00000001(2) = 1 8 7 6 5 4 3 2 1
  • 9. 활용예 ① : 집합의 표현 2020 AL林 정기 스터디 9 00001001(2) = 9 8 7 6 5 4 3 2 1
  • 10. 활용예 ① : 집합의 표현 2020 AL林 정기 스터디 10 00011001(2) = 25 8 7 6 5 4 3 2 1
  • 11. 활용예 ① : 집합의 표현 2020 AL林 정기 스터디 11 10011001(2) = 153 8 7 6 5 4 3 2 1
  • 12. 활용예 ① : 집합의 표현 2020 AL林 정기 스터디 12 11111111(2) = 255 8 7 6 5 4 3 2 1
  • 13. 활용예 ① : 집합의 표현 2020 AL林 정기 스터디 13 이렇게 집합을 비트로 표현하면 C에서 int는 32비트이므로 최대 집합의 크기가 32이고 long long은 64비트이므로 최대 집합의 크기가 64입니다. 집합이 작은 경우 비트로 표현하여 저장하면 효율적입니다.
  • 14. 활용예 ② : 슬라이딩 퍼즐 2020 AL林 정기 스터디 14 이 슬라이딩 퍼즐도 비트마스킹으로 표현이 가능합니다. 퍼즐의 상태가 8 이하의 수 9개의 순열로 표현되기 때문이지요.
  • 15. 활용예 ② : 슬라이딩 퍼즐 2020 AL林 정기 스터디 15 왼쪽 슬라이딩 퍼즐은 “806547231”로 표현할 수 있습니다. 비트마스킹으로 줄여봅시다. 0 8 = 1000(2) 0 = 0000(2) 6 = 0110(2) 5 = 0101(2) 4 = 0100(2) 7 = 0111(2) 2 = 0010(2) 3 = 0011(2) 1 = 0001(2)
  • 16. 활용예 ② : 슬라이딩 퍼즐 2020 AL林 정기 스터디 16 “806547231” = 1000 0000 0110 0101 0100 0111 0010 0011 0001(2) = 34465935921 0
  • 17. 활용예 ② : 슬라이딩 퍼즐 2020 AL林 정기 스터디 17 15-퍼즐(4×4퍼즐)까지는 long long으로 표현이 가능합니다. 4비트의 양의 정수 16개로 표현 가능하기 때문이지요. 꼭 이렇게 해서 풀어야하는 건 아닙니다. 저는 백준에 있는 슬라이딩 퍼즐 문제 string으로 저장해서 풀었습니다. 비트마스킹을 하면 메모리나 시간이 더 효율적이겠지요.
  • 18. 연습문제 : BOJ 11723번 집합 2020 AL林 정기 스터디 18 비트마스킹을 활용하여 집합의 상태를 표현하는 기본 문제입니다. <<, &, | 와 같은 비트 연산자를 활용해봅시다. 소스 코드 : http://boj.kr/656f225451174337b55f53049181168f
  • 19. 연습문제 : BOJ 11723번 집합 2020 AL林 정기 스터디 19 if query[0] == "add": x = int(query[1]) - 1 SET |= (1 << x) elif query[0] == "remove": x = int(query[1]) - 1 if SET & (1 << x): SET -= (1 << x) # 또는 SET &= ~(1 << x) elif query[0] == "toggle": x = int(query[1]) - 1 SET ^= (1 << x)
  • 20. 연습문제 : BOJ 11723번 집합 2020 AL林 정기 스터디 20 elif query[0] == "check": x = int(query[1]) - 1 if SET & (1 << x): print(1) else: print(0) elif query[0] == "all": SET = (1 << 20) - 1 elif query[0] == "empty": SET = 0
  • 21. 연습문제 2020 AL林 정기 스터디 21 BOJ 17453 두 개의 문 : 비트가 많아지면 분할하거나 std::bitset을 씁니다. BOJ 2098 외판원 순회 : 방문한 마을을 비트로 표현 + DP BOJ 1194 달이 차오른다, 가자. : 가진 열쇠를 비트로 표현 + BFS BOJ 1525 퍼즐 : 슬라이딩 퍼즐의 상태를 비트로 표현 + BFS
  • 22. 비트마스킹 : 마무리.. 2020 AL林 정기 스터디 22 - 알고리즘 문제해결 전략(종만북)을 575페이지를 보면 집합의 표현에 대한 더 자세 한 내용이 있습니다. 좋은 테크닉이 많지만 전부 알 필요는 없다고 생각됩니다. - 비트마스킹은 보통 DP와 같이 활용되거나 상태공간을 BFS, DFS와 같은 탐색 알고 리즘을 써서 탐색할 때에도 활용됩니다. 보통 이런 경우에 상태에 어떤 값을 연관시 켜야하기 때문이지요.
  • 23. 2020 AL林 정기 스터디 23 누적 합
  • 24. 누적 합 2020 AL林 정기 스터디 24 부분합을 빠르게 구하는 테크닉입니다. 전처리 : O(N) 부분합을 구하는 쿼리 : O(1)
  • 25. 누적 합 2020 AL林 정기 스터디 25 a부터 b까지(a ≦ b)의 부분합을 구하는 것은 0부터 b까지의 부분합에서 0부터 a – 1까지의 부분합을 빼면 됩니다. ෍ 𝑖=𝑎 𝑏 𝐴𝑖 = ෍ 𝑖=0 𝑏 𝐴𝑖 − ෍ 𝑖=0 𝑎−1 𝐴𝑖
  • 26. 누적 합 2020 AL林 정기 스터디 26 0부터 i까지의 합을 저장하는 배열 prefixSum을 만듭시다. -> O(N) i 0 1 2 3 4 5 6 7 A 1 4 3 5 2 1 8 2 prefixSum 1 5 8 13 15 16 24 26
  • 27. 누적 합 2020 AL林 정기 스터디 27 이제 3부터 5까지의 구간합을 구해봅시다. A[3] + A[4] + A[5] = prefixSum[5] – prefixSum[2] = 16 – 8 = 8 i 0 1 2 3 4 5 6 7 A 1 4 3 5 2 1 8 2 prefixSum 1 5 8 13 15 16 24 26
  • 28. 연습문제 2020 AL林 정기 스터디 28 BOJ 11659 구간 합 구하기 4 : 기본 문제입니다. BOJ 11660 구간 합 구하기 5 : 차원을 늘려봅시다.
  • 29. 누적 합 : 마무리.. 2020 AL林 정기 스터디 29 - 부분합을 구하면서 배열의 값의 갱신이 일어나는 경우가 있습니다. 이런 경우에 누적 합은 갱신이 느려서 효율적으로 처리하기 위해서 세그먼트 트리나 펜윅 트리를 씁니 다. - 이게 꼭 합(sum)이 아니어도 다른 연산에도 활용이 가능합니다. 예를 들어 Xor도 가능하겠지요.
  • 30. 2020 AL林 정기 스터디 30 최대 부분합
  • 31. 최대 부분합 2020 AL林 정기 스터디 31 이번에는 최대 부분합을 구해봅시다. 방금 누적 합을 응용하면 O(N^2)에 가능하겠지요? prefixSum을 구해놓으면 a부터 b까지의 부분합은 O(1)에 구할 수 있고 [a, b] 구간의 수가 N(N-1)/2개이기 때문입니다.
  • 32. 최대 부분합 2020 AL林 정기 스터디 32 하지만 최대 부분합은 O(N)에 가능합니다. 구해봅시다. maxSum[i] : A[i]를 가장 오른쪽 끝으로 가지는 최대 부분합 i 0 1 2 3 4 5 6 7 A 3 4 -3 10 -99 5 3 -1 maxSum
  • 33. 최대 부분합 2020 AL林 정기 스터디 33 i 0 1 2 3 4 5 6 7 A 3 4 -3 10 -99 5 3 -1 maxSum 3 i 0 1 2 3 4 5 6 7 A 3 4 -3 10 -99 5 3 -1 maxSum 3 7
  • 34. 최대 부분합 2020 AL林 정기 스터디 34 i 0 1 2 3 4 5 6 7 A 3 4 -3 10 -99 5 3 -1 maxSum 3 7 4 i 0 1 2 3 4 5 6 7 A 3 4 -3 10 -99 5 3 -1 maxSum 3 7 4 14
  • 35. 최대 부분합 2020 AL林 정기 스터디 35 i 0 1 2 3 4 5 6 7 A 3 4 -3 10 -99 5 3 -1 maxSum 3 7 4 14 -85 i 0 1 2 3 4 5 6 7 A 3 4 -3 10 -99 5 3 -1 maxSum 3 7 4 14 -85 5
  • 36. 최대 부분합 2020 AL林 정기 스터디 36 i 0 1 2 3 4 5 6 7 A 3 4 -3 10 -99 5 3 -1 maxSum 3 7 4 14 -85 5 8 i 0 1 2 3 4 5 6 7 A 3 4 -3 10 -99 5 3 -1 maxSum 3 7 4 14 -85 5 8 7
  • 37. 최대 부분합 2020 AL林 정기 스터디 37 maxSum[i] : A[i]를 가장 오른쪽 끝으로 가지는 최대 부분합 그럼 다음 점화식이 성립합니다. maxSum[i] = max(maxSum[i – 1], 0) + A[i]
  • 38. 연습문제 : BOJ 1912 연속합 2020 AL林 정기 스터디 38 소스코드 : http://boj.kr/c31fcf4a82344dbdb84de73c845c7585 maxSum = 0 for i in range(N): maxSum = max(maxSum, 0) + A[i] answer = max(answer, maxSum)
  • 39. 최대 부분합 : 마무리.. 2020 AL林 정기 스터디 39 - 이걸 누가 이름도 지어놨습니다. 카데인 알고리즘이라고 합니다.
  • 40. 최대 부분합 : 마무리.. 2020 AL林 정기 스터디 40 - 최대 부분합을 구하는건 O(N)에 가능하지만 이게 구간쿼리로 들어오거나 갱신이 있 으면 처음 세그트리를 구축하고 나서 분할정복으로 쿼리를 O(logN)으로 처리하는 방법이 있습니다. 이 세그먼트 트리가 상당히 더럽고 복잡하고 구현하기 어렵습니다. 2019 ICPC 본선에 나온 적이 있지요.
  • 41. 2020 AL林 정기 스터디 41 스위핑
  • 42. 스위핑 기법 2020 AL林 정기 스터디 42 1. 어떤 기준으로 정렬하고 2. 순서대로 훑습니다. 바로 문제를 봅시다.
  • 43. 활용예 ① : BOJ 2170 선긋기 2020 AL林 정기 스터디 43 선을 그을 때에는 이미 선이 있는 위치에 겹쳐서 그릴 수도 있는데, 여러 번 그은 곳과 한 번 그은 곳의 차이를 구별할 수 없다고 하자. 이와 같은 식으로 선을 그었을 때, 그려진 선(들)의 총 길이를 구하는 프로그램을 작성하시오. 예제 입력 4 1 3 2 5 3 5 6 7 예제 출력 5
  • 44. 활용예 ① : BOJ 2170 선긋기 2020 AL林 정기 스터디 44 1. 시작점 기준으로 정렬합니다. 2. 정렬한 순서대로 구간을 봅시다. 이전까지 그은 선과 이어지면 합칩니다. 그게 아니면 끊습니다.
  • 45. 활용예 ① : BOJ 2170 선긋기 2020 AL林 정기 스터디 45 예제 입력 4 1 3 2 5 3 5 6 7 s = 1 e = 3
  • 46. 활용예 ① : BOJ 2170 선긋기 2020 AL林 정기 스터디 46 예제 입력 4 1 3 2 5 3 5 6 7 이전까지 그은 선과 이어지면 합칩니다. s = 1 e = 3
  • 47. 활용예 ① : BOJ 2170 선긋기 2020 AL林 정기 스터디 47 예제 입력 4 1 3 2 5 3 5 6 7 이전까지 그은 선과 이어지면 합칩니다. s = 1 e = 5
  • 48. 활용예 ① : BOJ 2170 선긋기 2020 AL林 정기 스터디 48 예제 입력 4 1 3 2 5 3 5 6 7 이전까지 그은 선과 이어지면 합칩니다. s = 1 e = 5
  • 49. 활용예 ① : BOJ 2170 선긋기 2020 AL林 정기 스터디 49 예제 입력 4 1 3 2 5 3 5 6 7 이전까지 그은 선과 이어지면 합칩니다. s = 1 e = 5
  • 50. 활용예 ① : BOJ 2170 선긋기 2020 AL林 정기 스터디 50 예제 입력 4 1 3 2 5 3 5 6 7 그게 아니면 끊습니다. s = 6 e = 7
  • 51. 활용예 ① : BOJ 2170 선긋기 2020 AL林 정기 스터디 51 예제 입력 4 1 3 2 5 3 5 6 7 그게 아니면 끊습니다. s = 6 e = 7
  • 52. 활용예 ① : BOJ 2170 선긋기 2020 AL林 정기 스터디 52 # 정렬 lines.sort() # 스위핑 s, e = lines[0] sumLength = 0 for s_i, e_i in lines[1:]: if e < s_i: sumLength += e - s s, e = s_i, e_i else: e = max(e, e_i) sumLength += e - s # 출력 print(sumLength) 소스코드 : http://boj.kr/ede76a53e51042a2b61367e289fa4186
  • 53. 활용예 ② : BOJ 1689 겹치는 선분 2020 AL林 정기 스터디 53 1차원 좌표계 위에 선분 N개가 있다. 선분이 최대로 겹쳐있는 부분의 겹친 선분의 개수를 구해보자. 선분의 끝 점에서 겹치는 것은 겹치는 것으로 세지 않는다. 예제 입력 11 1 2 3 6 7 8 10 11 13 16 0 5 5 6 2 5 6 10 9 14 12 15 예제 출력 3
  • 54. 활용예 ② : BOJ 1689 겹치는 선분 2020 AL林 정기 스터디 54 시작점은 +1, 끝점은 -1을 매깁시다.
  • 55. 활용예 ② : BOJ 1689 겹치는 선분 2020 AL林 정기 스터디 55 이제 시작점, 끝점만 보면서 스위핑을 해봅시다. 시작점과 끝점은 2N개 밖에 없지요. +1 +1 +1 +1 +1 -1 -1 -1 -1 -1
  • 56. 활용예 ② : BOJ 1689 겹치는 선분 2020 AL林 정기 스터디 56 +1 +1 +1 +1 +1 -1 -1 -1 -1 겹치는 선분 = 1개 -1
  • 57. 활용예 ② : BOJ 1689 겹치는 선분 2020 AL林 정기 스터디 57 +1 +1 +1 +1 +1 -1 -1 -1 -1 겹치는 선분 = 2개 -1
  • 58. 활용예 ② : BOJ 1689 겹치는 선분 2020 AL林 정기 스터디 58 +1 +1 +1 +1 +1 -1 -1 -1 -1 겹치는 선분 = 3개 -1
  • 59. 활용예 ② : BOJ 1689 겹치는 선분 2020 AL林 정기 스터디 59 +1 +1 +1 +1 +1 -1 -1 -1 -1 겹치는 선분 = 2개 -1
  • 60. 활용예 ② : BOJ 1689 겹치는 선분 2020 AL林 정기 스터디 60 +1 +1 +1 +1 +1 -1 -1 -1 -1 겹치는 선분 = 3개 -1
  • 61. 활용예 ② : BOJ 1689 겹치는 선분 2020 AL林 정기 스터디 61 +1 +1 +1 +1 +1 -1 -1 -1 -1 겹치는 선분 = 4개 -1
  • 62. 활용예 ② : BOJ 1689 겹치는 선분 2020 AL林 정기 스터디 62 +1 +1 +1 +1 +1 -1 -1 -1 -1 겹치는 선분 = 3개 -1
  • 63. 활용예 ② : BOJ 1689 겹치는 선분 2020 AL林 정기 스터디 63 +1 +1 +1 +1 +1 -1 -1 -1 -1 겹치는 선분 = 2개 -1
  • 64. 활용예 ② : BOJ 1689 겹치는 선분 2020 AL林 정기 스터디 64 +1 +1 +1 +1 +1 -1 -1 -1 -1 겹치는 선분 = 1개 -1
  • 65. 활용예 ② : BOJ 1689 겹치는 선분 2020 AL林 정기 스터디 65 +1 +1 +1 +1 +1 -1 -1 -1 -1 겹치는 선분 = 0개 -1
  • 66. 활용예 ② : BOJ 1689 겹치는 선분 2020 AL林 정기 스터디 66 # 시작점과 끝점만 넣습니다. points = [] for s_i, e_i in lines: points.append((s_i, 1)) points.append((e_i, -1)) # 정렬 points.sort() # 스위핑 lineCnt = 0 maxCnt = 0 for x, diff in points: lineCnt += diff maxCnt = max(maxCnt, lineCnt) # 출력 print(maxCnt) 소스코드 : http://boj.kr/d54636fd209e451f9604ad0a5ca7663e
  • 67. 활용예 ② : BOJ 1689 겹치는 선분 2020 AL林 정기 스터디 67 시작점과 끝점만 넣고 스위핑하는 테크닉은 이렇게 구간 쿼리를 한번에 갱신해버리거나
  • 68. 활용예 ② : BOJ 1689 겹치는 선분 2020 AL林 정기 스터디 68 시작점과 끝점만 넣고 스위핑하는 테크닉은 이렇게 여러 직사각형의 면적합을 구할 때도 사용할 수도 있습니다.
  • 69. 스위핑 기법 : 마무리.. 2020 AL林 정기 스터디 69 - 스위핑으로 해결할 수 있는 문제는 정말 많고 이게 무슨 알고리즘이 아니라 그냥 정 렬하고 훑는거라 어디에 가져다가 붙여도 틀렸다고 하기 어렵고 그렇습니다.. - 다만 스위핑 기법으로 해결할 수 있는 어려운 문제 중에 풀이 방법이 유명한 문제들 이 몇 개 있습니다. 대표적으로 가장 가까운 두 점(스위핑 + BST), 2차 평면에서의 직사각형의 면적(스위핑 + 세그먼트 트리) 등등 - 선분을 시계방향으로 돌리면서 훑는 스위핑 기법도 있습니다. 기하 관련 알고리즘에 서 씁니다. ex) 컨벡스 헐
  • 70. 스위핑 기법 : 마무리.. 2020 AL林 정기 스터디 70 스위핑 관련 tutorials & 문제 - https://www.topcoder.com/community/competitive-programming/tutorials/line-sweep-algorithms/ - https://codeforces.com/blog/entry/20377 - https://m.blog.naver.com/kks227/220907708368
  • 71. 2020 AL林 정기 스터디 71 투 포인터
  • 72. 투 포인터 2020 AL林 정기 스터디 72 배열의 원소를 가리키는 2개의 포인터를 이용하는 기법을 말합니다. 이거도 바로 예시를 봅시다.
  • 73. 활용예 ① : BOJ 2003 수들의 합 2 2020 AL林 정기 스터디 73 수열 A의 부분합이 M이 되는 경우의 수를 구하는 프로그램을 작성하시오. 수열 A의 각 원소는 자연수이다. 예) M = 5, A = {1, 2, 3, 4, 2, 5, 3, 1, 1, 2}이면 답은 3 예제 입력 10 5 1 2 3 4 2 5 3 1 1 2 예제 출력 3
  • 74. 활용예 ① : BOJ 2003 수들의 합 2 2020 AL林 정기 스터디 74 부분합을 모두 탐색하는 건 앞에서 O(N^2)이었지요. 투 포인터를 활용하여 O(N)에 문제를 해결해봅시다. 먼저 배열의 인덱스를 가리키는 변수인 포인터 l, r을 선언합시다. l = 0, r = 0입니다.
  • 75. 활용예 ① : BOJ 2003 수들의 합 2 2020 AL林 정기 스터디 75 이제 r을 1씩 증가시킬 때마다 l을 관리해봅시다. lrSum은 l부터 r - 1까지의 합입니다. 1 2 3 4 2 5 3 1 1 2 M = 5 l r lrSum = 0
  • 76. 활용예 ① : BOJ 2003 수들의 합 2 2020 AL林 정기 스터디 76 1 2 3 4 2 5 3 1 1 2 M = 5 l r lrSum = 1 r = 1
  • 77. 활용예 ① : BOJ 2003 수들의 합 2 2020 AL林 정기 스터디 77 r = 2 1 2 3 4 2 5 3 1 1 2 M = 5 l r lrSum = 3
  • 78. 활용예 ① : BOJ 2003 수들의 합 2 2020 AL林 정기 스터디 78 r = 3 이때, lrSum >= M이고 l을 놔두고 r을 아무리 증가시켜도 lrSum > M이겠지요. 이제 l을 관리합시다. 1 2 3 4 2 5 3 1 1 2 M = 5 l r lrSum = 6
  • 79. 활용예 ① : BOJ 2003 수들의 합 2 2020 AL林 정기 스터디 79 r = 3 lrSum = M 인 구간을 찾았습니다. (l = 1, r = 3) 그리고 또 l을 관리합시다. 1 2 3 4 2 5 3 1 1 2 M = 5 l r lrSum = 5
  • 80. 활용예 ① : BOJ 2003 수들의 합 2 2020 AL林 정기 스터디 80 r = 3 lrSum < M이므로 다시 r을 증가시킵시다. 1 2 3 4 2 5 3 1 1 2 M = 5 l r lrSum = 3
  • 81. 활용예 ① : BOJ 2003 수들의 합 2 2020 AL林 정기 스터디 81 r = 4 1 2 3 4 2 5 3 1 1 2 M = 5 l r lrSum = 7
  • 82. 활용예 ① : BOJ 2003 수들의 합 2 2020 AL林 정기 스터디 82 r = 4 1 2 3 4 2 5 3 1 1 2 M = 5 l r lrSum = 4
  • 83. 활용예 ① : BOJ 2003 수들의 합 2 2020 AL林 정기 스터디 83 r = 5 1 2 3 4 2 5 3 1 1 2 M = 5 l r lrSum = 6
  • 84. 활용예 ① : BOJ 2003 수들의 합 2 2020 AL林 정기 스터디 84 r = 5 1 2 3 4 2 5 3 1 1 2 M = 5 l r lrSum = 2
  • 85. 활용예 ① : BOJ 2003 수들의 합 2 2020 AL林 정기 스터디 85 r = 6 1 2 3 4 2 5 3 1 1 2 M = 5 l r lrSum = 7
  • 86. 활용예 ① : BOJ 2003 수들의 합 2 2020 AL林 정기 스터디 86 r = 6 lrSum = M인 구간을 찾았습니다. (l = 5, r = 6) 1 2 3 4 2 5 3 1 1 2 M = 5 l r lrSum = 5
  • 87. 활용예 ① : BOJ 2003 수들의 합 2 2020 AL林 정기 스터디 87 (중략...) r = 9 lrSum = M인 구간을 찾았습니다. (l = 6, r = 9) 1 2 3 4 2 5 3 1 1 2 M = 5 l r lrSum = 5
  • 88. 활용예 ① : BOJ 2003 수들의 합 2 2020 AL林 정기 스터디 88 answer = 0 lrSum = 0 l = 0 for r in range(1, N + 1): lrSum += A[r - 1] while l < r and lrSum >= M: if lrSum == M: answer += 1 lrSum -= A[l] l += 1 print(answer) 소스코드 : http://boj.kr/988018727c0e440f829616886c014bdd
  • 89. 투 포인터 : 마무리.. 2020 AL林 정기 스터디 89 - 이거도 쓰이는 방법이야 다양하지만 [l, r] 구간을 관리하면서 푸는 유형이 대부분인데, 방금 연습문제에서 본 것과 같이 r을 선형으로 훑으면서 r이 증가할 때마다 l이 조건 을 만족하도록 관리하는 유형입니다. - [l, r] 구간의 크기가 일정하게 하여 훑는 테크닉은 슬라이딩 윈도우라고 합니다.