본문 바로가기

Dev. Etc/Algorithm

[JAVA] 백준 알고리즘 15649번 문제풀이 (N과M)

 

 

 

 

 

https://www.acmicpc.net/problem/15649

 

15649번: N과 M (1)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해야 한다.

www.acmicpc.net

 

 

 

 

● N과 M (1) (15649번)

 

 

 

 

 

 

 

package bruteForce;

import java.util.*;

public class Main {
	static boolean[] c = new boolean[10];
	static int[] a = new int[10];

	static void func(int index, int n, int m) {
		if (index == m) {
			for (int i = 0; i < m; i++) {
				System.out.print(a[i]);
				if (i != m - 1)
					System.out.print(' ');
			}
			System.out.println();
			return;
		}
		for (int i = 1; i <= n; i++) {
			if (c[i]) {
				continue;
			}
			c[i] = true;
			a[index] = i;
			func(index + 1, n, m);
			c[i] = false;
		}
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		func(0, n, m);
	}
}

↓ 소스풀이 ↓

c배열을 통해 값이 들어가있는것을 체크해주기위해 bool타입으로 선언해줍니다.

Main메소드에서 n과 m변수를 각각 사용자에게 입력받습니다.

그리고 func()메소드에 재귀함수를 이용했고 파라미터로 0,n,m을 보내줍니다.

재귀함수 func()메소드에서 if문으로 입력한 m자리수와

index가 일치하면 출력해주는 소스를 입력해줍니다.

그리고 다음 for반복문을 통해 1부터 n까지 반복해주고

만약에 [0]자리에 값이 들어가있다면 중복하면 안되기에

c배열을 통해 true를 만들어줍니다.

그리고 실제 a배열에 해당 i값을 저장해줍니다.

다시 재귀함수로 go메소드로 이동하고 index+1해서 넘겨줍니다.

그렇게 돌리고나서, c배열을 하나씩 false해주면서 체크를 빼주고

다시 값넣고 m과 자릿수가 일치하면 출력을 반복해줍니다.

이미 1의 값을 사용을 다했으므로, 2로 넘어가서 반복해줍니다.

 

 

< 백준알고리즘 강의를 보고 참고하였습니다! >