J 크 2023. 8. 20. 23:38
728x90
반응형

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

 

15649번: N과 M (1)

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

www.acmicpc.net

주말도 재귀 해주세요!!!!


※  문제를 요약하면 아래와 같습니다.

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

 Input : 1 <= M <= N <= 8

 Output : 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력, 각 수열은 공백으로 구분해서 출력


◈ Input - 1 

4 2

◈ Output - 1

1 2
1 3
1 4
2 1
2 3
2 4
3 1
3 2
3 4
4 1
4 2
4 3

◈ Input - 2

4 4

◈ Output - 2

1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
1 4 2 3
1 4 3 2
2 1 3 4
2 1 4 3
2 3 1 4
2 3 4 1
2 4 1 3
2 4 3 1
3 1 2 4
3 1 4 2
3 2 1 4
3 2 4 1
3 4 1 2
3 4 2 1
4 1 2 3
4 1 3 2
4 2 1 3
4 2 3 1
4 3 1 2
4 3 2 1

 ◎  코드 작성 전, 아래와 같이 솔루션을 정리하였습니다.

N까지의 숫자를 각 자리수 별로 출력. (N 고정)

공백으로 구분하여 M번 만큼 출력, M번의 반복문을 M번의 재귀 형태로 설계

반복하여 출력 중, 반드시 중복된 숫자는 생략

DFS 형태의 재귀 함수 구현

 차후, 추가 설명 작성 예정


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {
	public static int[] narr = new int[10];
	public static boolean[] barrSearch = new boolean[10];
	static BufferedWriter bWriter = new BufferedWriter(new OutputStreamWriter(System.out));

	static int N;
	static int M;
	
	public static void NandM(int nNum) throws IOException {
		if(nNum == M) {
			for(int i = 0; i < M; i++) {
				bWriter.write(narr[i] + " ");
			}
			bWriter.write("\n");
			return;
		}
		
		for(int i = 1; i <= N ; i++) {
			if(!barrSearch[i]) {
				narr[nNum] = i;
				barrSearch[i] = true;
				NandM(nNum+1);
				barrSearch[i] = false;
			}
		}
	}

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in));
		
		StringTokenizer st = new StringTokenizer(bReader.readLine());
		
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		
		NandM(0);
		
		bWriter.flush();
		bWriter.close();

	}

}

힘들지만 재밌다!!22

읽어주셔서 감사합니다!

Good Luck! (피드백 감사합니다!)