Go で競技プログラミング攻略2 (AtCoder Beginners Selection 7~)

# はじめに
この記事は自分のためにメモとして書いてあるので書き方はテキトー
間違っていたりこうしたらいいよっていうのは教えていただけるとありがたいです
競プロはマジの初心者スタートでやっていきたいと思います

## [ABC088B - Card Game for Two](https://atcoder.jp/contests/abs/tasks/abc088_b)

 > 人とも自分の得点を最大化するように最適な戦略を取った時, Alice は Bob より何点多く取るか求めてください. 

つまりは、順番に最大の数を取っていくということか。

sortパッケージを使うと一発でソートしてくれる最高

たくさん読み込めるようにするため以前作ったこれを使用

~~~go
//文字列を１列入力
func scanStringLine() string {
	var strLine string
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Scan()
	strLine = scanner.Text()
	return strLine
}

//string型の配列からint型の配列に変換
func StrToInt(strList []string) []int {
	var numList []int
	var toInt int
	for _, v := range strList {
		toInt, _ = strconv.Atoi(v)
		numList = append(numList, toInt)
	}
	return numList
}
~~~
<br>
### int型の配列のソート
こんな感じにすると昇順で並び替えてくれる。

~~~go
sort.Ints(numList)
~~~

gameの処理を書く

~~~go
func game(numList []int) int {
	alliceSum := 0
	bobSum := 0
	ans := 0
	//alliceのturnは0,bobは1
	turn := 0

	for i := len(numList) - 1; 0 <= i; i-- {
		if turn == 0 {
			alliceSum += numList[i]
			turn = 1
		} else {
			bobSum += numList[i]
			turn = 0
		}
	}
        //得点差
	ans = alliceSum - bobSum
	return ans
}
~~~

turnのところすごく気に食わない
改善案あったら教えてください

とりあえず
こんな感じになったよ

~~~main.go
package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
	"strconv"
	"strings"
)

func main() {
	var N int
	var strNumbers string
	var numList []int
	var arr []string

	//Nの入力
	fmt.Scanf("%d", &N)

	//文字列を空白で区切って文字列に入れてint型に変換
	strNumbers = scanStringLine()
	arr = strings.Split(strNumbers, " ")
	numList = StrToInt(arr)

	//numListを昇順にソート
	sort.Ints(numList)

	//gameの処理をして出力
	fmt.Println(game(numList))
}

//文字列を１列入力
func scanStringLine() string {
	var strLine string
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Scan()
	strLine = scanner.Text()
	return strLine
}

//string型の配列からint型の配列に変換
func StrToInt(strList []string) []int {
	var numList []int
	var toInt int
	for _, v := range strList {
		toInt, _ = strconv.Atoi(v)
		numList = append(numList, toInt)
	}
	return numList
}

func game(numList []int) int {
	alliceSum := 0
	bobSum := 0
	ans := 0
	//alliceのturnは0,bobは1
	turn := 0

	for i := len(numList) - 1; 0 <= i; i-- {
		if turn == 0 {
			alliceSum += numList[i]
			turn = 1
		} else {
			bobSum += numList[i]
			turn = 0
		}
	}
        //得点差
	ans = alliceSum - bobSum
	return ans
}

~~~

おk、提出

クリア


## [ABC085B - Kagami Mochi](https://atcoder.jp/contests/abs/tasks/abc085_b)

前回もそうなんだが最初の一文字は適当に読み込ませるだけで何も処理していない。
今回は入力回数が指定されているから、考えなきゃいけないんだけど

予想では、入力回数分forを回してその処理に配列に追加していくことにすればいいのかな？

~~~go
//N回分入力しint配列にいれる
func inputNumList(N int)[]int{
	var tmp int
	var numList []int
	for i := 0; i < N; i++ {
		fmt.Scanf("%d", &tmp)
		numList = append(numList, tmp)
	}
	return numList
}
~~~
tmpの変数定義したくないなぁ...
ScanFでそのままappend出来たらいいのに、、、、

まあ、とりあえず作っていこう

<br>

numListをsort.Ints()で昇順に直しておく

次の配列のvalueが大きいときのみcounter++するって感じの処理を拡張for文して回す。書いていこう

~~~go

func layerCounter(numList []int) int {
	layerSize := 0
	layerCount := 0
	for _, v := range numList {
		if layerSize < v {
			layerCount++
			layerSize = v
		}
	}
	return layerCount
}
~~~


結果こんな感じになりました

~~~main.go
package main

import (
	"fmt"
	"sort"
)

func main() {
	var N int
	var numList []int

	fmt.Scanf("%d", &N)
	numList = inputNumList(N)
	//numListのソート
	sort.Ints(numList)
	fmt.Println(layerCounter(numList))
}

//N回分入力しint配列にいれる
func inputNumList(N int) []int {
	var tmp int
	var numList []int
	for i := 0; i < N; i++ {
		fmt.Scanf("%d", &tmp)
		numList = append(numList, tmp)
	}
	return numList
}

func layerCounter(numList []int) int {
	layerSize := 0
	layerCount := 0
	for _, v := range numList {
		if layerSize < v {
			layerCount++
			layerSize = v
		}
	}
	return layerCount
}
~~~

比較的想像がつきやすかった
これでどうだろうか

おっ、クリア