Hyemi Lee

Hyemi Lee

주니어 개발자의 삽질과 기록

Algorithm, JAVA, Permutation (순열)

순열이란 n 개의 값 중에서 r 개의 숫자를 모든 순서대로 뽑는 경우를 말합니다. 예를 들어 [1, 2, 3] 이라는 3 개의 배열에서 2 개의 숫자를 뽑는 경우는

[1, 2] [1, 3] [2, 1] [2, 3] [3, 1] [3, 2]

arr배열에서 r개 뽑기

  • output = r개 사이즈의 배열
  • visited = 중복해서 뽑지 않기 위해 체크하는 배열
  1. DFS를 돌면서 모든 인덱스에 방문하여 output배열에 값을 넣습니다
  2. 이미 들어간 값은 visited 값을 true로 바꾸어 중복하여 넣지 않도록 합니다.
  3. depth값 = output에 들어간 숫자의 길이
  4. depth값이 r만큼 되면 output에 들어있는 값을 출력하면 됩니다.

Permutation

package org.study;
import java.util.*;
/*
 * 순열 : n 개 중에서 r개 선택
 * 시간복잡도는 O(n!)
 * 연습 문제 : https://www.acmicpc.net/problem/10974
 */
public class Permutation {
	public static void main(String[] args) {
		int[] arr = {1,2,3};
		int[] output = new int[arr.length];
		boolean[] visited = new boolean[arr.length];
		perm(arr, output, visited, 0, arr.length, 3);
	}
	// 순서를 지키면서 n개중 r개를 뽑는 경우
	// 사용 예시 : perm(arr, output, visited, 0, n, 3);
	static void perm(int[] arr, int[] output, boolean[] visited, int depth, int n, int r) {
		//- 현재 깊이는 뽑은 개수이다
		//- 즉, 뽑은 개수와 뽑을 개수가 같다면 종료.
		if(depth == r) {
			print(output,r);
			return;
		}
		// 1. 모든 원소를 순회한다.
		for (int i=0; i<n; i++) {
			// 2. 방문하지 않은 원소를 찾는다
			if(visited[i] == false) {
				visited[i] 		= true;			// 방문표시
				output[depth]	= arr[i];		// 결과값 배열의 해당 깊이 자리에 방문하지 않는 원소를 삽입
				// 삽입 후에 한단계 깊은 노드로 이동 하여 output에 값추가
				perm(arr, output, visited, num, depth+1, pick);
				visited[i] 		= false;		// 한단계 깊은 노드 삽입이 끝나고 부모노드로 왔을때 arr[]의 다음 원소를 해당 자리에 넣을수 있다.
			}
		}
	}
	// 배열 출력
	static void print(int[] arr, int r) {
 for(int i=0; i<r; i++)
 System.out.print(arr[i] + " ");
		System.out.println();
	}
}

reference

참고 백준 문제

Share on

Twitter Facebook LinkedIn

You may also enjoy

Redis Stream

2021年04月28日

Stream Stream은 로그 데이터를 처리하게위해 5.0에서 새로 도입된 데이터 타입입니다. 대량의 데이터가 연속적으로 발생할때 처리하기 위해 등장했습니다. 기존 데이터를 수정하지 않고 오직 추가로 발생합니다. 이런 종류의 데이터를 stream or log데이터...

Study, Object, chapter2&3 presentation

2021年04月20日

chapter03. 역할, 책임, 협력 객체지향 설계란, 올바른 객체에게 올바른 책임을 할당하면서 낮은 결합도와 높은 응집도를 가진 구조를 창조하는 활동이다.

Spring, chatting 프로그램 만들기, Reactive란?

2020年06月16日

Reactive 막힘없이 흘러다니는 data(event)를 통해 사용자에게 자연스러운 응답을 주고 규모 탄력적으로 리소스를 사용하며 실패에 있어서 유연하게 대처한다 모든 지점에서 블럭 되지 않게 하자 oop와 같은 패러다임 모든 것을 비동기적인 data의 strea...