package main
import (
"bufio"
"os"
"sort"
"strconv"
"strings"
)
var reader = bufio.NewReader(os.Stdin)
var writer = bufio.NewWriter(os.Stdout)
var N,M int
var ar,numbers []int
func back(k,prev int){
if k==M{
// fmt.Println(ar)
for i:=0;i<M;i++{
writer.WriteString(strconv.Itoa(ar[i])+" ")
}
writer.WriteByte(0xa)
return
}
temp:=-1
for i:=prev;i<N;i++{
if numbers[i] != temp{
ar[k]=numbers[i]
temp = numbers[i]
back(k+1,i)
}
}
}
func main(){
defer writer.Flush()
bytes,_,_ := reader.ReadLine()
nums:=strings.Fields(string(bytes))
N,_ = strconv.Atoi(nums[0])
M,_ = strconv.Atoi(nums[1])
bytes,_,_ = reader.ReadLine()
nums = strings.Fields(string(bytes))
ar=make([]int, M,10)
numbers=make([]int, N,10)
for i,v := range nums{
numbers[i],_=strconv.Atoi(v)
}
sort.Ints(numbers)
back(0,0)
}
N,M 그리고 정수를 N 개 입력받는다.
이 정수들로 수열을 만드는데 중복되지 않고 비내림차순이어야 한다.
back 함수는 인자로 k, prev
를 받는다
k 는 N 까지 ar 에 값을 채워넣는 인덱스 역할을 하고,
prev 는 비내림차순으로 ar 에 값을 넣기위해 이전 함수에서 호출한 시점의 i 값을 저장하고있다.
ex : 1 2 4 7 → 1 을 ar 에 넣으면 다음 ar 에 들어갈 수 있는 값은 idx = 0 부터 (비내림차순)
2 를 ar 에 넣으면 다음 ar 에 들어갈 수 있는 값은 idx = 1 부터 2,4,7
중복되는 수열을 없애기 위해 tmp
변수를 만들어서, ar[k]
에 들어갔던 값을 저장한 뒤
현재 numbers[i] 값과 다른지만 검사하면 된다.
[1,2,4,?,?,?] -> ar[2] 에 4(numbers[i])를 넣고 재귀호출해서 모든 수열을 구한다.
[1,2,4,?,?,?] -> 다음 수도 4(numbers[i+1]일 때, 재귀호출하면 중복되는 수열이 출력된다.
이를 막기위해 ar[k] 에 들어간 값을 tmp 에 저장한 뒤, 현재 numbers[i] 와 비교해서 걸러야한다.
입력받을 때 중복을 제거하는 방법도 있다.
go 언어로 짜면서 배운거
var reader = bufio.NewReader(os.Stdin)
var writer = bufio.NewWriter(os.Stdout)
이거 선언해서 입출력하면 좀 더 빨라진다.
reader 은 무조건 바이트배열로 받아서 []byte → string → int
이렇게 변환하면 된다.
writer 의 WriteString 메소드로 정수 출력할 때 int → string
바꿔줘야한다.
defer writer.Flush()
이거 메인함수에 안해주면 출력안됨 ㅅㄱ
sort 함수는 슬라이스를 대상으로 정렬해주기 때문에,
고정배열을 인자로 줄 수 없다.