Idealim
article thumbnail

/* 본 게시물은 ' ' 의 내용과 참고자료를 토대로 작성되었습니다. */

/* 본 글은 개인적으로 공부한 내용을 정리한 글이므로 오류가 있을 수 있습니다. */

1. 참고 자료

[백준] 15650번 - N과 M (2) : https://www.acmicpc.net/problem/15650

[AeroCode] 순열과 조합 알고리즘 : https://aerocode.net/376


2. 1. 조합이란?

표현 : nCr

정의 : 서로 다른 n개 중의 r 개를 뽑을때, 순서의 상관없이 뽑는 경우의 수

예시 : [1,2,3,4] 중 2개 뽑을 때

<kotlin />
[1, 2] [1, 3] [1, 4] [2, 3] [2, 4] [3, 4]

3. 2. 조합 구현

백준 15650번 문제를 통해 조합을 구현해보자.

4. 문제

자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.

  • 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
  • 고른 수열은 오름차순이어야 한다.

 

5. 입력

첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)


6. for 을 이용한 조합 구현

<kotlin />
fun combinationByForLoop(){ val arr = IntArray(4){i -> i + 1 } for (i in arr.indices){ for (j in i+1 until arr.size) for (k in j+1 until arr.size){ println("${arr[i]} ${arr[j]} ${arr[k]}") } } }

순열과 마찬가지로 for 을 이용했을 때 뽑는 개수에 따라 변수(i,j,k)를 이용해 for 문을 중첩한다. 단, 순열과 다른 점은 j = i+1, k = j+1 로 설정한다.


7. 재귀를 이용한 조합 구현

<kotlin />
fun main() { val (n,m) = readLine()!!.split(' ').map{ it.toInt() } val tmpArr = IntArray(m) fun getCombination(depth: Int, start: Int){ if (m == depth){ println(tmpArr.joinToString(" ")) } else { for (i in start..n){ tmpArr[depth] = i getCombination(depth + 1, i + 1) } } } getCombination(0,1) }

순열과 다르게 조합 구현은 간단하다. 함수의 파라미터로 시작점을 넘겨주면 된다.

반응형
profile

Idealim

@Idealim

읽어주셔서 감사합니다. 잘못된 내용이 있으면 언제든 댓글로 피드백 부탁드립니다.