티스토리 뷰
1. 합의 법칙
합의 법칙은 A에서 발생되는 case 와 B에서 발생되는 case 를 더하는 법칙이다.
이때 중요한건 A와 B에서 겹치는 case 는 빼 주어야한다.
집합으로 따지면 합집합과 같다.
n(A U B)= n(A) + n(B) - n(A ∩ B)
예제 - 두 개의 주사를 던졌을 때 합이 3 또는 4의 배수일 경우의 수
3의 배수의 경우의 수 : 12
3 : (1, 2) (2, 1)
6 : (1, 5) (2, 4) (3, 3) (4, 2) (5, 1)
9 : (3, 6) (4, 5) (5, 4) (6, 3)
12 : (6, 6)
4의 배수의 경우의 수 : 9
4 : (1, 3) (2, 2) (3, 1)
8 : (2, 6) (3, 5) (4, 4) (5, 3) (6, 2)
12 : (6, 6)
위 두가지 경우에서 (6, 6)이 겹치는 case 가 된다.
따라서 두 개의 주사를 던졌을 때 합이 3 또는 4의 배수일 경우의 수는 12 + 9 - 1 = 20 이 된다.
int[] dice1 = {1, 2, 3, 4, 5, 6};
int[] dice2 = {1, 2, 3, 4, 5, 6};
int nA = 0;
int nB = 0;
int nAandB = 0;
// 기본 풀이
for(int item1 : dice1){ // 3의 배수
for (int item2 : dice2){
if((item1 + item2) % 3 == 0){
nA++;
}
}
}
for(int item1 : dice1){ //4의 배수
for (int item2 : dice2) {
if((item1 + item2) % 4 == 0){
nB ++;
}
}
}
for(int item1 : dice1){ // 3의 배수이면서 4의 배수인 경우
for (int item2 : dice2) {
if((item1 + item2) % 12 == 0){
nAandB ++;
}
}
}
System.out.println("두 개의 주사를 던졌을 때 합이 3 또는 4의 배수일 경우의 수 : " + (nA + nB - nAandB));
배수를 구할 때는 % (나머지) 연산을 이용하여 구한다.
3의 배수이면서 4의 배수인 수는 3과 4의 최소 공배수인 12가 된다.
HashSet 을 이용하여 합의 법칙 구현
HashSet<ArrayList> dice = new HashSet<ArrayList>();
for (int item1 : dice1){
for(int item2 : dice2){
if((item1 + item2) % 3 == 0 || (item1 + item2) % 4 ==0){
ArrayList l = new ArrayList(Arrays.asList(item1, item2));
dice.add(l);
}
}
}
System.out.println(dice.size());
HashSet 은 중복을 허용하지 않는다는 장점이 있다.
첫번째 코드에서는 중복인 경우를 빼주었는데 HashSet 을 이용하면 중복인 경우가 인수로 들어가지 않아 중복된 경우를 별도로 계산하여 뺄 필요가 없다.
ArrayList l = new ArrayList (Arrays.asList(item1, item2))
배열을 list 로 변환하는 코드이다.
dice 는 ArrayList 형태로 된 HashSet 이며 dice.add(l) 를 통해서 item1, item2 를 list 로 만든 l 을 HashSet 에 추가해준다.
총 경우의 수는 HashSet 의 크기로 알수 있으며, HashSet 의 크기는 size() 를 통해서 알 수 있다.
2. 곱의 법칙
곱의 법칙이라는 A 와 B 가 동시에 발생되는 경우를 말한다.
각각의 경우가 발생되는 수를 곱해주면 된다.
n(A X B)= n(A) X n(B)
예제 - 두 개의 주사위 a, b를 던졌을 때 a는 3의 배수, b는 4의 배수인 경우의 수
a 가 3의 배수인 경우는 (3, 6) 2 가지 이며, b 가 4의 배수인 경우는 (4) 1개 이다.
동시에 나올 수 있는 경우의 수는 2 x 1 = 2 이다.
int nA = 0;
int nB = 0;
for (int item1 : dice1){
if(item1 % 3 == 0){
nA++;
}
}
for (int item2 : dice2){
if(item2 % 4 == 0){
nB++;
}
}
System.out.println("두 개의 주사위 a, b를 던졌을 때 a는 3의 배수, b는 4의 배수인 경우: "+(nA * nB));
곱의 법칙도 합의 법칙에서 구한 방식으로 경우의 수를 구한 다음 마지막에 곱해주면 된다.
'Algorithm > 자료구조' 카테고리의 다른 글
자료구조 - 연결 리스트 Linked List (0) | 2022.11.22 |
---|---|
Catalan Numbers (0) | 2022.11.15 |
행복한 수 찾기 (수열) (0) | 2022.11.12 |
파스칼의 삼각형 (0) | 2022.11.12 |
최대 공약수, 최소 공배수 구하기 (JAVA) (0) | 2022.11.09 |
- Total
- Today
- Yesterday
- 알고리즘 공부
- 주니어 개발자 취업 준비
- 개발자 면접 준비
- 제로베이스 백준 장학금
- 자바공부
- 백엔드 개발자 취업 준비
- 프로그래머스
- 백엔드 개발자
- 취준
- 알고리즘공부
- 백준
- 개발자 취업 준비
- 개발자 취준
- 제로베이스 백엔드 스쿨
- 코테공부
- 프로그래머스 카카오
- 프로그래머스 자바
- 코테 준비
- 취업준비
- 알고리즘
- 기술 면접 준비
- 코테준비
- 코딩테스트 공부
- 코딩테스트 준비
- 코딩테스트공부
- 자바
- 백엔드 개발자 기술 면접 준비
- 코딩테스트
- 취업 준비
- java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |