광규니
광규니네
광규니
전체 방문자
오늘
어제
  • 분류 전체보기 (154)
    • 알고리즘 (100)
      • 알고리즘 개념 (2)
      • 문제 풀이 (96)
    • 주절주절 (19)
      • 자격증, 활동 후기 (4)
      • 전시회 후기 (3)
      • 이모저모 (2)
      • 회고 (3)
      • 뜨럼 (7)
    • 운영체제 (9)
    • 개발 지식 (9)
      • Apple Watch (4)
      • MySQL (2)
      • Eclipse (1)
      • XCode (1)
    • 네트워크 공부 (1)
    • 데이터베이스 공부 (5)
    • Java 공부 (7)
    • TMP (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 운영체제
  • 다이나믹 프로그래밍
  • 컴퓨터 사이언스
  • 애플워치 앱
  • BOJ
  • 드린이
  • OS
  • 알고리즘
  • 티스토리챌린지
  • 파이썬
  • BFS
  • 자바
  • 프로그래머스
  • 구현
  • 개념
  • 애플워치 앱 만들기
  • DP
  • 백준
  • 오블완
  • 합주

최근 댓글

최근 글

티스토리

250x250
hELLO · Designed By 정상우.
광규니
알고리즘/알고리즘 개념

[알고리즘 개념] 순열 조합 부분집합(순조부~)

알고리즘/알고리즘 개념

[알고리즘 개념] 순열 조합 부분집합(순조부~)

2021. 8. 20. 09:57
반응형

자바로 알고리즘을 풀면서 순조부에 대해서 깊게 공부해야했습니다... (파이썬은 api가 있지만 자바는 없기 때문에)

순조부를 공부하면서 자신이 없던 재귀도 공부하구,,, 의외로 문제 풀때 개념이 많이 쓰이더군용.. 그런 문제만 풀어서 그른가

아무튼 핵심 개념에 대해서 글을 써보겠습니다.

 

순열(Permutation)

서로 다른 n개 원소 중 r개를 뽑아서 한 줄로 나열하는 것. nPr

쉽게 예제를 통해 말하면

3명 중에서 회장 1명, 부회장 1명을 뽑는다면

(a,b)  (a,c)

(b,a)  (b,c)

(c,a)  (c,b)

 

이런 식으로 뽑을 수 있는데 중요한 포인트는 a,b != b,a 입니다. (조합과 다른 큰 특징)

예시 코드

private static void permutation(int cnt) {
		// TODO Auto-generated method stub
		if(cnt==N) {
			totalCnt++;
			System.out.println(Arrays.toString(numbers));
			return;
		}

		for (int i=1 ; i<=6 ; i++) {
			// 중복 체크
			if(isSelected[i]) continue;

			numbers[cnt] = i;
			isSelected[i]=true;

			permutation(cnt+1);
			isSelected[i] =false;
		}
}

 

조합(Combination)

서로 다른 n개의 원소 중 r개를 고르는 것 nCr

위와 같은 예시로 들면 3명 중에서 임원 2명을 고른다면

(a,b) 

(b,c) 

(a,c)

3개 나오고 뽑기만 하면 되니까 a,b = b,a 같은걸로 보는게 핵심!!

 

private static void combination(int cnt,int start) {
		// TODO Auto-generated method stub
		if(cnt==N) {
			totalCnt++;
			System.out.println(Arrays.toString(numbers));
			return;
		}

		for (int i=start ; i<=6 ; i++) {
			// 중복 체크
			numbers[cnt]=i;
			combination(cnt+1, i+1);
		}
}

부분집합(PowerSet 또는 SubSet)

집합에 포함된 원소를 선택하는 것,,, 2^n개가 나올 수 있습니다.

예시로는 3명 중에서 노래자랑에 참가 할 사람을 고른다면

(공집합)

(a) , (b) , (c)

(a,b),(b,c) ,(a,c)

(a,b,c)

모두 다 참여해도 되고,, 참여안해도 되고,,, 자기 마음대로 이므로 8개인 상황이 나옵니다.

private static void generateSubSet(int cnt) {
		if(cnt ==N) {
			// 부분집합 완성
			totalCnt++;
			for (int i = 0; i < N; i++) {
				System.out.print((isSelected[i]?input[i]:"X")+" ");
			}
			System.out.println();
			return;
		}
		
		// 현재 원소를 부분집합에 넣기
		isSelected[cnt] = true;
		generateSubSet(cnt+1);
		// 현재 원소를 부분집합에 넣지 않기
		isSelected[cnt]= false;
		generateSubSet(cnt+1);
}
반응형
저작자표시 (새창열림)

'알고리즘 > 알고리즘 개념' 카테고리의 다른 글

[알고리즘] 다이나믹 프로그래밍 (DP) 이해하기  (0) 2021.03.16
  • 순열(Permutation)
  • 조합(Combination)
  • 부분집합(PowerSet 또는 SubSet)
'알고리즘/알고리즘 개념' 카테고리의 다른 글
  • [알고리즘] 다이나믹 프로그래밍 (DP) 이해하기
광규니
광규니
공부 및 일상 올리기~

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.