앞선 단원에서는 방정식과 부등식을 통해 조건을 만족하는 수의 값이나 범위를 찾았습니다. 이제는 관점을 조금 바꾸어, 조건을 만족하는 경우가 몇 가지인지 세는 문제로 넘어가 보겠습니다.
경우의 수를 세는 가장 기본 원리인 합의 법칙과 곱의 법칙을 이해하고, 무엇을 서로 다른 경우로 볼 것인지 판단하기.
먼저 오늘의 흐름을 잡고 시작하겠습니다.
- 경우의 수는 가능한 선택이나 배열의 개수를 세는 문제다.
- 그런데 세기 전에 먼저 무엇을 서로 다른 경우로 볼 것인지를 정해야 한다.
- 중복이 허용되는지, 서로 같은 것이 섞여 있는지, 순서를 구분하는지에 따라 답이 달라진다.
- 동시에 일어날 수 없는 선택지를 합칠 때는 합의 법칙을 쓴다.
- 여러 단계의 선택이 이어질 때는 곱의 법칙을 쓴다.
- 수학적 구조를 먼저 이해한 뒤, Python으로 실제 가능한 경우의 목록을 만들어 검산할 수 있다.
1. 경우의 수는 무엇을 묻는 문제일까?
경우의 수는 어떤 조건을 만족하는 가능한 경우가 몇 가지인지 세는 문제입니다.
예를 들어 점심으로
- 김밥
- 라면
- 돈가스
중 하나를 고를 수 있다면 점심을 고르는 경우는 3가지입니다.
여기에 음료로
- 물
- 주스
중 하나를 함께 고른다면 점심 하나와 음료 하나를 함께 고르는 경우를 세어야 합니다. 가능한 경우는 수형도로 나타내면 더 자연스럽습니다.
수형도는 가능한 선택이 나뭇가지처럼 갈라지는 모습을 그린 그림입니다. 왼쪽에서 시작해서 오른쪽으로 이동한다고 생각하면 됩니다.
- 한 지점은 한 번의 선택 상태를 나타낸다.
- 가지는 다음 선택으로 넘어가는 길을 나타낸다.
- 맨 오른쪽 끝에 도착한 하나의 길이 하나의 경우를 나타낸다.
따라서 수형도에서는 끝에 도착한 가지의 개수를 세면 전체 경우의 수를 알 수 있습니다.
이 수형도에서는 먼저 점심 선택이 세 갈래로 나뉩니다. 그리고 각 점심 선택마다 음료 선택이 두 갈래로 다시 나뉩니다.
맨 오른쪽 끝에 도착한 가지를 세면
가지입니다.
즉, 수형도에서 하나의 완성된 길
은 하나의 경우를 뜻합니다.
처음에는 이렇게 수형도로 직접 나열할 수 있습니다. 하지만 선택지가 많아지면 모든 경우를 하나씩 쓰기 어렵습니다. 그래서 경우의 수에서는 어떤 구조로 선택이 이루어지는지를 읽는 것이 중요합니다.
그런데 그보다 먼저 해야 할 일이 있습니다. 바로 무엇을 서로 다른 경우로 볼 것인지를 정하는 일입니다.
2. 경우의 수에서 가장 먼저 볼 것: 서로다름의 기준
경우의 수에서 학생들이 가장 자주 놓치는 부분은 공식을 모르는 것이 아닙니다. 오히려 문제에서 말하는 대상들이 정말 서로 다른지, 또는 같은 것으로 보아야 하는지를 확인하지 않고 바로 세기 시작하는 경우가 많습니다.
예를 들어 문제에 "주사위"라는 말이 나왔다고 해서 무조건 가능한 눈이 6가지라고 생각하면 안 됩니다. 보통은 1부터 6까지 적힌 정육면체 주사위를 뜻하지만, 문제에 따라서는 다음처럼 달라질 수 있습니다.
- 눈이 1부터 6까지 있는 보통 주사위
- 눈이 1, 1, 2, 2, 3, 3으로 적힌 주사위
- 빨간 주사위와 파란 주사위처럼 색으로 구분되는 두 주사위
- 색이 없고 서로 구별하지 않는 두 주사위
이 차이는 답을 완전히 바꿉니다.
2-1. 같은 주사위 두 개와 서로 다른 주사위 두 개
보통의 주사위 두 개를 던진다고 합시다. 이때 두 주사위를 빨간 주사위와 파란 주사위로 구분한다면
입니다. 빨간 주사위가 1, 파란 주사위가 2인 경우와 빨간 주사위가 2, 파란 주사위가 1인 경우는 서로 다릅니다. 따라서 경우의 수는
가지입니다.
하지만 두 주사위를 구별하지 않고 나온 눈의 조합만 본다면
로 보아야 합니다. 이때는 단순히 으로 세면 같은 경우를 두 번 세게 됩니다.
즉, 같은 "주사위 두 개"라는 표현이라도 주사위를 구별하는지에 따라 세는 방식이 달라집니다.
2-2. 주사위의 면도 정말 서로 다른가?
어떤 주사위의 눈이
으로 적혀 있다고 합시다.
이 주사위를 한 번 던졌을 때 나올 수 있는 눈의 값은
뿐이므로 3가지입니다.
하지만 주사위의 면 자체를 구분한다면 면은 여전히 6개입니다. 예를 들어 첫 번째 1이 적힌 면과 두 번째 1이 적힌 면을 물리적으로 구분한다면 6가지로 볼 수도 있습니다.
대부분의 경우의 수 문제에서는 보통 결과값을 기준으로 세지만, 문제에서 무엇을 묻는지에 따라 기준이 달라질 수 있습니다. 따라서 문제를 읽을 때는 다음 질문을 먼저 해야 합니다.
이 문제에서 서로 다른 경우를 구분하는 기준은 무엇인가?
2-3. 세기 전에 확인할 질문들
경우의 수 문제를 풀기 전에는 다음을 먼저 확인해야 합니다.
- 대상들이 서로 구별되는가?
- 같은 것이 섞여 있는가?
- 중복해서 선택할 수 있는가?
- 순서가 바뀌면 다른 경우인가?
- 문제에서 묻는 것은 실제 배열인가, 결과값인가?
이 질문들이 바로 경우의 수를 세는 중요한 분기점입니다. 공식은 그 다음에 적용합니다.
3. 합의 법칙: 서로 겹치지 않을 때 더한다
먼저 합의 법칙부터 봅시다.
두 선택 묶음이 서로 겹치지 않고, 각각의 경우의 수가 가지, 가지이면, 둘 중 하나에 속하는 경우의 수는 가지이다.
여기서 가장 중요한 조건은 서로 겹치지 않는다는 점입니다. 단순히 "A 또는 B"라는 말이 나왔다고 해서 항상 을 하면 되는 것은 아닙니다. A에도 속하고 B에도 속하는 경우가 있으면, 그 경우를 두 번 세게 됩니다.
예를 들어 학교에 가는 방법이 다음과 같다고 합시다.
- 버스 노선 3가지
- 지하철 노선 2가지
그리고 오늘은 버스와 지하철 중 하나만 이용한다고 합시다. 그러면 버스 방법과 지하철 방법은 서로 겹치지 않습니다. 따라서 가능한 방법은
가지입니다.
3-1. 겹치면 그냥 더하면 안 된다
예를 들어 1부터 10까지의 자연수 중에서 다음 조건을 만족하는 수를 세어 봅시다.
2의 배수 또는 3의 배수인 수는 몇 개인가?
1부터 10까지에서 2의 배수는
으로 5개입니다.
3의 배수는
으로 3개입니다.
그런데 여기서 단순히
이라고 하면 안 됩니다. 왜냐하면 6은 2의 배수이면서 동시에 3의 배수이기 때문입니다. 즉, 6이 두 번 세어졌습니다.
따라서 겹치는 1개를 빼야 합니다.
실제로 가능한 수는
으로 7개입니다.
이 생각은 나중에 더 일반적인 형태로
처럼 정리됩니다. 지금 단계에서는 "합의 법칙은 겹치지 않을 때 단순한 덧셈이 된다"는 점을 기억하면 충분합니다.
4. 곱의 법칙: 각 선택 뒤의 경우의 수가 일정할 때 곱한다
이번에는 곱의 법칙입니다.
첫 번째 선택이 가지이고, 첫 번째 선택이 무엇이든 그 뒤의 두 번째 선택이 항상 가지이면, 두 선택을 이어서 하는 경우의 수는 가지이다.
여기서 중요한 조건은 앞의 선택에 따라 뒤의 경우의 수가 달라지지 않는다는 점입니다.
예를 들어 상의 3벌과 하의 2벌이 있다고 합시다.
- 상의: 흰색, 검은색, 파란색
- 하의: 청바지, 면바지
어떤 상의를 고르더라도 하의는 항상 2가지 중 하나를 고를 수 있습니다. 따라서
가지입니다.
여기서 상의만 고르고 끝나는 것이 아니라, 하의도 함께 골라야 합니다. 즉, 두 선택이 단계적으로 이어집니다.
4-1. 뒤의 경우의 수가 달라지면 나누어 세어야 한다
다음 상황을 봅시다.
점심 메뉴를 고른 뒤 음료를 고른다.
김밥을 고르면 음료가 2가지이고, 라면을 고르면 음료가 3가지이다.
이때는 메뉴가 2가지이고 음료가 대략 2가지 또는 3가지라고 해서 단순히 곱할 수 없습니다. 앞에서 무엇을 골랐는지에 따라 뒤의 경우의 수가 달라지기 때문입니다.
따라서 메뉴별로 나누어 세어야 합니다.
가지입니다.
즉, 곱의 법칙은 다음처럼 읽어야 합니다.
각 앞선 선택마다 뒤따르는 선택의 개수가 같을 때, 같은 묶음이 반복되므로 곱할 수 있다.
이 생각은 나중에 확률에서 말하는 독립과 연결됩니다. 다만 여기서의 곱의 법칙은 확률의 독립과 완전히 같은 말은 아닙니다. 경우의 수에서는 "앞의 선택이 무엇이든 뒤의 선택지가 같은 개수로 유지되는가"를 먼저 봅니다. 확률에서는 사건이 서로의 확률에 영향을 주지 않을 때 독립이라고 말합니다.
5. 합의 법칙과 곱의 법칙을 구분하는 기준
두 법칙을 구분할 때는 다음 질문을 하면 됩니다.
선택지가 서로 겹치지 않는 갈래 중 하나인가, 아니면 여러 단계를 모두 거치며 각 단계의 경우의 수가 일정한가?
정리하면 다음과 같습니다.
| 상황 | 사용하는 법칙 | 반드시 확인할 점 |
|---|---|---|
| A 또는 B 중 하나 | 합의 법칙 | A와 B가 겹치지 않는가? |
| A를 고른 뒤 B도 고름 | 곱의 법칙 | A의 선택에 따라 B의 개수가 달라지지 않는가? |
| A와 B가 겹침 | 포함배제 관점 | 겹친 만큼을 빼야 하는가? |
| 뒤의 선택지가 앞의 선택에 따라 달라짐 | 경우를 나누어 합산 | 각 갈래별로 따로 세어야 하는가? |
예를 들어
- 버스 또는 지하철을 타며 두 방법이 겹치지 않는다 → 합의 법칙
- 상의와 하의를 고르며 어떤 상의를 골라도 하의가 2가지다 → 곱의 법칙
- 2의 배수 또는 3의 배수를 센다 → 겹치는 6의 배수를 조심해야 한다
- 메뉴에 따라 가능한 음료 수가 달라진다 → 메뉴별로 나누어 더한다
입니다.
6. 합과 곱이 함께 나오는 예제
다음 문제를 봅시다.
학교에서 도서관까지 가는 방법이 있다.
A 경로를 이용하면 버스 2가지 중 하나를 탄 뒤, 도보 길 3가지 중 하나를 고른다.
B 경로를 이용하면 지하철 4가지 중 하나를 탄다.
도서관까지 가는 전체 방법은 몇 가지인가?
먼저 A 경로는 두 단계입니다.
- 버스 선택: 2가지
- 도보 길 선택: 3가지
따라서 A 경로는
가지입니다.
B 경로는 지하철 4가지이므로
가지입니다.
A 경로와 B 경로는 둘 중 하나를 선택하는 관계이므로 합의 법칙을 씁니다.
따라서 전체 방법은 10가지입니다.
7. 코드로 가능한 경우를 나열해 검산하기
지금까지는 수학적으로 경우의 수를 세었습니다. 이제는 같은 상황을 Python으로 옮겨 실제 가능한 경우의 목록을 만들어 보겠습니다.
여기서 코드의 역할은 문제를 대신 풀어 주는 것이 아닙니다. 앞에서 세운 수학적 구조가 실제 경우들의 목록과 일치하는지 확인하는 것입니다.
7-1. 합의 법칙을 목록으로 확인하기
Python 코드로 합의 법칙 검산하기
bus = ["버스1", "버스2", "버스3"]
subway = ["지하철1", "지하철2"]
cases = bus + subway
print(cases)
print(len(cases)) # 5
7-2. 곱의 법칙을 목록으로 확인하기
Python 코드로 곱의 법칙 검산하기
shirts = ["흰색", "검은색", "파란색"]
pants = ["청바지", "면바지"]
cases = []
for shirt in shirts:
for pant in pants:
cases.append([shirt, pant])
print(cases)
print(len(cases)) # 6
7-3. 합과 곱이 섞인 예제 검산하기
Python 코드로 가능한 경로 배열 만들기
buses = ["버스1", "버스2"]
walks = ["도보1", "도보2", "도보3"]
subways = ["지하철1", "지하철2", "지하철3", "지하철4"]
route_a = []
for bus in buses:
for walk in walks:
route_a.append(["A경로", bus, walk])
route_b = []
for subway in subways:
route_b.append(["B경로", subway])
cases = route_a + route_b
for case in cases:
print(case)
print("전체 경우의 수:", len(cases)) # 10
8. 가능한 경우를 직접 나열해 보는 연습
경우의 수를 공부할 때 답만 구하면 다음과 같이 끝날 수 있습니다.
하지만 처음 배우는 단계에서는 가능한 경우를 직접 몇 개라도 써 보는 것이 중요합니다. 직접 써 보면 다음을 확인할 수 있습니다.
- 내가 서로 다른 경우로 보는 기준이 맞는가?
- 같은 경우를 두 번 세고 있지는 않은가?
- 빠뜨린 경우는 없는가?
- 앞의 선택에 따라 뒤의 선택지가 달라지지는 않는가?
예를 들어 상의 3벌과 하의 2벌을 고르는 경우라면 가능한 경우를 다음 수형도로 나열할 수 있습니다. 여기서도 왼쪽에서 오른쪽으로 한 번 이동할 때마다 선택이 하나씩 확정됩니다.
끝에 도착한 가지가 6개이므로 전체 경우의 수는 6가지입니다.
수형도는 특히 처음 경우의 수를 배울 때 유용합니다. 왜냐하면 어떤 경우가 빠졌는지, 어떤 경우를 두 번 세었는지 눈으로 확인할 수 있기 때문입니다.
이처럼 간단한 문제에서는 수형도로 직접 나열해 보고, 그 나열이 합의 법칙이나 곱의 법칙과 어떻게 연결되는지 확인하는 습관이 중요합니다.
다음 글에서는 이 "나열"을 더 체계적으로 다룹니다. 특히 여러 대상을 뽑을 때 순서를 구분하는지에 따라 세는 방법이 달라집니다.
9. 연습 문제
아래 점검 퀴즈에서 합의 법칙과 곱의 법칙을 구분해 보세요.
💬 댓글
이 글에 대한 의견을 남겨주세요