넘치게 채우기

[BOJ] 15649 - N과 M (1) 본문

PS/BOJ

[BOJ] 15649 - N과 M (1)

riveroverflow 2025. 2. 3. 22:31
728x90
반응형

https://www.acmicpc.net/problem/15649

BOJ - N과 M (1)

문제 유형: 백트래킹

문제 난이도: Silver III

시간 제한: 1초

메모리 제한: 512MB

 

문제

자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.

  • 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열

 

입력

첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)

 

출력

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.

수열은 사전 순으로 증가하는 순서로 출력해야 한다.

 

풀이

만약 현재 수를 수열에 포함하지 않았다면, 포함시키고 재귀호출한다. 재귀호출이 끝났다면 다시 수열에 제외시키고 다음으로 넘어가는 식으로 하면 된다.

재귀호출에서 길이가 m에 도달하면, 출력을 해주면 된다.

 

코드

C++

#include <bits/stdc++.h>

using namespace std;

int n, m;

void solve(int len, int state, vector<int> &arr) {
  if (len == m) {
    for (const auto &elem : arr) {
      cout << elem << " ";
    }
    cout << "\n";
  }
  for (int i = 1; i <= n; ++i) {
    if (!(state & (1 << i))) {
      state |= (1 << i);
      arr.emplace_back(i);
      solve(len + 1, state, arr);
      state &= ~(1 << i);
      arr.pop_back();
    }
  }
}

int main(int argc, char *argv[]) {
  ios_base::sync_with_stdio(0);
  cin.tie(0);

  cin >> n >> m;
  vector<int> arr;
  for (int i = 1; i <= n; ++i) {
    arr.emplace_back(i);
    int state = (1 << i);
    solve(1, state, arr);
    arr.pop_back();
  }

  return 0;
}

 

Go

package main

import (
	"bufio"
	"fmt"
	"os"
)

var n int32
var m int32
var reader *bufio.Reader
var writer *bufio.Writer

func solve(visited []bool, arr []int32) {
	if int32(len(arr)) == m {
		for _, v := range arr {
			fmt.Fprint(writer, v)
			fmt.Fprint(writer, " ")
		}
		fmt.Fprintln(writer)
		return
	}

	for i := int32(1); i <= n; i++ {
		if visited[i] == false {
			visited[i] = true
			arr = append(arr, i)
			solve(visited, arr)
			visited[i] = false
			arr = arr[:len(arr)-1]
		}
	}
}

func main() {
	reader = bufio.NewReader(os.Stdin)
	writer = bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	fmt.Fscan(reader, &n)
	fmt.Fscan(reader, &m)

	arr := make([]int32, 0)
	visited := make([]bool, n+1)
	for i := int32(1); i <= n; i++ {
		visited[i] = true
		arr = append(arr, i)
		solve(visited, arr)
		visited[i] = false
		arr = arr[:len(arr)-1]
	}
}
728x90
반응형

'PS > BOJ' 카테고리의 다른 글

[BOJ] 2583 - 영역 구하기  (0) 2025.02.03
[BOJ] 7562 - 나이트의 이동  (0) 2025.02.03
[BOJ] 12850 - 본대 산책2  (0) 2025.02.03
[BOJ] 2098 - 외판원 순회  (0) 2025.02.02
[BOJ] 2887 - 행성 터널  (0) 2025.02.01