package main import ( "bufio" "fmt" "os" "sort" "strconv" "strings" ) // エントリポイント func main() { in := bufio.NewScanner(os.Stdin) in.Scan() // 敵を倒す回数 input1 := in.Text() // 敵を倒した時のもらえる3つのアイテムの番号 input2 := make([]string, 0) for in.Scan() { input2 = append(input2, in.Text()) } fmt.Println(powerUp(input1, input2)) } // パワーアップする最大の回数を求める。 func powerUp(num string, items []string) string { _ = num intItems := make([]int, 0) // 2次元配列のstringを1次元配列のintに変換 for _, v := range items { sp := strings.Split(v, " ") for _, v2 := range sp { i, _ := strconv.Atoi(v2) intItems = append(intItems, i) } } sort.Sort(sort.IntSlice(intItems)) count := 0 loop := true // 同じ値が2つあるか for loop { intItems, loop = removePair(intItems) if loop { count++ } } // 値が4つあるか count += len(intItems) / 4 return strconv.Itoa(count) } // 線形探索で同一の値を削除した配列を返す。事前にソートしておくこと。 // 同一の値があれば、同一の値を削除した配列と、trueを返す。 // 同一の値があれば、変更のない配列と、falseを返す。 func removePair(items []int) ([]int, bool) { rtnAry := make([]int, 0) for i := 0; i < len(items)-1; i++ { if items[i] == items[i+1] { for i2 := range items { if i2 == i || i2 == i + 1 { continue } rtnAry = append(rtnAry, items[i2]) } return rtnAry, true } } return items, false }