codingtest

15652번 - N과 M (4)

2026-01-30
2분 분량
JAVA백준

문제 링크

문제 풀이 시간 : 15분

문제 요약

  • 주어진 n과 m에 대해 1부터 n까지의 수로 이루어진 비내림차순 수열을 구하는 문제
  • 수열은 m개의 숫자로 이루어져 있고, 같은 수를 여러 번 고를 수 있음
  • 수열은 비내림차순이어야 하며, 사전 순으로 출력해야 함

문제 풀이

이 문제는 백트래킹 기법을 사용하면 해결할 수 있다.

접근 방법

  • n개의 숫자 중에서 m개의 숫자를 선택하는 문제인데, 각 숫자는 이전 숫자보다 크거나 같은 숫자여야 한다.
  • 비내림차순 조건을 만족시키기 위해 재귀적으로 이전 수보다 크거나 같은 수를 고르면 된다.
  • 중복이 허용되므로, 수열을 생성하는 동안 중복된 수가 나오지 않도록 주의할 필요는 없지만, 비내림차순 조건이므로 이전 숫자부터 고르게 된다.

백트래킹 설명

  1. arr 배열을 만들어 m개의 숫자를 저장한다.
  2. find(idx, a) 함수는 arr[idx]에 값을 할당하고, 그 값이 a 이상이어야 한다. 이때 a는 이전에 고른 숫자다.
  3. idx == m이면, arr 배열이 완성된 상태이므로 해당 배열을 출력한다.
  4. 재귀적으로 진행하면서 중복된 값을 허용하지만, 비내림차순 조건을 만족하기 위해 이전 값부터 선택할 수 있도록 한다.

최종 코드

java
import java.io.*;
import java.util.*;

public class Main {
	public static int[] arr;
	public static int n,m;
	public static StringBuilder sb = new StringBuilder();
	
	public static void find(int idx, int a) {
		if(idx == m) {
			for(int num : arr) {
				sb.append(num).append(" ");
			}
			sb.append("\n");
			return;
		}
		
		for(int i=a;i<=n;i++) {
			arr[idx] = i;
			find(idx+1, i);
		}
	}
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		n = Integer.parseInt(st.nextToken());
		m = Integer.parseInt(st.nextToken());
		
		arr = new int[m];
		find(0,1);
		
		System.out.println(sb.toString());
	}
}

함께 읽으면 좋은 글

코딩 테스트2026-04-02

5430번 - AC

함수 R은 배열을 뒤집는 연산 함수 D는 첫 번째 원소를 버리는 연산 단, 배열이 비어 있을 때 D를 수행하면 error 주어진 함수 문자열을 순서대로 수행한 뒤 최종 배열을 출력하는 문제 처음에는 문제 설명 그대로 R이 나올 때마다 배열을 실제로 뒤집고, D가 나오면 맨 앞…

코딩 테스트2026-04-02

1966번 - 프린터 큐

여러 문서가 큐에 들어 있고, 각 문서마다 중요도가 있음 맨 앞 문서를 확인했을 때, 더 높은 중요도의 문서가 뒤에 하나라도 있으면 맨 뒤로 보냄 그렇지 않으면 바로 인쇄 특정 위치의 문서가 몇 번째로 인쇄되는지 구하는 문제 이 문제는 프린터의 동작을 그대로 구현하면 되는…

코딩 테스트2026-03-29

1158 - 요세푸스 문제

1번부터 N번까지 사람이 원형으로 앉아 있음 순서대로 K번째 사람을 제거 모든 사람이 제거될 때까지 반복 제거되는 순서를 출력하는 문제 이 문제는 원형으로 순회하면서 K번째를 제거하는 과정을 그대로 구현하면 된다.

코딩 테스트2026-03-29

2164번 - 카드2

1부터 N까지 카드가 순서대로 쌓여 있음 맨 위 카드를 버리고, 그다음 맨 위 카드를 맨 아래로 옮기는 과정을 반복 마지막에 남는 카드 번호를 구하는 문제 이 문제는 규칙을 찾기보다, 문제에서 하라는 과정을 그대로 구현하면 된다. 카드 더미에서 반복되는 동작은 두 가지다.