728x90

문제

 

 

접근 방식

1 1 1
1 1 2
1 1 3
1 2 2
1 2 3
1 3 3
2 2 2
2 2 3
2 3 3
3 3 3

 

우선 1부터 N까지의 숫자를 중복이 가능하게 3개를 뽑아서 수열을 만들 수 있을 때

위와 같은 규칙대로 수열을 만들어야 한다.

 

111, 112, 113 >> 122, 123

 

위의 숫자를 보면 규칙을 하나 찾을 수 있는데

다음에 올 수 있는 숫자의 범위는

항상 이전의 숫자보다 같거나 커야 한다.

 

별 찍기도 그렇고 N과 M시리즈도 그렇고

혼자 규칙 찾아서 풀어야 하는거만 빼면

재귀 연습하기는 참 좋긴하다...

 

어쨋든 이 규칙대로 수열을 만들기 위해서는

재귀 호출을 할 때 다음에 올 숫자의 시작 범위를

파라미터로 넘겨줘야 한다는 것이다.

 

이 부분만 생각하면서 풀면 어렵지 않게 풀 수 있는데

규칙을 잘못 알아서 삽질을 했던 문제다...

 

풀이

public class Main {

	private static StringBuilder sb = new StringBuilder();
	private static int n;
	private static int m;
	private static int[] arr;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		String[] nm = br.readLine().split(" ");

		n = Integer.parseInt(nm[0]);
		m = Integer.parseInt(nm[1]);

		arr = new int[m];

		makeNumber(0, 1);

		System.out.println(sb);
	}

	private static void makeNumber(int size, int start) {
		if (size == m) {
			for (int i = 0; i < m; i++) {
				sb.append(arr[i]).append(" ");
			}

			sb.append("\n");

			return;
		}

		for (int i = start; i <= n; i++) {
			arr[size] = i;
			makeNumber(size + 1, i);
		}
	}
}

 

'Java > Algorithms' 카테고리의 다른 글

[백준] 15655번 : N과 M (6)  (0) 2023.10.29
[백준] 15654번 : N과 M (5)  (0) 2023.10.29
[백준] 15651번 : N과 M (3)  (0) 2023.10.28
[백준] 2448번 : 별 찍기 - 11  (0) 2023.10.27
[백준] 2447번 : 별 찍기 - 10  (0) 2023.10.27

+ Recent posts