SlideShare a Scribd company logo
1 of 79
Download to read offline
Backtracking
홍익대학교 HI-ARC(@ICPC Sinchon)
이재열
@malkoring A.K.A KodingWarrior
1
About Speaker
● 이재열 a.k.a. KodingWarrior(개인사업자 코딩워리어)
● 홍익대학교 알고리즘 학회 HI-ARC 창립 멤버
● HI-ARC 2대 학회장 ('17.09 ~ '18.09)
● 어쩌다보니 ICPC 신촌 스탭
● 블록체인 스타트업에서 일하는 휴학생 직장인
○ 아직 졸업 못함 ㅜㅜ
● 친구하실 분 구함 (fb.com/kodingwarrior, insta: @kodingwarrior)
2
About HI-ARC
● 홍익대학교의 알고리즘 학회
Hong Ik Algorithm Research Club
페이스북 페이지 : fb.com/hongikuniv.hiarc
공식 홈페이지 : hi-arc.github.io
3
코드 질문 올리는 방법
4
● 슬랙 대화 입력창 하단에 클립 버튼을 클릭 후,
Code or text snippet 글씨를 클릭합니다.
코드 질문 올리는 방법
5
코드 질문 올리는 방법
6
Background : Brute Force #1
● Brute Force
○ 할 수 있는 방법은 다 시도해보는 방법이다.
■ == 효율성 고려하지 않고 막 짜면 된다.
○ 별 다른 방법이 생각나지 않는다면 한번 시도해볼만 하다.
○ Brute Force를 나타내는 여러가지 표현들
■ 전수조사
■ 무작정 시도해보기
■ 완전탐색(Exhautive Search)
■ 각개격파
■ 무식한 방법(직역)
■ ....
7
Background : Brute Force #2
● Brute Force를 시도하는 여러가지 방법들 (#1)
○ for문 혹은 while문이 한번만 들어간 반복문
8
for (int x = 0; x <= MAX_X; ++x)
solve(x);
Background : Brute Force #3
● Brute Force를 시도하는 여러가지 방법들 (#2)
○ for문 혹은 while문이 2회 이상 중첩된 반복문
○ 2개 이상의 변수에 따라 결과값이 다르게 튀어나오기 때문에,
각각의 값을 다르게 변화시키면서 관찰한다. (하지만 규칙은 알 방법이 없다)
○ 경우에 따라서 포함-배제의 원리를 쓰기도 한다.
■ 백설공주와 일곱난쟁이
9
for (int x = 0; x <= MAX_X; ++x)
for (int y = 0; y <= MAX_Y; ++y)
solve(x, y);
Background : Brute Force #4
● Brute Force를 시도하는 여러가지 방법들 (#3)
○ 반복문을 동적으로 중첩시킬 수만은 없으니 재귀함수를 쓰기도 한다.
○ 이러한 트릭이 백트래킹에서 자주 사용된다.
10
for(int i = 0; i <= N; ++i)
for(int j = i + 1; j <= N; ++j)
for(int k = j + 1; k <= N; ++k)
… (아무튼 for 문이 계속 중첩)
do_something();
void solve(int index, int N, int depth, int limit) {
if (depth == limit) {
do_something();
}
for (int next = index + 1; next <= N; ++next) {
solve(next, N, depth + 1, limit);
}
}
재귀 함수의 깊이가
하나 늘었다는 것을 명시
재귀함수의 깊이가 특정 레벨까지
도달하면 그제서야 실행하고자 하는
함수를 실행
What is Backtracking?
● 말은 번지르르하게 백트래킹이라 하지만,
접근하는 방식 자체는 Brute Force라고 봐도 된다.
○ 재귀함수로 Brute Force를 시도하는 것
○ 더 빠른 방법은 마땅히 없어 보이기 때문에
현재 상태에서 도달가능한 모든 상태를 무식하게 재귀적으로 뒤져본다.
■ 불가능한 후보 상태는 탐색하지 않는다.
○ 뒤져봐도 방법이 없으면 되돌아가서(backtrack)
다른 방법을 시도해본다.
11
Backtracking in Real World
● 우리는 이미 백트래킹을 암묵적으로 알고 있다.
● ex) Undertale (93개의 엔딩)
출처: https://imgur.com/r/undertale/6wNQy8i 12
13
Backtracking : 0-1 Knapsack #1
● 물건을 넣고 뺄 수 있는 가방이 주어진다.
● 가방에 넣고 뺄 수 있는 물건은 N가지이며, 하나씩만 넣을 수 있다.
● 그리고 가방의 중량제한은 W
● 물건을 넣고 빼면서 무게의 총합이 W를 넘지 않아야 한다.
○ 수식으로 나타내면 아래와 같이 나타낼 수 있다.
14
Backtracking : 0-1 Knapsack #2
● 이 문제를 어떻게 재귀적으로 풀어낼 수 있는지
그림으로 이해해보도록 하자.
15
16
17
18
19
20
Backtracking : 0-1 Knapsack examples
● 부분 집합의 합이 주어진 제약을 만족하는 경우의 수 구하기
21
Backtracking : Combinations
● N개 중에서 M개를 중복없이 선택하는 문제
● 네. 맞습니다. N과 M 시리즈가 아주 웰노운입니다.
22
Backtracking : Combinations (Explained #1)
● {1, 2, 3, 4, 5} 로 이루어진 집합에서
원소 2개로 이루어진 부분 집합의 갯수를 구하시오.
(중/고등학교 수학 문제)
23
Backtracking : Combinations (Explained #2)
● {1, 2, 3, 4, 5} 로 이루어진 집합에서
원소 2개로 이루어진 부분 집합을 모두 구하시오.
(프로그래머가 하는 것)
24
Backtracking : Combinations (Explained #3)
● {1, 2, 3, 4, 5} 로 이루어진 집합에서
원소 2개로 이루어진 부분 집합을 모두 구하시오.
(프로그래머가 하는 것)
{1, 1}, {1, 2}, {1, 3}, {1, 4}, {1, 5},
{2, 1}, {2. 2}, {2, 3}, {2, 4}, {2, 5},
{3, 1}, {3, 2}, {3, 3}, {3, 4}, {3, 5},
{4, 1}, {4, 2}, {4, 3}, {4, 4}, {4, 5},
{5, 1}, {5, 2}, {5, 3}, {5, 4}, {5, 5}
25
Backtracking : Combinations (Explained #4)
● {1, 2, 3, 4, 5} 로 이루어진 집합에서
원소 2개로 이루어진 부분 집합을 모두 구하시오.
(프로그래머가 하는 것)
{1, 1}, {1, 2}, {1, 3}, {1, 4}, {1, 5},
{2, 1}, {2, 2}, {2, 3}, {2, 4}, {2, 5},
{3, 1}, {3, 2}, {3, 3}, {3, 4}, {3, 5},
{4, 1}, {4, 2}, {4, 3}, {4, 4}, {4, 5},
{5, 1}, {5, 2}, {5, 3}, {5, 4}, {5, 5}
26
이런건 그냥 2차원 for문으로
구현해도 된다.
Backtracking : Combinations (Explained #5)
● N개의 원소로 이루어진 집합에서
원소 M개로 이루어진 부분 집합들을 모두 구하시오.
M == 1 일 경우, 1중 for 문
M == 2 일 경우, 2중 for 문
M == 3 일 경우, 3중 for 문
...
27
Backtracking : Combinations (Explained #6)
● 점화식 정의에서 힌트를 얻자.
● Point 1
n개의 원소에서 k개 원소를 이미 선택했는데, (이전)
원소 하나를 덤으로 뽑아서 총 원소가 n+1개인가? (현재)
● Point 2
n개의 원소에서 k-1개의 원소를 원하는 걸로 선택했는데, (이전)
원소 하나를 뽑고 나니 총 원소가 n+1개이고 k개 만큼 선택하게 된 것인가? (현재)
28
Backtracking : Combinations (Explained #7)
● 점화식 정의에서 힌트를 얻자.
● Point 1
n개의 원소에서 k개 원소를 이미 선택했는데, (이전)
원소 하나를 덤으로 뽑아서 총 원소가 n+1개인가? (현재)
● Point 2
n개의 원소에서 k-1개의 원소를 원하는 걸로 선택했는데, (이전)
원소 하나를 뽑고 나니 총 원소가 n+1개이고 k개 만큼 선택하게 된 것인가? (현재)
29
1번의 경우일 수도 있고,(OR)
2번의 경우일 수도 있으므로 덧셈으로 합친다.
(독립적이므로 '합의 법칙'을 적용)
Backtracking : Combinations (Explained #8)
● 도식화하면서 이해해보자
30
31
32
33
34
35
Backtracking : Combinations examples
● (대충 N과 M 시리즈 여러개)
● 크기가 n인 부분집합을 구하기
●
36
Backtracking : Permutations
● N개 중에서 M개를 순서를 고려하여 선택하는 문제
● N개 중에서 M개를 뽑은 조합에 next_permutation을 싸서 드셔보세요!
● N과 M 시리즈에도 포함되어 있습니다.
● 아! 복면산 아시는구나! 정말 재.밌.습.니.다.
37
Backtracking : Permutations (Explained #1)
● {1, 2, 3, 4, 5} 로 이루어진 집합에서
원소 2개로 이루어진 순열의 갯수를 구하시오.
(중/고등학교 수학 문제)
38
Backtracking : Permutations (Explained #2)
● {1, 2, 3, 4, 5} 로 이루어진 집합에서
원소 2개로 이루어진 순열을 모두 구하시오.
(프로그래머가 해야하는 것)
39
Backtracking : Permutations (Explained #3)
● {1, 2, 3, 4, 5} 로 이루어진 집합에서
원소 2개로 이루어진 순열을 모두 구하시오.
(프로그래머가 해야하는 것)
하지만 수식은 이미 답을 알고 있다.
So What?
40
Backtracking : Permutations (Explained #4)
● N개 중에서 M개를 뽑아낸 조합으로
나타낼 수 있는 수열의 모든 경우의 수를
계산하면 된다.
● C++ STL에서 제공하는 함수
#include <algorithm>
next_permutation(start, end)
41
Backtracking : Permutations (Explained #5)
● 요약하자면,
N개 중에서 백트래킹으로 뽑아낸 M개의 원소에 대해
<algorithm> 헤더파일에서 정의된 next_permutation 함수를 적용한다!
(즉, M개의 원소로 구성된 집합을 찾고 재귀함수를 종료하는 시점에서)
다음 순열이 존재하면 true 반환
다음 순열이 존재하지 않으면 false를 반환(모든 원소가 내림차순)
false가 반환될 경우, 배열은 다시 오름차순으로 정렬된다.
42
Backtracking : Permutations examples
● (대충 N과 M 시리즈 일부)
● 복면산 문제(아주 재밌습니다 ^^)
● ...
43
예제로 풀어보는
다양한 백트래킹 문제들
44
N과 M (2) #
15650 - 1
● 자연수 N과 M이 주어졌을 때,
아래 조건을 만족하는 길이가 M인 수열을
모두 구하는 프로그램을 작성하시오
○ 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
○ 고른 수열은 오름차순이어야 한다.
○ 1 <= M <= N <= 8
45
N과 M (2) #
15650 - 2
● N = 5, M = 3 인 경우를 나열해보자.
[1,2,3,4,5] 로부터 3개를 중복없이 고르면..
[1,2,3], [1,2,4], [1,2,5], [1,3,4], [1,3,5], [1,4,5],
[2,3,4], [2,3,5], [2,4,5],
[3,4,5]
● 5
C3
= 10개
46
N과 M (2) #
15650 - 3
● N = 5, M = 3 인 경우를 나열한 결과를 잘 분석해보자.
[1,2,3], [1,2,4], [1,2,5], [1,3,4], [1,3,5], [1,4,5],
[2,3,4], [2,3,5], [2,4,5],
[3,4,5]
● 5
C3
= 10개
47
N과 M (2) #
15650 - 4
● [1,2,..,N]에서 M개의 원소를 뽑는 문제는 조합의 문제.
1) M개의 원소를 이미 뽑았거나,
2) 리스트의 끝까지 조회를 끝냈을 경우 재귀함수를 종료한다.
● 뒤의 원소를 보도록 강제한다면
같은 수열인지 두번 이상 체크할 필요가 없게 된다.
48
N과 M (2) #
15650 - 5
● 흔하디 흔한 조합을 구하는 코드.PNG
49
N과 M (2) #
15650 - 6
● 일단, 1부터 집어넣는다.
50
N과 M (2) #
15650 - 7
● element를 배열 v에 집어넣고 나서,
다음 원소를 배열 v에 집어넣을 준비한다.
● 재귀함수를 빠져나오면 element를
배열 v에 포함하지 않았다는 가정하에
재귀적으로 문제를 해결
51
N과 M (2) #
15650 - 8
● element를 계속 집어넣었더니,
배열의 크기가 M에 도달하게 된다면
배열에 있는 원소를 전부 출력하고
재귀함수를 종료
52
N과 M (2) #
15650 - 9
● element를 v에 계속 집어넣으려고 보니
element가 {1,2,3,...,N} 에 포함되지 않으면
아무것도 하지 않고 재귀함수를 그냥 종료
53
복면산!? #
15811
● 알파벳으로 이루어진 식에서,
각각의 알파벳에 0부터 9까지의 수를 대입하여 등식이 성립하는지 확인.
10개 중에서 M개(알파벳이 쓰인 갯수)로 이루어진 순열을 구하면 된다.
● 0부터 9까지의 수가 각각의 알파벳에 매칭되어야 하기 때문에,
알파벳은 10개 넘게 쓰이지 않음.
● 10
P(알파벳이 쓰인 갯수)
<= 10! (= 3628800)
54
컴백홈 #
1189
● 시작점에서 목표지점까지 K번 걸어서
도달가능한 이동경로의 수를 구하는 문제
단, 중복된 지점을 방문하면 안 된다.
● 상/하/좌/우로만 이동할 수 있으며,
목표지점에 도달했을 때 딱 K번 이동해서 도달한 건지 체크해주면 된다.
(재귀함수의 깊이 == K && y좌표 == R - 1 && x 좌표 == C - 1 )
● 저학년일 경우, 5주차 Graph까지 진도나갔다면 풀어볼만함.
55
N-Queen #
9663 - 1
● N-Queen 문제는 크기가 N X N 인 체스판 위에 퀸 N개를
서로 공격할 수 없게 놓는 문제이다.
● N이 주어졌을때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오
● N < 15
56
N-Queen #
9663 - 2
● N = 4인 경우를 예로 들어보자.
한 열에 하나씩 놓을 수 있으니
맨 왼쪽 열부터 놓아보자.
57
N-Queen #
9663 - 3
● N = 4인 경우를 예로 들어보자.
한 열에 하나씩 놓을 수 있으니
맨 왼쪽 열부터 놓아보자.
58
Q X X X
X X
X X
X X
N-Queen #
9663 - 4
● N = 4인 경우를 예로 들어보자.
놓을 수 없는 칸은 고려하지 않는다.
59
Q X X X
X X X
X Q X
X X X X
N-Queen #
9663 - 5
● N = 4인 경우를 예로 들어보자.
세 번째 열에 놓을 수 있는 칸이 없으니
퇴각backtrack
한다.
60
Q X X X
X X
X X
X X
N-Queen #
9663 - 6
● N = 4인 경우를 예로 들어보자.
다음 행에서 재귀적으로 해답을 탐색
61
Q X X X
X X X
X X X
X Q X X
N-Queen #
9663 - 7
● N = 4인 경우를 예로 들어보자.
세번째 열에서도 역시 불가능한 칸은
고려하지 않는다.
62
Q X X X
X X Q X
X X X X
X Q X X
N-Queen #
9663 - 8
● N = 4인 경우를 예로 들어보자.
네번째 열에 둘 칸이 없으니 퇴각한다.
63
Q X X X
X X X
X X X
X Q X X
N-Queen #
9663 - 9
● N = 4인 경우를 예로 들어보자.
네번째 행에서도 해답을 찾을 수 없고,
더 이상 놓을 칸이 없기 때문에,
계속 퇴각한다.
64
Q X X X
X X
X X
X X
N-Queen #
9663 - 10
● N = 4인 경우를 예로 들어보자.
1행 1열에는 퀸을 놓으면
안 된다는 것을 알았다.
65
N-Queen #
9663 - 11
● N = 4인 경우를 예로 들어보자.
하지만 여기에 놓는다면?
66
X X
Q X X X
X X
X X
N-Queen #
9663 - 12
● N = 4인 경우를 예로 들어보자.
두번째 열
- 불가능한 칸은 고려하지 않음.
67
X X
Q X X X
X X X
X Q X X
N-Queen #
9663 - 13
● N = 4인 경우를 예로 들어보자.
세번째 열
- 불가능한 칸은 고려하지 않음.
68
X X Q X
Q X X X
X X X
X Q X X
● N = 4인 경우를 예로 들어보자.
네번째 열까지 다 둘 수 있음
-> 성공
N-Queen #
9663 - 14
69
X X Q X
Q X X X
X X X Q
X Q X X
● used : i번째 열에 놓은 여왕말의 위치(j행 i열)/ans : 가능한 경우의 수
N-Queen #
9663 - 15
70
● col : 현재 열 번호.
실제로는 0번 열부터 n-1번 열까지 탐색하지만,
col == n이라면 경우의 수를 하나 찾은 것이라고 봐도 된다.
(이전의 모든 열에서 하나씩 놓았기 때문)
N-Queen #
9663 - 16
71
● disabled : 현재 열에서 놓을 수 없는 칸 번호들.
전 열들에 어떤 칸에 퀸이 놓였는지 체크하면서 (몇번째 행에 놓았는지)
현재 열에 놓일 수 없는 곳들을 마킹한다. => 가로 체크
● up/down : j행 i열에 놓은 여왕말을 기준으로
현재 열에서 놓을 수 없는 여왕말의 대각선 위치
N-Queen #
9663 - 17
72
● 놓일 수 없는 칸들을 무시하고 재귀적으로 탐색한다.
N-Queen #
9663 - 18
73
● 퇴각하는 경우를 고려해 다음 열들을 본 후, 이 열에서 퀸을 없애준다.
N-Queen #
9663 - 19
74
● 아무것도 놓지 않은 경우에서부터 재귀적으로 탐색
N-Queen #
9663 - 19
75
Caution!! (엄격)(근엄)(진지)
● 재귀 탈출 조건은 제대로 명시할 것
○ 시간 초과, 메모리 초과(스택 오버플로우) 터지면 채점 서버가 많이 아파해요… ㅜㅜ
● 재귀 함수 내에서 다른 재귀함수를 호출하는 횟수(분기의 갯수),
재귀 함수에서 도달가능한 콜 스택 최대 깊이를 잘 고려할 것.
○ 함수 오버헤드 비용을 고려하지 않더라도,
Search Space를 얼마나 탐색하게 되는지 정량적으로 계산해야 합니다.
○ 재귀호출을 할 때마다 일정한 수만큼 분기가 나뉘게 된다면 기하급수를 계산해야함
■ 고등학교때 배운 기하급수 공식을 생각해봅시다.
76
● 대회 환경에 깔려 있는 스크립트 언어를 최대한 활용하세요.
○ ex) Python, 웹브라우저에 깔려있는 Javascript(Ctrl+Shift+I 누르면 뜨는 그거)
● Javascript의 경우
○ 매번 분기가 4개씩 나뉘고 N <= 12인 상황에서 백트래킹을 적용해도 되는지 계산해보기
■ 4 ** 12 => 2**24 ~= 10 ** 7 이기 때문에 백트래킹을 적용해도 됨.
○ N <= 12 인 상황에서 순열을 이용해서 백트래킹을 적용해도 되는지 계산해보기
■ [...(Array(13)).keys()].slice(1).reduce((acc, elem) => acc * elem)
■ 12! = 479001600 => 아슬아슬하지만 10**9는 넘지 않기 때문에 비벼도 됨
TIP : 시간복잡도 즉석에서 계산하기
77
이번주의 문제셋
● N과 M (2) #
15650
● 복면산!? #
15811
● N-Queen #
9663
● 스도쿠 #
2580
● N과 M (1) #
15649
● N과 M (3) #
15651
● N과 M (4) #
15652
● N과 M (5) #
15654
● N과 M (6) #
15655
● N과 M (7) #
15656
● N과 M (8) #
15657
● Barbells #
13751
● 로또 #
6603
● 숫자판 점프 #
2210
● 암호 만들기 #
1759
● 좋은 수열 #
2661
● 알파벳 #
1987
● 단어 수학 #
1339
78
감사합니다
79

More Related Content

What's hot

Probability Concept and Bayes Theorem
Probability Concept and Bayes TheoremProbability Concept and Bayes Theorem
Probability Concept and Bayes TheoremCherryBerry2
 
Formulas of Probability :Class 12 maths
Formulas of Probability :Class 12 mathsFormulas of Probability :Class 12 maths
Formulas of Probability :Class 12 mathssumanmathews
 
Lesson 11 1 probability
Lesson 11 1 probabilityLesson 11 1 probability
Lesson 11 1 probabilitymlabuski
 
Probability basics and bayes' theorem
Probability basics and bayes' theoremProbability basics and bayes' theorem
Probability basics and bayes' theoremBalaji P
 
PEMODELAN SISTEM PAKAR UNTUK DIAGNOSA PENYAKIT TANAMAN JAGUNG MENGGUNKAN METO...
PEMODELAN SISTEM PAKAR UNTUK DIAGNOSA PENYAKIT TANAMAN JAGUNG MENGGUNKAN METO...PEMODELAN SISTEM PAKAR UNTUK DIAGNOSA PENYAKIT TANAMAN JAGUNG MENGGUNKAN METO...
PEMODELAN SISTEM PAKAR UNTUK DIAGNOSA PENYAKIT TANAMAN JAGUNG MENGGUNKAN METO...Yadih Si
 
Introduction to Bayesian Inference
Introduction to Bayesian InferenceIntroduction to Bayesian Inference
Introduction to Bayesian InferenceSteven Scott
 
Science in ancient india by subhash kak
Science in ancient india by subhash kakScience in ancient india by subhash kak
Science in ancient india by subhash kakSajjana Bharathi
 
Basic of Statistical Inference Part-III: The Theory of Estimation from Dexlab...
Basic of Statistical Inference Part-III: The Theory of Estimation from Dexlab...Basic of Statistical Inference Part-III: The Theory of Estimation from Dexlab...
Basic of Statistical Inference Part-III: The Theory of Estimation from Dexlab...Dexlab Analytics
 
Interval Estimation & Estimation Of Proportion
Interval Estimation & Estimation Of ProportionInterval Estimation & Estimation Of Proportion
Interval Estimation & Estimation Of ProportionDataminingTools Inc
 
Probability 4.2
Probability 4.2Probability 4.2
Probability 4.2herbison
 
Probability Theory MSc BA Sem 2.pdf
Probability Theory MSc BA Sem 2.pdfProbability Theory MSc BA Sem 2.pdf
Probability Theory MSc BA Sem 2.pdfssuserd329601
 
Theorems And Conditional Probability
Theorems And Conditional ProbabilityTheorems And Conditional Probability
Theorems And Conditional Probabilitymathscontent
 

What's hot (20)

Probability Distribution
Probability DistributionProbability Distribution
Probability Distribution
 
Poisson Probability Distributions
Poisson Probability DistributionsPoisson Probability Distributions
Poisson Probability Distributions
 
Practice Test 2 Solutions
Practice Test 2  SolutionsPractice Test 2  Solutions
Practice Test 2 Solutions
 
Probability Concept and Bayes Theorem
Probability Concept and Bayes TheoremProbability Concept and Bayes Theorem
Probability Concept and Bayes Theorem
 
Formulas of Probability :Class 12 maths
Formulas of Probability :Class 12 mathsFormulas of Probability :Class 12 maths
Formulas of Probability :Class 12 maths
 
Lesson 11 1 probability
Lesson 11 1 probabilityLesson 11 1 probability
Lesson 11 1 probability
 
Probability basics and bayes' theorem
Probability basics and bayes' theoremProbability basics and bayes' theorem
Probability basics and bayes' theorem
 
PEMODELAN SISTEM PAKAR UNTUK DIAGNOSA PENYAKIT TANAMAN JAGUNG MENGGUNKAN METO...
PEMODELAN SISTEM PAKAR UNTUK DIAGNOSA PENYAKIT TANAMAN JAGUNG MENGGUNKAN METO...PEMODELAN SISTEM PAKAR UNTUK DIAGNOSA PENYAKIT TANAMAN JAGUNG MENGGUNKAN METO...
PEMODELAN SISTEM PAKAR UNTUK DIAGNOSA PENYAKIT TANAMAN JAGUNG MENGGUNKAN METO...
 
Introduction to Bayesian Inference
Introduction to Bayesian InferenceIntroduction to Bayesian Inference
Introduction to Bayesian Inference
 
Science in ancient india by subhash kak
Science in ancient india by subhash kakScience in ancient india by subhash kak
Science in ancient india by subhash kak
 
Counting
CountingCounting
Counting
 
Binomial Probability Distributions
Binomial Probability DistributionsBinomial Probability Distributions
Binomial Probability Distributions
 
Basic of Statistical Inference Part-III: The Theory of Estimation from Dexlab...
Basic of Statistical Inference Part-III: The Theory of Estimation from Dexlab...Basic of Statistical Inference Part-III: The Theory of Estimation from Dexlab...
Basic of Statistical Inference Part-III: The Theory of Estimation from Dexlab...
 
Interval Estimation & Estimation Of Proportion
Interval Estimation & Estimation Of ProportionInterval Estimation & Estimation Of Proportion
Interval Estimation & Estimation Of Proportion
 
Probability 4.2
Probability 4.2Probability 4.2
Probability 4.2
 
Probability Theory MSc BA Sem 2.pdf
Probability Theory MSc BA Sem 2.pdfProbability Theory MSc BA Sem 2.pdf
Probability Theory MSc BA Sem 2.pdf
 
Probability
ProbabilityProbability
Probability
 
Probability
ProbabilityProbability
Probability
 
Theorems And Conditional Probability
Theorems And Conditional ProbabilityTheorems And Conditional Probability
Theorems And Conditional Probability
 
Probability distributionv1
Probability distributionv1Probability distributionv1
Probability distributionv1
 

Similar to Backtracking [ICPC Sinchon]

[연세대 모르고리즘] 프로그래밍 경진대회 문제 풀이
[연세대 모르고리즘] 프로그래밍 경진대회 문제 풀이[연세대 모르고리즘] 프로그래밍 경진대회 문제 풀이
[연세대 모르고리즘] 프로그래밍 경진대회 문제 풀이NAVER D2
 
HI-ARC PS 102 Brute Force
HI-ARC PS 102 Brute ForceHI-ARC PS 102 Brute Force
HI-ARC PS 102 Brute ForceJae-yeol Lee
 
이산치3보고서
이산치3보고서이산치3보고서
이산치3보고서KimChangHoen
 
120609 알고리즘 트레이닝 북 작은비숍
120609 알고리즘 트레이닝 북   작은비숍120609 알고리즘 트레이닝 북   작은비숍
120609 알고리즘 트레이닝 북 작은비숍tedypicker
 
세미나
세미나세미나
세미나Dongyi Kim
 
2017 cupc solution
2017 cupc solution2017 cupc solution
2017 cupc solutionJoona Yoon
 
Neural network (perceptron)
Neural network (perceptron)Neural network (perceptron)
Neural network (perceptron)Jeonghun Yoon
 
Deep Learning from scratch 5장 : backpropagation
 Deep Learning from scratch 5장 : backpropagation Deep Learning from scratch 5장 : backpropagation
Deep Learning from scratch 5장 : backpropagationJinSooKim80
 
인하대 프로그래밍 경진대회 - 문제풀이
인하대 프로그래밍 경진대회 - 문제풀이인하대 프로그래밍 경진대회 - 문제풀이
인하대 프로그래밍 경진대회 - 문제풀이NAVER D2
 
하스켈로 알고리즘 문제 풀기
하스켈로 알고리즘 문제 풀기하스켈로 알고리즘 문제 풀기
하스켈로 알고리즘 문제 풀기민석 이
 
알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)
알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)
알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)HYUNJEONG KIM
 
Lecture 4: Neural Networks I
Lecture 4: Neural Networks ILecture 4: Neural Networks I
Lecture 4: Neural Networks ISang Jun Lee
 
IOI 2005 정원 분할 (2015.03.05)
IOI 2005 정원 분할 (2015.03.05)IOI 2005 정원 분할 (2015.03.05)
IOI 2005 정원 분할 (2015.03.05)Jaehyun Koo
 
2012 Dm C3 03
2012 Dm C3 032012 Dm C3 03
2012 Dm C3 03chl132435
 
자바로 Mnist 구현하고_스프링웹서버붙이기
자바로 Mnist 구현하고_스프링웹서버붙이기자바로 Mnist 구현하고_스프링웹서버붙이기
자바로 Mnist 구현하고_스프링웹서버붙이기라한사 아
 
2018 Ajou Programming Contest solutions
2018 Ajou Programming Contest solutions2018 Ajou Programming Contest solutions
2018 Ajou Programming Contest solutions현정 김
 
Computational Complexity
Computational ComplexityComputational Complexity
Computational Complexityskku_npc
 

Similar to Backtracking [ICPC Sinchon] (20)

[연세대 모르고리즘] 프로그래밍 경진대회 문제 풀이
[연세대 모르고리즘] 프로그래밍 경진대회 문제 풀이[연세대 모르고리즘] 프로그래밍 경진대회 문제 풀이
[연세대 모르고리즘] 프로그래밍 경진대회 문제 풀이
 
HI-ARC PS 102 Brute Force
HI-ARC PS 102 Brute ForceHI-ARC PS 102 Brute Force
HI-ARC PS 102 Brute Force
 
이산치3보고서
이산치3보고서이산치3보고서
이산치3보고서
 
120609 알고리즘 트레이닝 북 작은비숍
120609 알고리즘 트레이닝 북   작은비숍120609 알고리즘 트레이닝 북   작은비숍
120609 알고리즘 트레이닝 북 작은비숍
 
세미나
세미나세미나
세미나
 
2016 UCPC 풀이
2016 UCPC 풀이2016 UCPC 풀이
2016 UCPC 풀이
 
2017 cupc solution
2017 cupc solution2017 cupc solution
2017 cupc solution
 
Neural network (perceptron)
Neural network (perceptron)Neural network (perceptron)
Neural network (perceptron)
 
Deep Learning from scratch 5장 : backpropagation
 Deep Learning from scratch 5장 : backpropagation Deep Learning from scratch 5장 : backpropagation
Deep Learning from scratch 5장 : backpropagation
 
인하대 프로그래밍 경진대회 - 문제풀이
인하대 프로그래밍 경진대회 - 문제풀이인하대 프로그래밍 경진대회 - 문제풀이
인하대 프로그래밍 경진대회 - 문제풀이
 
하스켈로 알고리즘 문제 풀기
하스켈로 알고리즘 문제 풀기하스켈로 알고리즘 문제 풀기
하스켈로 알고리즘 문제 풀기
 
알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)
알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)
알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)
 
Lecture 4: Neural Networks I
Lecture 4: Neural Networks ILecture 4: Neural Networks I
Lecture 4: Neural Networks I
 
IOI 2005 정원 분할 (2015.03.05)
IOI 2005 정원 분할 (2015.03.05)IOI 2005 정원 분할 (2015.03.05)
IOI 2005 정원 분할 (2015.03.05)
 
internetinternet
internetinternetinternetinternet
internetinternet
 
2012 Dm C3 03
2012 Dm C3 032012 Dm C3 03
2012 Dm C3 03
 
자바로 Mnist 구현하고_스프링웹서버붙이기
자바로 Mnist 구현하고_스프링웹서버붙이기자바로 Mnist 구현하고_스프링웹서버붙이기
자바로 Mnist 구현하고_스프링웹서버붙이기
 
2018 Ajou Programming Contest solutions
2018 Ajou Programming Contest solutions2018 Ajou Programming Contest solutions
2018 Ajou Programming Contest solutions
 
Variational AutoEncoder(VAE)
Variational AutoEncoder(VAE)Variational AutoEncoder(VAE)
Variational AutoEncoder(VAE)
 
Computational Complexity
Computational ComplexityComputational Complexity
Computational Complexity
 

More from Jae-yeol Lee

[PyCon KR 2023 Lightning talk day1] 개밥먹기 주도 개발
[PyCon KR 2023 Lightning talk day1] 개밥먹기 주도 개발[PyCon KR 2023 Lightning talk day1] 개밥먹기 주도 개발
[PyCon KR 2023 Lightning talk day1] 개밥먹기 주도 개발Jae-yeol Lee
 
Browser Engineering - Ch1 Summary
Browser Engineering - Ch1 SummaryBrowser Engineering - Ch1 Summary
Browser Engineering - Ch1 SummaryJae-yeol Lee
 
HI-ARC Number Theory
HI-ARC Number TheoryHI-ARC Number Theory
HI-ARC Number TheoryJae-yeol Lee
 
HI-ARC PS 102 Bitmask
HI-ARC PS 102 BitmaskHI-ARC PS 102 Bitmask
HI-ARC PS 102 BitmaskJae-yeol Lee
 
HI-ARC ACM ICPC TF #5 (ADVANCED DFS)
HI-ARC ACM ICPC TF #5 (ADVANCED DFS)HI-ARC ACM ICPC TF #5 (ADVANCED DFS)
HI-ARC ACM ICPC TF #5 (ADVANCED DFS)Jae-yeol Lee
 
HI-ARC ACM-ICPC 준비반 - KMP algorithm
HI-ARC ACM-ICPC 준비반 - KMP algorithmHI-ARC ACM-ICPC 준비반 - KMP algorithm
HI-ARC ACM-ICPC 준비반 - KMP algorithmJae-yeol Lee
 
Github + Heroku + Circle CI 를 이용한 Django Application 배포 자동화
Github + Heroku + Circle CI 를 이용한 Django Application 배포 자동화Github + Heroku + Circle CI 를 이용한 Django Application 배포 자동화
Github + Heroku + Circle CI 를 이용한 Django Application 배포 자동화Jae-yeol Lee
 
HI-ARC 정기모임 #7 BFS
HI-ARC 정기모임 #7 BFSHI-ARC 정기모임 #7 BFS
HI-ARC 정기모임 #7 BFSJae-yeol Lee
 
HI-ARC 정기모임 #6 dfs
HI-ARC 정기모임 #6 dfsHI-ARC 정기모임 #6 dfs
HI-ARC 정기모임 #6 dfsJae-yeol Lee
 
[APL OJT] REST API TEST
[APL OJT] REST API TEST[APL OJT] REST API TEST
[APL OJT] REST API TESTJae-yeol Lee
 
Embedded project presentation
Embedded project presentationEmbedded project presentation
Embedded project presentationJae-yeol Lee
 

More from Jae-yeol Lee (13)

[PyCon KR 2023 Lightning talk day1] 개밥먹기 주도 개발
[PyCon KR 2023 Lightning talk day1] 개밥먹기 주도 개발[PyCon KR 2023 Lightning talk day1] 개밥먹기 주도 개발
[PyCon KR 2023 Lightning talk day1] 개밥먹기 주도 개발
 
Browser Engineering - Ch1 Summary
Browser Engineering - Ch1 SummaryBrowser Engineering - Ch1 Summary
Browser Engineering - Ch1 Summary
 
Whats new rails 7
Whats new   rails 7Whats new   rails 7
Whats new rails 7
 
HI-ARC Number Theory
HI-ARC Number TheoryHI-ARC Number Theory
HI-ARC Number Theory
 
HI-ARC PS 102 Bitmask
HI-ARC PS 102 BitmaskHI-ARC PS 102 Bitmask
HI-ARC PS 102 Bitmask
 
HI-ARC PS 101
HI-ARC PS 101HI-ARC PS 101
HI-ARC PS 101
 
HI-ARC ACM ICPC TF #5 (ADVANCED DFS)
HI-ARC ACM ICPC TF #5 (ADVANCED DFS)HI-ARC ACM ICPC TF #5 (ADVANCED DFS)
HI-ARC ACM ICPC TF #5 (ADVANCED DFS)
 
HI-ARC ACM-ICPC 준비반 - KMP algorithm
HI-ARC ACM-ICPC 준비반 - KMP algorithmHI-ARC ACM-ICPC 준비반 - KMP algorithm
HI-ARC ACM-ICPC 준비반 - KMP algorithm
 
Github + Heroku + Circle CI 를 이용한 Django Application 배포 자동화
Github + Heroku + Circle CI 를 이용한 Django Application 배포 자동화Github + Heroku + Circle CI 를 이용한 Django Application 배포 자동화
Github + Heroku + Circle CI 를 이용한 Django Application 배포 자동화
 
HI-ARC 정기모임 #7 BFS
HI-ARC 정기모임 #7 BFSHI-ARC 정기모임 #7 BFS
HI-ARC 정기모임 #7 BFS
 
HI-ARC 정기모임 #6 dfs
HI-ARC 정기모임 #6 dfsHI-ARC 정기모임 #6 dfs
HI-ARC 정기모임 #6 dfs
 
[APL OJT] REST API TEST
[APL OJT] REST API TEST[APL OJT] REST API TEST
[APL OJT] REST API TEST
 
Embedded project presentation
Embedded project presentationEmbedded project presentation
Embedded project presentation
 

Backtracking [ICPC Sinchon]

  • 2. About Speaker ● 이재열 a.k.a. KodingWarrior(개인사업자 코딩워리어) ● 홍익대학교 알고리즘 학회 HI-ARC 창립 멤버 ● HI-ARC 2대 학회장 ('17.09 ~ '18.09) ● 어쩌다보니 ICPC 신촌 스탭 ● 블록체인 스타트업에서 일하는 휴학생 직장인 ○ 아직 졸업 못함 ㅜㅜ ● 친구하실 분 구함 (fb.com/kodingwarrior, insta: @kodingwarrior) 2
  • 3. About HI-ARC ● 홍익대학교의 알고리즘 학회 Hong Ik Algorithm Research Club 페이스북 페이지 : fb.com/hongikuniv.hiarc 공식 홈페이지 : hi-arc.github.io 3
  • 5. ● 슬랙 대화 입력창 하단에 클립 버튼을 클릭 후, Code or text snippet 글씨를 클릭합니다. 코드 질문 올리는 방법 5
  • 7. Background : Brute Force #1 ● Brute Force ○ 할 수 있는 방법은 다 시도해보는 방법이다. ■ == 효율성 고려하지 않고 막 짜면 된다. ○ 별 다른 방법이 생각나지 않는다면 한번 시도해볼만 하다. ○ Brute Force를 나타내는 여러가지 표현들 ■ 전수조사 ■ 무작정 시도해보기 ■ 완전탐색(Exhautive Search) ■ 각개격파 ■ 무식한 방법(직역) ■ .... 7
  • 8. Background : Brute Force #2 ● Brute Force를 시도하는 여러가지 방법들 (#1) ○ for문 혹은 while문이 한번만 들어간 반복문 8 for (int x = 0; x <= MAX_X; ++x) solve(x);
  • 9. Background : Brute Force #3 ● Brute Force를 시도하는 여러가지 방법들 (#2) ○ for문 혹은 while문이 2회 이상 중첩된 반복문 ○ 2개 이상의 변수에 따라 결과값이 다르게 튀어나오기 때문에, 각각의 값을 다르게 변화시키면서 관찰한다. (하지만 규칙은 알 방법이 없다) ○ 경우에 따라서 포함-배제의 원리를 쓰기도 한다. ■ 백설공주와 일곱난쟁이 9 for (int x = 0; x <= MAX_X; ++x) for (int y = 0; y <= MAX_Y; ++y) solve(x, y);
  • 10. Background : Brute Force #4 ● Brute Force를 시도하는 여러가지 방법들 (#3) ○ 반복문을 동적으로 중첩시킬 수만은 없으니 재귀함수를 쓰기도 한다. ○ 이러한 트릭이 백트래킹에서 자주 사용된다. 10 for(int i = 0; i <= N; ++i) for(int j = i + 1; j <= N; ++j) for(int k = j + 1; k <= N; ++k) … (아무튼 for 문이 계속 중첩) do_something(); void solve(int index, int N, int depth, int limit) { if (depth == limit) { do_something(); } for (int next = index + 1; next <= N; ++next) { solve(next, N, depth + 1, limit); } } 재귀 함수의 깊이가 하나 늘었다는 것을 명시 재귀함수의 깊이가 특정 레벨까지 도달하면 그제서야 실행하고자 하는 함수를 실행
  • 11. What is Backtracking? ● 말은 번지르르하게 백트래킹이라 하지만, 접근하는 방식 자체는 Brute Force라고 봐도 된다. ○ 재귀함수로 Brute Force를 시도하는 것 ○ 더 빠른 방법은 마땅히 없어 보이기 때문에 현재 상태에서 도달가능한 모든 상태를 무식하게 재귀적으로 뒤져본다. ■ 불가능한 후보 상태는 탐색하지 않는다. ○ 뒤져봐도 방법이 없으면 되돌아가서(backtrack) 다른 방법을 시도해본다. 11
  • 12. Backtracking in Real World ● 우리는 이미 백트래킹을 암묵적으로 알고 있다. ● ex) Undertale (93개의 엔딩) 출처: https://imgur.com/r/undertale/6wNQy8i 12
  • 13. 13
  • 14. Backtracking : 0-1 Knapsack #1 ● 물건을 넣고 뺄 수 있는 가방이 주어진다. ● 가방에 넣고 뺄 수 있는 물건은 N가지이며, 하나씩만 넣을 수 있다. ● 그리고 가방의 중량제한은 W ● 물건을 넣고 빼면서 무게의 총합이 W를 넘지 않아야 한다. ○ 수식으로 나타내면 아래와 같이 나타낼 수 있다. 14
  • 15. Backtracking : 0-1 Knapsack #2 ● 이 문제를 어떻게 재귀적으로 풀어낼 수 있는지 그림으로 이해해보도록 하자. 15
  • 16. 16
  • 17. 17
  • 18. 18
  • 19. 19
  • 20. 20
  • 21. Backtracking : 0-1 Knapsack examples ● 부분 집합의 합이 주어진 제약을 만족하는 경우의 수 구하기 21
  • 22. Backtracking : Combinations ● N개 중에서 M개를 중복없이 선택하는 문제 ● 네. 맞습니다. N과 M 시리즈가 아주 웰노운입니다. 22
  • 23. Backtracking : Combinations (Explained #1) ● {1, 2, 3, 4, 5} 로 이루어진 집합에서 원소 2개로 이루어진 부분 집합의 갯수를 구하시오. (중/고등학교 수학 문제) 23
  • 24. Backtracking : Combinations (Explained #2) ● {1, 2, 3, 4, 5} 로 이루어진 집합에서 원소 2개로 이루어진 부분 집합을 모두 구하시오. (프로그래머가 하는 것) 24
  • 25. Backtracking : Combinations (Explained #3) ● {1, 2, 3, 4, 5} 로 이루어진 집합에서 원소 2개로 이루어진 부분 집합을 모두 구하시오. (프로그래머가 하는 것) {1, 1}, {1, 2}, {1, 3}, {1, 4}, {1, 5}, {2, 1}, {2. 2}, {2, 3}, {2, 4}, {2, 5}, {3, 1}, {3, 2}, {3, 3}, {3, 4}, {3, 5}, {4, 1}, {4, 2}, {4, 3}, {4, 4}, {4, 5}, {5, 1}, {5, 2}, {5, 3}, {5, 4}, {5, 5} 25
  • 26. Backtracking : Combinations (Explained #4) ● {1, 2, 3, 4, 5} 로 이루어진 집합에서 원소 2개로 이루어진 부분 집합을 모두 구하시오. (프로그래머가 하는 것) {1, 1}, {1, 2}, {1, 3}, {1, 4}, {1, 5}, {2, 1}, {2, 2}, {2, 3}, {2, 4}, {2, 5}, {3, 1}, {3, 2}, {3, 3}, {3, 4}, {3, 5}, {4, 1}, {4, 2}, {4, 3}, {4, 4}, {4, 5}, {5, 1}, {5, 2}, {5, 3}, {5, 4}, {5, 5} 26 이런건 그냥 2차원 for문으로 구현해도 된다.
  • 27. Backtracking : Combinations (Explained #5) ● N개의 원소로 이루어진 집합에서 원소 M개로 이루어진 부분 집합들을 모두 구하시오. M == 1 일 경우, 1중 for 문 M == 2 일 경우, 2중 for 문 M == 3 일 경우, 3중 for 문 ... 27
  • 28. Backtracking : Combinations (Explained #6) ● 점화식 정의에서 힌트를 얻자. ● Point 1 n개의 원소에서 k개 원소를 이미 선택했는데, (이전) 원소 하나를 덤으로 뽑아서 총 원소가 n+1개인가? (현재) ● Point 2 n개의 원소에서 k-1개의 원소를 원하는 걸로 선택했는데, (이전) 원소 하나를 뽑고 나니 총 원소가 n+1개이고 k개 만큼 선택하게 된 것인가? (현재) 28
  • 29. Backtracking : Combinations (Explained #7) ● 점화식 정의에서 힌트를 얻자. ● Point 1 n개의 원소에서 k개 원소를 이미 선택했는데, (이전) 원소 하나를 덤으로 뽑아서 총 원소가 n+1개인가? (현재) ● Point 2 n개의 원소에서 k-1개의 원소를 원하는 걸로 선택했는데, (이전) 원소 하나를 뽑고 나니 총 원소가 n+1개이고 k개 만큼 선택하게 된 것인가? (현재) 29 1번의 경우일 수도 있고,(OR) 2번의 경우일 수도 있으므로 덧셈으로 합친다. (독립적이므로 '합의 법칙'을 적용)
  • 30. Backtracking : Combinations (Explained #8) ● 도식화하면서 이해해보자 30
  • 31. 31
  • 32. 32
  • 33. 33
  • 34. 34
  • 35. 35
  • 36. Backtracking : Combinations examples ● (대충 N과 M 시리즈 여러개) ● 크기가 n인 부분집합을 구하기 ● 36
  • 37. Backtracking : Permutations ● N개 중에서 M개를 순서를 고려하여 선택하는 문제 ● N개 중에서 M개를 뽑은 조합에 next_permutation을 싸서 드셔보세요! ● N과 M 시리즈에도 포함되어 있습니다. ● 아! 복면산 아시는구나! 정말 재.밌.습.니.다. 37
  • 38. Backtracking : Permutations (Explained #1) ● {1, 2, 3, 4, 5} 로 이루어진 집합에서 원소 2개로 이루어진 순열의 갯수를 구하시오. (중/고등학교 수학 문제) 38
  • 39. Backtracking : Permutations (Explained #2) ● {1, 2, 3, 4, 5} 로 이루어진 집합에서 원소 2개로 이루어진 순열을 모두 구하시오. (프로그래머가 해야하는 것) 39
  • 40. Backtracking : Permutations (Explained #3) ● {1, 2, 3, 4, 5} 로 이루어진 집합에서 원소 2개로 이루어진 순열을 모두 구하시오. (프로그래머가 해야하는 것) 하지만 수식은 이미 답을 알고 있다. So What? 40
  • 41. Backtracking : Permutations (Explained #4) ● N개 중에서 M개를 뽑아낸 조합으로 나타낼 수 있는 수열의 모든 경우의 수를 계산하면 된다. ● C++ STL에서 제공하는 함수 #include <algorithm> next_permutation(start, end) 41
  • 42. Backtracking : Permutations (Explained #5) ● 요약하자면, N개 중에서 백트래킹으로 뽑아낸 M개의 원소에 대해 <algorithm> 헤더파일에서 정의된 next_permutation 함수를 적용한다! (즉, M개의 원소로 구성된 집합을 찾고 재귀함수를 종료하는 시점에서) 다음 순열이 존재하면 true 반환 다음 순열이 존재하지 않으면 false를 반환(모든 원소가 내림차순) false가 반환될 경우, 배열은 다시 오름차순으로 정렬된다. 42
  • 43. Backtracking : Permutations examples ● (대충 N과 M 시리즈 일부) ● 복면산 문제(아주 재밌습니다 ^^) ● ... 43
  • 45. N과 M (2) # 15650 - 1 ● 자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오 ○ 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열 ○ 고른 수열은 오름차순이어야 한다. ○ 1 <= M <= N <= 8 45
  • 46. N과 M (2) # 15650 - 2 ● N = 5, M = 3 인 경우를 나열해보자. [1,2,3,4,5] 로부터 3개를 중복없이 고르면.. [1,2,3], [1,2,4], [1,2,5], [1,3,4], [1,3,5], [1,4,5], [2,3,4], [2,3,5], [2,4,5], [3,4,5] ● 5 C3 = 10개 46
  • 47. N과 M (2) # 15650 - 3 ● N = 5, M = 3 인 경우를 나열한 결과를 잘 분석해보자. [1,2,3], [1,2,4], [1,2,5], [1,3,4], [1,3,5], [1,4,5], [2,3,4], [2,3,5], [2,4,5], [3,4,5] ● 5 C3 = 10개 47
  • 48. N과 M (2) # 15650 - 4 ● [1,2,..,N]에서 M개의 원소를 뽑는 문제는 조합의 문제. 1) M개의 원소를 이미 뽑았거나, 2) 리스트의 끝까지 조회를 끝냈을 경우 재귀함수를 종료한다. ● 뒤의 원소를 보도록 강제한다면 같은 수열인지 두번 이상 체크할 필요가 없게 된다. 48
  • 49. N과 M (2) # 15650 - 5 ● 흔하디 흔한 조합을 구하는 코드.PNG 49
  • 50. N과 M (2) # 15650 - 6 ● 일단, 1부터 집어넣는다. 50
  • 51. N과 M (2) # 15650 - 7 ● element를 배열 v에 집어넣고 나서, 다음 원소를 배열 v에 집어넣을 준비한다. ● 재귀함수를 빠져나오면 element를 배열 v에 포함하지 않았다는 가정하에 재귀적으로 문제를 해결 51
  • 52. N과 M (2) # 15650 - 8 ● element를 계속 집어넣었더니, 배열의 크기가 M에 도달하게 된다면 배열에 있는 원소를 전부 출력하고 재귀함수를 종료 52
  • 53. N과 M (2) # 15650 - 9 ● element를 v에 계속 집어넣으려고 보니 element가 {1,2,3,...,N} 에 포함되지 않으면 아무것도 하지 않고 재귀함수를 그냥 종료 53
  • 54. 복면산!? # 15811 ● 알파벳으로 이루어진 식에서, 각각의 알파벳에 0부터 9까지의 수를 대입하여 등식이 성립하는지 확인. 10개 중에서 M개(알파벳이 쓰인 갯수)로 이루어진 순열을 구하면 된다. ● 0부터 9까지의 수가 각각의 알파벳에 매칭되어야 하기 때문에, 알파벳은 10개 넘게 쓰이지 않음. ● 10 P(알파벳이 쓰인 갯수) <= 10! (= 3628800) 54
  • 55. 컴백홈 # 1189 ● 시작점에서 목표지점까지 K번 걸어서 도달가능한 이동경로의 수를 구하는 문제 단, 중복된 지점을 방문하면 안 된다. ● 상/하/좌/우로만 이동할 수 있으며, 목표지점에 도달했을 때 딱 K번 이동해서 도달한 건지 체크해주면 된다. (재귀함수의 깊이 == K && y좌표 == R - 1 && x 좌표 == C - 1 ) ● 저학년일 경우, 5주차 Graph까지 진도나갔다면 풀어볼만함. 55
  • 56. N-Queen # 9663 - 1 ● N-Queen 문제는 크기가 N X N 인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. ● N이 주어졌을때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오 ● N < 15 56
  • 57. N-Queen # 9663 - 2 ● N = 4인 경우를 예로 들어보자. 한 열에 하나씩 놓을 수 있으니 맨 왼쪽 열부터 놓아보자. 57
  • 58. N-Queen # 9663 - 3 ● N = 4인 경우를 예로 들어보자. 한 열에 하나씩 놓을 수 있으니 맨 왼쪽 열부터 놓아보자. 58 Q X X X X X X X X X
  • 59. N-Queen # 9663 - 4 ● N = 4인 경우를 예로 들어보자. 놓을 수 없는 칸은 고려하지 않는다. 59 Q X X X X X X X Q X X X X X
  • 60. N-Queen # 9663 - 5 ● N = 4인 경우를 예로 들어보자. 세 번째 열에 놓을 수 있는 칸이 없으니 퇴각backtrack 한다. 60 Q X X X X X X X X X
  • 61. N-Queen # 9663 - 6 ● N = 4인 경우를 예로 들어보자. 다음 행에서 재귀적으로 해답을 탐색 61 Q X X X X X X X X X X Q X X
  • 62. N-Queen # 9663 - 7 ● N = 4인 경우를 예로 들어보자. 세번째 열에서도 역시 불가능한 칸은 고려하지 않는다. 62 Q X X X X X Q X X X X X X Q X X
  • 63. N-Queen # 9663 - 8 ● N = 4인 경우를 예로 들어보자. 네번째 열에 둘 칸이 없으니 퇴각한다. 63 Q X X X X X X X X X X Q X X
  • 64. N-Queen # 9663 - 9 ● N = 4인 경우를 예로 들어보자. 네번째 행에서도 해답을 찾을 수 없고, 더 이상 놓을 칸이 없기 때문에, 계속 퇴각한다. 64 Q X X X X X X X X X
  • 65. N-Queen # 9663 - 10 ● N = 4인 경우를 예로 들어보자. 1행 1열에는 퀸을 놓으면 안 된다는 것을 알았다. 65
  • 66. N-Queen # 9663 - 11 ● N = 4인 경우를 예로 들어보자. 하지만 여기에 놓는다면? 66 X X Q X X X X X X X
  • 67. N-Queen # 9663 - 12 ● N = 4인 경우를 예로 들어보자. 두번째 열 - 불가능한 칸은 고려하지 않음. 67 X X Q X X X X X X X Q X X
  • 68. N-Queen # 9663 - 13 ● N = 4인 경우를 예로 들어보자. 세번째 열 - 불가능한 칸은 고려하지 않음. 68 X X Q X Q X X X X X X X Q X X
  • 69. ● N = 4인 경우를 예로 들어보자. 네번째 열까지 다 둘 수 있음 -> 성공 N-Queen # 9663 - 14 69 X X Q X Q X X X X X X Q X Q X X
  • 70. ● used : i번째 열에 놓은 여왕말의 위치(j행 i열)/ans : 가능한 경우의 수 N-Queen # 9663 - 15 70
  • 71. ● col : 현재 열 번호. 실제로는 0번 열부터 n-1번 열까지 탐색하지만, col == n이라면 경우의 수를 하나 찾은 것이라고 봐도 된다. (이전의 모든 열에서 하나씩 놓았기 때문) N-Queen # 9663 - 16 71
  • 72. ● disabled : 현재 열에서 놓을 수 없는 칸 번호들. 전 열들에 어떤 칸에 퀸이 놓였는지 체크하면서 (몇번째 행에 놓았는지) 현재 열에 놓일 수 없는 곳들을 마킹한다. => 가로 체크 ● up/down : j행 i열에 놓은 여왕말을 기준으로 현재 열에서 놓을 수 없는 여왕말의 대각선 위치 N-Queen # 9663 - 17 72
  • 73. ● 놓일 수 없는 칸들을 무시하고 재귀적으로 탐색한다. N-Queen # 9663 - 18 73
  • 74. ● 퇴각하는 경우를 고려해 다음 열들을 본 후, 이 열에서 퀸을 없애준다. N-Queen # 9663 - 19 74
  • 75. ● 아무것도 놓지 않은 경우에서부터 재귀적으로 탐색 N-Queen # 9663 - 19 75
  • 76. Caution!! (엄격)(근엄)(진지) ● 재귀 탈출 조건은 제대로 명시할 것 ○ 시간 초과, 메모리 초과(스택 오버플로우) 터지면 채점 서버가 많이 아파해요… ㅜㅜ ● 재귀 함수 내에서 다른 재귀함수를 호출하는 횟수(분기의 갯수), 재귀 함수에서 도달가능한 콜 스택 최대 깊이를 잘 고려할 것. ○ 함수 오버헤드 비용을 고려하지 않더라도, Search Space를 얼마나 탐색하게 되는지 정량적으로 계산해야 합니다. ○ 재귀호출을 할 때마다 일정한 수만큼 분기가 나뉘게 된다면 기하급수를 계산해야함 ■ 고등학교때 배운 기하급수 공식을 생각해봅시다. 76
  • 77. ● 대회 환경에 깔려 있는 스크립트 언어를 최대한 활용하세요. ○ ex) Python, 웹브라우저에 깔려있는 Javascript(Ctrl+Shift+I 누르면 뜨는 그거) ● Javascript의 경우 ○ 매번 분기가 4개씩 나뉘고 N <= 12인 상황에서 백트래킹을 적용해도 되는지 계산해보기 ■ 4 ** 12 => 2**24 ~= 10 ** 7 이기 때문에 백트래킹을 적용해도 됨. ○ N <= 12 인 상황에서 순열을 이용해서 백트래킹을 적용해도 되는지 계산해보기 ■ [...(Array(13)).keys()].slice(1).reduce((acc, elem) => acc * elem) ■ 12! = 479001600 => 아슬아슬하지만 10**9는 넘지 않기 때문에 비벼도 됨 TIP : 시간복잡도 즉석에서 계산하기 77
  • 78. 이번주의 문제셋 ● N과 M (2) # 15650 ● 복면산!? # 15811 ● N-Queen # 9663 ● 스도쿠 # 2580 ● N과 M (1) # 15649 ● N과 M (3) # 15651 ● N과 M (4) # 15652 ● N과 M (5) # 15654 ● N과 M (6) # 15655 ● N과 M (7) # 15656 ● N과 M (8) # 15657 ● Barbells # 13751 ● 로또 # 6603 ● 숫자판 점프 # 2210 ● 암호 만들기 # 1759 ● 좋은 수열 # 2661 ● 알파벳 # 1987 ● 단어 수학 # 1339 78