본문 바로가기
Beakjoon&프로그래머스/Java

[백준/Java] 4779번 N과 M (2)

by 현장 2025. 12. 28.

-Code

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Scanner;

public class BOJ15650 {
    static Deque<Integer> nums = new ArrayDeque<>();
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        int m = sc.nextInt();
        // 백트랙킹 로직 시작
        backtracking(0, n, m);
    }

    private static void backtracking(int start, int length, int cnt) {
        // 현제 nums의 크기와 필요 갯수가 같다면 출력
        if (nums.size() == cnt) {
            printNums();
            return;
        }
        // visited를 돌면서 false인 경우 nums에 넣고 돌아감
        for (int i = start; i < length; i++) {
            // 현재수 추가
            nums.addLast(i + 1);
            // 백트래킹으로 재귀
            backtracking(i + 1, length, cnt);
            // 현재 수 제거
            nums.pollLast();
        }
    }
    // 출력
    private static void printNums() {
        StringBuilder sb = new StringBuilder();
        for (int num : nums) {
            sb.append(num).append(" ");
        }
        System.out.println(sb);
    }
}

이전에 풀었던 n과 m (1)을 참고하여 코드를 짜다가 for문의 시작점을 바꾸면 될 거 같다고 생각을 했습니다. 처음에는 visited에 너무 신경을 쓰기도 하고 start라는 변수에 이것저것 넣어서 하다가 이상한 코드가 되었습니다. 그래서 찾아보니 start를 가지고 print문에 들어가는 걸 비교하다 보니 start값이 변동이 되면 이상한 값이 출력되는 거라 덱을 사용하고 그 크기에 맞춰서 출력하도록 해서 해결했습니다.