晩夏なのでGolangでAtCoder精選10問を解く。

晩夏は特に関係ないです。
早速やっていき。

### 🐬 [ABC 086 A - Product (100 点)](https://atcoder.jp/contests/abc086/tasks/abc086_a)
```go
// ABC 086 A - Product
package main

import (
	"fmt"
)

func main() {
	var a, b int
	fmt.Scanf("%d %d", &a, &b)
	if (a*b)%2 == 0 {
		fmt.Println("Even")
	} else {
		fmt.Println("Odd")
	}
}
```
#### 📝メモ
`Odd`を`Odds`とtypoしてWA出したけど内緒。
`fmt.Scan`は遅いらしいがとりあえずはまだ影響出るレベルではない。
そうなったとき考える。

**--参考--**
[Go 言語で標準入力から読み込む競技プログラミングのアレ --- 改訂第二版 - Qiita](https://qiita.com/tnoda_/items/b503a72eac82862d30c6)

### 🐬 [ABC 081 A - Placing Marbles (100 点)](https://atcoder.jp/contests/abc081/tasks/abc081_a)
```go
// ABC 081 A - Placing Marbles
package main

import (
	"fmt"
)

func main() {
	var str string
	fmt.Scan(&str)
	cnt := 0
	for i := 0; i < len(str); i++ {
		if str[i] == '1' {
			cnt++
		}
	}
	fmt.Print(cnt)
}
```
#### 📝メモ
与えられるのが数字列と決まっているでやりやすい。

### 🐬 [ABC 081 B - Shift Only (200 点)](https://atcoder.jp/contests/abc081/tasks/abc081_b)
```go
// ABC 081 B - Shift Only
package main

import "fmt"

func main() {
	var n, cnt int
	var a []int
	fmt.Scan(&n)
	a = make([]int, n)
	for i := 0; i < n; i++ {
		fmt.Scan(&a[i])
	}

	flag := true
	for flag {
		for i := 0; i < n; i++ {
			if a[i]%2 == 0 {
				a[i] /= 2
			} else {
				flag = false
			}
		}
		if flag {
			cnt++
		}
	}
	fmt.Print(cnt)
}
```
#### 📝メモ
`for flag` で無限ループ。<br>
`すべてが偶数であれば`を`一つでも偶数があれば`と読み間違えてWAを出した。

### 🐬 [ABC 087 B - Coins (200 点)](https://atcoder.jp/contests/abc087/tasks/abc087_b)
```go
// ABC 087 B - Coins
package main

import "fmt"

func main() {
	var A, B, C, X, cnt int
	fmt.Scan(&A, &B, &C, &X)

	for a := 0; a <= A; a++ {
		for b := 0; b <= B; b++ {
			for c := 0; c <= C; c++ {
				if a*500+b*100+c*50 == X {
					cnt++
				}
			}
		}
	}
	fmt.Println(cnt)
}

```
#### 📝メモ
全探索。三重ループは見るだけで心的負荷が高い。

### 🐬 [ABC 083 B - Some Sums (200 点)](https://atcoder.jp/contests/abc083/tasks/abc083_b)
```go
// ABC 083 B - Some Sums 
package main

import (
	"fmt"
	"log"
)

func main() {
	var n, a, b, total int
	fmt.Scan(&n, &a, &b)

	for i := 1; i < (n + 1); i++ {
		var x [3]int
		var y int
		if i >= 1000 {
			x[0] = i / 1000
		}
		if i >= 100 {
			x[1] = i / 100
		}
		if i >= 10 {
			x[2] = i / 10
		}

		y = i - x[0]*1000 - x[1]*100 - x[2]*10
		res := x[0] + x[1] + x[2] + y

		if res >= a && res <= b {
			total += i
			log.Printf("n = %d -> res:%d", i, res)

		}
	}
	fmt.Print(total)
}
```
#### 📝メモ
これも`A以上B以下`の条件を`AorBに等しくなる`と取り間違えて最初にWAを出してしまった。途中のデバッグログは反省として消さずに残しておく。

### 🐬 [ABC 088 B - Card Game for Two (200 点)](https://atcoder.jp/contests/abc088/tasks/abc088_b)
```go
// ABC 088 B - Card Game for Two
package main

import (
	"fmt"
	"sort"
)

func main() {
	var n, a int
	fmt.Scan(&n)
	arr := make([]int, n)
	for i := range arr {
		fmt.Scan(&a)
		arr[i] = a
	}
	sort.Sort(sort.Reverse(sort.IntSlice(arr)))

	var alice, bob int
	for i := range arr {
		if i%2 == 0 {
			alice += arr[i]
		} else {
			bob += arr[i]
		}
	}
	fmt.Println(alice-bob)
}
```
#### 📝メモ
sort packageを使って解決。（降順にする方法がわからずに調べた。）<br>
golangのsortに関してはいろいろ気になるところがあったので後日また記事にする。

### 🐬 [ABC 085 B - Kagami Mochi (200 点)](https://atcoder.jp/contests/abc085/tasks/abc085_b)
```go
// ABC 085 B - Kagami Mochi
package main

import "fmt"

func main() {
	var n int
	fmt.Scan(&n)
	d := make([]int, n)
	for i := 0; i < n; i++ {
		fmt.Scan(&d[i])
	}
	p := make(map[int]int)
	for v := range d {
		p[d[v]]++
	}
	fmt.Println(len(p))
}
```
#### 📝メモ
mapを使ってカウント。問題の意図を間違えなければ非常に単純。

### 🐬 [ABC 085 C - Otoshidama (300 点)](https://atcoder.jp/contests/abc085/tasks/abc085_c)
```go
// ABC 085 C - Otoshidama
package main

import "fmt"

func main() {
	var n, y int
	fmt.Scan(&n, &y)

	for i := 0; i <= n; i++ {
		for j := 0; j <= (n - i); j++ {
			k := n - (i + j)
			total := 10000*i + 5000*j + 1000*k
			if total == y {
				fmt.Println(i, j, k)
				return
			}
		}
	}
	fmt.Println(-1, -1, -1)
}
```
#### 📝メモ
素直にやったらTLEになりそうだったのでちょっと工夫した。


### 🐬 [ABC 049 C - Daydream (300 点)](https://atcoder.jp/contests/abc049/tasks/arc065_a)
```go
// ABC 049 C - Daydream
package main

import (
	"fmt"
	"strings"
)

func main() {

	var s string
	fmt.Scan(&s)

	s = reverse(s)
	s = strings.Replace(s, "resare", "", -1)
	s = strings.Replace(s, "esare", "", -1)
	s = strings.Replace(s, "remaerd", "", -1)
	s = strings.Replace(s, "maerd", "", -1)

	var res string
	if len(s) == 0 {
		res = "YES"
	} else {
		res = "NO"
	}
	fmt.Println(res)
}

func reverse(s string) string {
	rs := []rune(s)
	for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
		rs[i], rs[j] = rs[j], rs[i]
	}
	return string(rs)
}
```
#### 📝メモ
文字列の反転。自前で実装する必要があった。ただindexを見て反転させていくとバイト列なのでぐちゃぐちゃになってしまう。runeを使う。

**--参考--**
[Go言語で文字列を逆順に並び替える - Misc Notes](http://y0m0r.hateblo.jp/entry/20131008/1381244919)

### 🐬 [ABC 086 C - Traveling (300 点)](https://atcoder.jp/contests/abc086/tasks/arc089_a)
```go
// ABC 086 C - Traveling
package main

import (
	"fmt"
	"math"
)

func main086C() {
	var n int
	fmt.Scan(&n)

	var t int
	var x, y float64
	t, x, y = 0, 0.0, 0.0 // initialized

	var tNext int
	var xNext, yNext float64

	flag := "Yes"
	for i := 0; i < n; i++ {
		fmt.Scan(&tNext, &xNext, &yNext)

		// 残り時間
		T := tNext - t
		// 目的地までの距離（マンハッタン距離）
		dist := math.Abs(xNext-x) + math.Abs(yNext-y)

		// 残り時間より必要な移動距離のほうが長い
		if T < int(dist) {
			flag = "No"
		}
		// 着いてからのあまり時間が偶数であれば行き帰りできる
		if (T-int(dist))%2 == 1 {
			flag = "No"
		}
		// updated
		t, x, y = tNext, xNext, yNext
	}
	fmt.Println(flag)
}
```
#### 📝メモ
自分で解けなかったので、答えを調べる。この人の説明がわかりやすかった。

**-参考-**
[AtCoderBeginnerContest086 C問題300点「Traveling」 - scrapbox(ganariya)](https://scrapbox.io/ganariya/AtCoderBeginnerContest086_C%E5%95%8F%E9%A1%8C300%E7%82%B9_%E3%80%8CTraveling%E3%80%8D)

------

Gistにも同じコードを載せてあります。

[AtCoder過去問精選10問 Golangで解いてみた -Gist](https://gist.github.com/ogrew/21d6d2db0c43283b23b50de958003fd7)

-----


この記事は著者のブログからの転載記事となります。

[晩夏なのでGolangでAtCoder精選10問を解く。 - DOT NOTES](https://taiga.hatenadiary.com/entry/2019/09/12/181832)