본문 바로가기
Algorithm

(BOJ) 1759 풀이

by snwo 2022. 3. 12.
package main

import (
    "bufio"
    "os"
    "sort"
    "strconv"
    "strings"
)
var io = bufio.NewReadWriter(bufio.NewReader(os.Stdin),bufio.NewWriter(os.Stdout))
var L,C int
var ar []string
func back(k,c,v,prev int){
    if k==L{
        if c>1 && v>0{
            for _,c :=range ar{
                io.WriteString(c)
            }
            io.WriteByte('\n')
        }
        return
    }
    for i:=prev;i<C;i++{
        ar[k]=numbers[i]
        switch numbers[i]{
            case
                "a",
                "e",
                "i",
                "o",
                "u":
                back(k+1,c,v+1,i+1)
            default:
                back(k+1,c+1,v,i+1)
        }
    }
}

var numbers[]string
func main(){
    defer io.Flush()
    bytes,_,_ :=io.ReadLine()
    nums:=strings.Fields(string(bytes))
    L,_=strconv.Atoi(nums[0])
    C,_=strconv.Atoi(nums[1])
    numbers=make([]string,C,C)
    ar=make([]string,C,C)

    bytes,_,_ = io.ReadLine()
    numbers=strings.Fields(string(bytes))
    sort.Strings(numbers)
    back(0,0,0,0)
}

bufio 에 NewReadWriter 이 있길래, io 변수에 저장해서 변수 하나로 read, write 할 수 있게 짰다.

문자열을 정렬하고, ar 에 문자 하나씩 넣어서 백트래킹 한다.

 

함수 인자에 자음, 모음 갯수를 넣어줘서 k == L 일 때 최소조건을 만족하는지 검사하고 문자열을 출력해준다.

 

또한 백트래킹 함수를 호출한 시점의 i 값 +1 을 인자 prev 에 넘겨줘서

호출된 함수의 반복문이 numbers 의 prev 부터 참조해 ar 이 오름차순으로 정렬될 수 있게 한다.

(numbers 는 오름차순으로 정렬되어있음. 변수이름을 잘못지엇다)