15652번 - N과 M (4)
2026-01-30
2분 분량
JAVA백준
문제 풀이 시간 : 15분
문제 요약
- 주어진
n과m에 대해1부터n까지의 수로 이루어진 비내림차순 수열을 구하는 문제 - 수열은
m개의 숫자로 이루어져 있고, 같은 수를 여러 번 고를 수 있음 - 수열은 비내림차순이어야 하며, 사전 순으로 출력해야 함
문제 풀이
이 문제는 백트래킹 기법을 사용하면 해결할 수 있다.
접근 방법
n개의 숫자 중에서m개의 숫자를 선택하는 문제인데, 각 숫자는 이전 숫자보다 크거나 같은 숫자여야 한다.- 비내림차순 조건을 만족시키기 위해 재귀적으로 이전 수보다 크거나 같은 수를 고르면 된다.
- 중복이 허용되므로, 수열을 생성하는 동안 중복된 수가 나오지 않도록 주의할 필요는 없지만, 비내림차순 조건이므로 이전 숫자부터 고르게 된다.
백트래킹 설명
arr배열을 만들어m개의 숫자를 저장한다.find(idx, a)함수는arr[idx]에 값을 할당하고, 그 값이a이상이어야 한다. 이때a는 이전에 고른 숫자다.idx == m이면,arr배열이 완성된 상태이므로 해당 배열을 출력한다.- 재귀적으로 진행하면서 중복된 값을 허용하지만, 비내림차순 조건을 만족하기 위해 이전 값부터 선택할 수 있도록 한다.
최종 코드
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까지 카드가 순서대로 쌓여 있음 맨 위 카드를 버리고, 그다음 맨 위 카드를 맨 아래로 옮기는 과정을 반복 마지막에 남는 카드 번호를 구하는 문제 이 문제는 규칙을 찾기보다, 문제에서 하라는 과정을 그대로 구현하면 된다. 카드 더미에서 반복되는 동작은 두 가지다.