λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
5️⃣ CS/Algorithm

[Java Algorithm Note] μ‘°ν•© (feat. μž¬κ·€)

by seolhee2750 2022. 8. 15.

μ €λ²ˆ μˆœμ—΄μ— 이어 μ΄λ²ˆμ—λŠ” 쑰합에 λŒ€ν•΄ 정리해보렀 ν•œλ‹€.

(μˆœμ—΄ μ •λ¦¬λŠ” μ•„λž˜ μ°Έκ³ ! πŸ‘‡)

https://seolhee2750.tistory.com/229

 

[Java Algorithm Note] μˆœμ—΄ (feat. μž¬κ·€)

μˆœμ—΄, μ‘°ν•©, 뢀뢄집합 이 세가지에 λŒ€ν•΄μ„œ μ€‘μš”ν•˜κ²Œ 생각을 λͺ»ν–ˆλŠ”데, μ΄λ²ˆμ— λ°°μ›Œλ³΄λ‹ˆ 정말 λ„ˆλ¬΄λ„ˆλ¬΄ μ€‘μš”ν•œ 것듀이어따..!! 이것듀을 κ³΅λΆ€ν•˜κ³ λ‚˜λ‹ˆ λ¬Έμ œμ—μ„œλ„ λ‹€μ–‘ν•˜κ²Œ ν™œμš©ν•  수 있음 그래

seolhee2750.tistory.com

 

πŸ“Ž μ‘°ν•©

쑰합은 μ„œλ‘œ λ‹€λ₯Έ n개의 μ›μ†Œμ—μ„œ r개λ₯Ό μˆœμ„œμ— μƒκ΄€ν•˜μ§€ μ•Šκ³  선택 ν˜Ήμ€ λ‚˜μ—΄ν•˜λŠ” 것을 λ§ν•œλ‹€.

 

μˆœμ—΄κ³Όμ˜ 차이점은 λ°”λ‘œ 'μˆœμ„œ'!!

쑰합은 μˆœμ„œλ₯Ό 가지지 μ•ŠμœΌλ―€λ‘œ {1, 2, 3}, {3, 2, 1}을 같은 κ²ƒμœΌλ‘œ λ³Έλ‹€.

 

그리고 쑰합도 μˆœμ—΄μ²˜λŸΌ 쀑볡 μ‘°ν•©μ΄λΌλŠ” κ°œλ…μ΄ μ‘΄μž¬ν•˜λŠ”λ°,

{1, 1, 1}, {1, 1, 2}, ... 처럼 쀑볡을 ν—ˆμš©ν•œλ‹€. ν•˜μ§€λ§Œ 이 λ•Œλ„ μˆœμ„œλ₯Ό 가지지 μ•ŠλŠ”λ‹€λŠ” 점은 동일!

 

πŸ‘‰  μ •λ¦¬ν•˜μžλ©΄,

쑰합이 κ°€μ§€λŠ” μˆœμ—΄κ³Όμ˜ 차이점은 'μˆœμ„œ'이닀.

κΈ°λ³Έ 쑰합은 μˆœμ„œλ₯Ό 가지며 쀑볡을 ν—ˆμš©ν•˜μ§€ μ•Šκ³ ,

쀑볡 쑰합은 μˆœμ„œλ₯Ό 가지며 쀑볡을 ν—ˆμš©ν•œλ‹€.


πŸ“Ž κΈ°λ³Έ μ‘°ν•© κ΅¬ν˜„

public class Combination1 {
	
	static char[] src = { 'a', 'b', 'c', 'd' };
	
	/*
     * κΈ°λ³Έ μ‘°ν•©: 쀑볡 X, μˆœμ„œ X
     * @param nth - λͺ‡ 번째 선택인지 ν‘œν˜„
     * @param choosed - μ„ νƒλœ μš”μ†Œ
     * @param startIdx - λͺ‡ 번째 μš”μ†ŒλΆ€ν„° λ°˜λ³΅ν•˜λ©° 선택할 것인지 ν‘œν˜„
     */
    static void makeCombination(int nth, char[] choosed, int startIdx) {
        if(nth == choosed.length) { // κΈ°μ € 쑰건: choosedλ₯Ό λ‹€ 채웠닀면 끝
        	System.out.println(Arrays.toString(choosed));
        	return;
        }
        
        for(int i = startIdx; i < src.length; i++) {
        	choosed[nth] = src[i];
        	makeCombination(nth+1, choosed, i+1); // 쀑볡 방지λ₯Ό μœ„ν•œ μž₯치: i+1
        }
    }

	public static void main(String[] args) {
        System.out.println("μ‘°ν•©");
        makeCombination(0,new char[3], 0); // srcμ—μ„œ 3개λ₯Ό 뽑아 λ§Œλ“€ 수 μžˆλŠ” 쑰합을 λͺ¨λ‘ 좜λ ₯
	}

}

nthλ₯Ό μ΄μš©ν•΄μ„œ μ‘°ν•©μ˜ λͺ‡ 번째 μš”μ†Œλ₯Ό μ„ νƒν–ˆλŠ”μ§€ ν‘œν˜„ν–ˆκ³ ,

choosed에 μ„ νƒν•œ μš”μ†Œλ“€μ„ μ°¨λ‘€λŒ€λ‘œ λ‹΄μ•„ 쑰합을 μ™„μ„±μ‹œν‚¬ 수 있게 ν–ˆλ‹€.

startIdxλŠ” λ°˜λ³΅μ„ μ‹œμž‘ν•  값을 λ‹΄λŠ”λ°, 쀑볡을 λ°©μ§€ν•˜κΈ° μœ„ν•˜μ—¬

ν˜„μž¬ μ„ νƒν•œ μš”μ†Œκ°€ μžˆλ‹€λ©΄ κ·Έ λ‹€μŒ κ°’λΆ€ν„° 선택할 수 μžˆλ„λ‘ ν–ˆλ‹€.


πŸ“Ž 쀑볡 μ‘°ν•© κ΅¬ν˜„

public class Combination2 {
	
	static char[] src = { 'a', 'b', 'c', 'd' };
	
	/*
     * 쀑볡 μ‘°ν•©: 쀑볡 O, μˆœμ„œ X
     * κΈ°λ³Έ μ‘°ν•©μ—μ„œ startIdxλ₯Ό +1ν•˜λŠ” κ²ƒλ§Œ λΉΌλ©΄ ok
     * 
     * @param nth - λͺ‡ 번째 선택인지 ν‘œν˜„
     * @param choosed - μ„ νƒλœ μš”μ†Œ
     * @param startIdx - λͺ‡ 번째 μš”μ†ŒλΆ€ν„° λ°˜λ³΅ν•˜λ©° 선택할 것인지 ν‘œν˜„
     */
    static void makeCombinationDup(int nth, char[] choosed, int startIdx) {
        if(nth == choosed.length) { // κΈ°μ € 쑰건: choosedλ₯Ό λ‹€ 채웠닀면 끝
        	System.out.println(Arrays.toString(choosed));
        	return;
        }
        
        for(int i = startIdx; i < src.length; i++) {
        	choosed[nth] = src[i];
        	makeCombinationDup(nth+1, choosed, i); // 쀑볡 λ°©μ§€ν•˜μ§€ μ•Šμ•„λ„ λ˜λ―€λ‘œ iλ₯Ό κ·ΈλŒ€λ‘œ λ„˜κ²¨μ€Œ
        }
    }

	public static void main(String[] args) {
        System.out.println("μ‘°ν•©");
        makeCombinationDup(0,new char[3], 0); // srcμ—μ„œ 3개λ₯Ό 뽑아 λ§Œλ“€ 수 μžˆλŠ” 쑰합을 λͺ¨λ‘ 좜λ ₯
	}

}

쀑볡 쑰합은 κΈ°λ³Έ μ‘°ν•© κ΅¬ν˜„κ³Ό 거의 λ™μΌν•œλ°,

μž¬κ·€ 호좜 μ‹œ startIdx μžλ¦¬μ— i+1이 μ•„λ‹Œ κ·Έλƒ₯ iλ₯Ό λ„£μ–΄μ€€λ‹€λŠ” 점이 차이점이닀.

ν˜„μž¬ μ„ νƒν•œ 인덱슀λ₯Ό λ‹€μŒμ— 또 선택해도 λ˜λ―€λ‘œ μ΄λ ‡κ²Œ κ΅¬ν˜„ν•  수 μžˆλ‹€.


πŸ‘€ 정리

쑰합은 쀑볡 없이 μš”μ†Œλ“€μ„ 뽑아 μˆœμ„œλ₯Ό 가지도둝 λ‚˜μ—΄ν•œ 것을 μ˜λ―Έν•˜κ³ ,

쀑볡 쑰합은 쀑볡을 ν—ˆμš©ν•˜μ—¬ μš”μ†Œλ“€μ„ 뽑아 μˆœμ„œλ₯Ό 가지도둝 λ‚˜μ—΄ν•œ 것이닀.

μ‘°ν•©κ³Ό 쀑볡 쑰합은 μˆœμ—΄κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ μž¬κ·€λ₯Ό μ΄μš©ν•˜μ—¬ κ΅¬ν˜„ν•  수 μžˆλŠ”λ°,

쀑볡 쑰합은 μ‘°ν•© κ΅¬ν˜„ λ©”μ„œλ“œμ—μ„œ 쀑볡을 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ” λΆ€λΆ„λ§Œ μ œκ±°ν•΄μ£Όλ©΄ λœλ‹€.

λŒ“κΈ€