Notice
250x250
Recent Posts
Recent Comments
Link
넘치게 채우기
[BOJ] 15649 - N과 M (1) 본문
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 |