코딩테스트 대비/백준 알고리즘

BOJ - 15651 N과 M(3)

JellyApple 2024. 11. 24. 23:39

1. 문제 링크 : https://www.acmicpc.net/problem/15651

2. 문제 티어 : 실버3

3. 문제 유형: 백트래킹

4. 문제 풀이

1) N과 M(1) , N과 M(2)에 이은 백트래킹으로 길이가 M인 수열을 구하는 문제 시리즈이다.

2) 같은 수를 여러 번 골라도 된다는 조건이 있기에 start 혹은 i+1 등으로 인덱스를 부여할 필요가 없으며

3) 하나의 계산을 끝내고 그 다음 계산을 할 때 이전 선택과 관계 없이 n까지 모두 돌려도 된다는 뜻이다. 

4) 3) 과 같이 할 시 console.log로 출력값을 찍는 부분에서 시간 초과가 이루어질 수 있으니 미리 새로운 배열에 문자열을 생성해서 한 번에 출력하여 백준의 시간 초과 문제를 해결하는 방법이다.

5) 기존 (1)과 (2) 에서는 console.log를 수열 하나를 완성할 때마다 console.log를 출력해줬으나 지금은 모든 결과를 메모리(result 배열)에 저장한 후, 한 번만 출력한다.

 

5. 문제 코드

const fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().split("\n");
let [N, M] = input[0].split(" ").map(Number);

let result = [];
function recursive(current, n, m) {
    if (current.length === m) {
        // 결과를 문자열로 저장
        result.push(current.join(" "));
        return;
    }
    for (let i = 1; i <= n; i++) {
        current.push(i);
        recursive(current, n, m); // 중복 선택 가능
        current.pop();           // 백트래킹
    }
}

recursive([], N, M);
console.log(result.join("\n"));

'코딩테스트 대비 > 백준 알고리즘' 카테고리의 다른 글

BOJ - 10971 외판원 순회 2  (0) 2024.12.15
BOJ - 15652 N과 M(4)  (1) 2024.12.06
BOJ - 15650 N과 M(2)  (1) 2024.11.24
BOJ - 7490 0 만들기  (0) 2024.11.24
BOJ - 10974번 모든 순열  (0) 2024.11.22