코드스테이츠 28일차

안형준·2022년 6월 3일
0

코드스테이츠

목록 보기
28/32
post-thumbnail
👻순열(permutation)과 조합(Combination)
* 순열 : 요소 n개 중에 m개를 선택하여 순서에 상관 있게 뽑는 경우의 수
* 조합 : 순서에 상관없이 요소 n개 중에 m개를 뽑는 경우의 수
nPr = nCr * r!
nCr = nPr / r!

👻순열(permutation) 코드 예제

case 1. [순서를 생각하며 3장을 선택할 때의 모든 경우의 수]
public static ArrayList<String[]> permutationLoop() {
    String[] lookup = new String[]{"A", "B", "C", "D", "E"};
    ArrayList<String[]> result = new ArrayList<>();

    for (int i = 0; i < lookup.length; i++) {
      for (int j = 0; j < lookup.length; j++) {
        for (int k = 0; k < lookup.length; k++) {
          if (i == j || j == k || k == i) continue; // 중복 요소 제거
            String[] input = new String[]{lookup[i], lookup[j], lookup[k]}; 
            result.add(input);
        }
      }
    }
  return result;
}

case 2. [순서를 생각하지 않고 3장을 선택할 때의 모든 경우의 수]
public static ArrayList<String[]> combinationLoop() {
  String[] lookup = new String[]{"A", "B", "C", "D", "E"};
  ArrayList<String[]> result = new ArrayList<>();

  for(int i = 0; i < lookup.length; i++) {
    for(int j = i + 1; j < lookup.length; j++) {
      for(int k = j + 1; k < lookup.length; k++) {
        String[] input = new String[]{lookup[i], lookup[j], lookup[k]};
				result.add(input);
      }
    }
  }

  return result;
}
반복문 내에서 i = 0, j = i + 1, k = j + 1를 사용한 이유는 순서를 생각하지 않기 때문에 한번 조합한 요소는 다사 조합하지 않기 때문이다.

👻반복문을 통해 순열, 조합을 만들낼 때의 한계점
* 개수가 늘어나면 반복문의 수도 늘어난다.
* 뽑아야 되는 개수가 n개처럼 변수로 들어왔을 때 대응이 어렵다.

그렇기에 순열과 조합은 [재귀]를 통해 풀이하는 경우가 많다.

오늘은 순열, 조합을 활용하여 문제를 풀어보았다.
수학적 지식을 프로그래밍과 접목시켜서 한다는 것은 결코 쉬운 일이 아니였고, 정말 어렵다는 생각이 계속 들었다.
분명히 순열, 조합에 대해서는 이해를 하겠는데 막상 코드로 옮겨서 작업을 하려고 하니 막막하기만 했다.
그래도 그 중 한문제 정도는 풀 수 있어 그나마 다행이라고 생각했다.
하지만 이런 것에 안심을 하지 않고 다른 문제들도 풀 수 있도록 추가적인 학습을 진행할 생각이다.
오늘도 고생했고 내일도 파이팅!

profile
개발 공부

0개의 댓글