본문 바로가기
Algorithm

(BOJ) 15666 풀이

by snwo 2022. 3. 9.
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 함수는 슬라이스를 대상으로 정렬해주기 때문에,

고정배열을 인자로 줄 수 없다.