はじめに

「エンジニア、アルゴリズムをサラッとコーディングできた方が良いのでは?」という思考があるので、最近競プロをちょこちょこやっています。
この記事にて、AOJのITPを1_10-Dまで解くといいよと書かれていたので実際にやってみました。
本当は真面目に競技プログラミングに取り組むのであればC++やPythonがいいんだろうな〜と思いつつ、今はまだコーディング力を向上させたいだけなので勉強中のGoで挑戦しました。
ITPのリザルトを見るとGoでやってる人がほぼいないことが分かった&せっかく最後まで取り組んだので、自分が書いたコードをブログに載せることにしました。 もし「もっとこう書いた方がGoっぽいよ!」や「こうした方が計算量やI/O少ないよ!」などありましたら、自分のTwitterか以下のリポジトリまでお願いします。

今回載せたコードのリポジトリ:GitHub
(雑にGoの勉強に使っているコードなのでリポジトリが汚くて申し訳ないです……)

回答例

1_1-A

package main

import (
	"fmt"
)

func main() {
	fmt.Println("Hello World")
}

1_1-B

package main

import (
	"fmt"
)

func main() {
	var n int
	fmt.Scanf("%d", &n)
	fmt.Println(n * n * n)
}

1_1-C

package main

import (
	"fmt"
)

func main() {
	var a, b int
	fmt.Scanf("%d %d", &a, &b)
	fmt.Printf("%d %d\n", a*b, a*2+b*2)
}

1_1-D

package main

import (
	"fmt"
)

func main() {
	var S int
	fmt.Scanf("%d", &S)

	h := S / 3600
	m := (S - h*3600) / 60
	s := S % 60
	fmt.Printf("%d:%d:%d\n", h, m, s)
}

1_2-A

package main

import (
	"fmt"
)

func main() {
	var a, b float64
	fmt.Scanf("%f %f", &a, &b)

	if a > b {
		fmt.Println("a > b")
	} else if a < b {
		fmt.Println("a < b")
	} else {
		fmt.Println("a == b")
	}
}

1_2-B

package main

import (
	"fmt"
)

func main() {
	var a, b, c int
	fmt.Scanf("%d %d %d", &a, &b, &c)

	if a < b && b < c {
		fmt.Println("Yes")
	} else {
		fmt.Println("No")
	}
}

1_2-C

package main

import (
	"fmt"
	"sort"
)

func main() {
	n := make([]int, 3)
	fmt.Scanf("%d %d %d", &n[0], &n[1], &n[2])
	sort.Slice(n, func(i int, j int) bool { return n[i] < n[j] })
	fmt.Printf("%d %d %d\n", n[0], n[1], n[2])
}

1_2-D

package main

import (
	"fmt"
)

func main() {
	var W, H, x, y, r int
	fmt.Scanf("%d %d %d %d %d", &W, &H, &x, &y, &r)

	if x-r >= 0 && y-r >= 0 && W >= x+r && H >= y+r {
		fmt.Println("Yes")
	} else {
		fmt.Println("No")
	}
}

1_3-A

package main

import (
	"fmt"
)

func main() {
	for i := 1; i <= 1000; i++ {
		fmt.Println("Hello World")
	}
}

1_3-B

package main

import "fmt"

func main() {
	i := 1
	var n int
	for {
		fmt.Scanf("%d", &n)
		if n == 0 {
			break
		}
		fmt.Printf("Case %d: %d\n", i, n)
		i++
	}
}

1_3-C

package main

import (
	"fmt"
)

func main() {
	var x, y int
	for {
		fmt.Scanf("%d %d", &x, &y)
		if x == 0 && y == 0 {
			break
		}
		if x > y {
			fmt.Printf("%d %d\n", y, x)
		} else {
			fmt.Printf("%d %d\n", x, y)
		}
	}
}

1_3-D

package main

import (
	"fmt"
)

func main() {
	var a, b, c, count int
	fmt.Scanf("%d %d %d", &a, &b, &c)

	count = 0
	for i := a; i <= b; i++ {
		if c%i == 0 {
			count++
		}
	}
	fmt.Println(count)
}

1_4-A

package main

import (
	"fmt"
)

func main() {
	var a, b int
	fmt.Scanf("%d %d", &a, &b)

	fmt.Printf("%d %d %f", a/b, a%b, float64(a)/float64(b))
}

1_4-B

package main

import (
	"fmt"
	"math"
)

func main() {
	var r float64
	fmt.Scanf("%f", &r)

	fmt.Printf("%f %f", r*r*math.Pi, r*2*math.Pi)
}

1_4-C

package main

import (
	"fmt"
)

func main() {
	var a, b int
	var op string
	for {
		fmt.Scanf("%d %s %d", &a, &op, &b)
		if op == "+" {
			fmt.Println(a + b)
		} else if op == "-" {
			fmt.Println(a - b)
		} else if op == "*" {
			fmt.Println(a * b)
		} else if op == "/" {
			fmt.Println(a / b)
		} else if op == "?" {
			break
		}
	}
}

1_4-D

package main

import (
	"fmt"
	"sort"
)

func main() {
	var n int
	fmt.Scanf("%d", &n)

	a := make([]int, n)
	sum := 0
	for i := 0; i < n; i++ {
		fmt.Scanf("%d", &a[i])
		sum += a[i]
	}
	sort.Slice(a, func(i int, j int) bool {
		return a[i] < a[j]
	})
	fmt.Println(a[0], a[n-1], sum)
}

1_5-A

package main

import (
	"fmt"
	"strings"
)

func main() {
	var H, W int
	for {
		fmt.Scanf("%d %d", &H, &W)

		for i := 1; i <= H; i++ {
			fmt.Println(strings.Repeat("#", W))
		}
		if H == 0 && W == 0 {
			break
		}
		fmt.Printf("\n")
	}
}

1_5-B

package main

import (
	"fmt"
	"strings"
)

func main() {
	var H, W int
	for {
		fmt.Scanf("%d %d", &H, &W)

		if H == 0 && W == 0 {
			break
		}

		for i := 1; i <= H; i++ {
			if i == 1 || i == H {
				fmt.Println(strings.Repeat("#", W))
			} else {
				for j := 1; j <= W; j++ {
					if j == 1 {
						fmt.Printf("#")
					} else if j == W {
						fmt.Println("#")
					} else {
						fmt.Printf(".")
					}
				}
			}
		}
		fmt.Printf("\n")
	}
}

1_5-C

package main

import (
	"fmt"
)

func main() {
	var H, W int
	for {
		fmt.Scanf("%d %d", &H, &W)

		if H == 0 && W == 0 {
			break
		}

		for i := 1; i <= H; i++ {
			for j := 1; j <= W; j++ {
				if i%2 != 0 && j%2 != 0 {
					fmt.Printf("#")
				} else if i%2 != 0 && j%2 == 0 {
					fmt.Printf(".")
				} else if i%2 == 0 && j%2 != 0 {
					fmt.Printf(".")
				} else if i%2 == 0 && j%2 == 0 {
					fmt.Printf("#")
				}

				if j == W {
					fmt.Printf("\n")
				}
			}
		}
		fmt.Printf("\n")
	}
}

1_5-D

package main

import (
	"fmt"
	"strconv"
	"strings"
)

func main() {
	var n int
	fmt.Scanf("%d", &n)

	for i := 1; i <= n; i++ {
		if i%3 == 0 || strings.Contains(strconv.Itoa(i), "3") {
			fmt.Printf(" %d", i)
		}
	}
}

1_6-A

package main

import (
	"fmt"
)

func main() {
	var n int
	fmt.Scanf("%d", &n)

	a := make([]int, n)
	for i := 0; i < n; i++ {
		fmt.Scanf("%d", &a[i])
	}
	for i := n - 1; i >= 0; i-- {
		if i == 0 {
			fmt.Printf("%d\n", a[i])
		} else {
			fmt.Printf("%d ", a[i])
		}
	}
}

1_6-B

package main

import "fmt"

func main() {
	m := make(map[string]map[int]int)
	marks := []string{"S", "H", "C", "D"}

	for i := 0; i < 4; i++ {
		m[marks[i]] = make(map[int]int)
		for j := 1; j <= 13; j++ {
			m[marks[i]][j] = 0
		}
	}

	var n int
	fmt.Scanf("%d", &n)

	var mark string
	var number int

	for i := 0; i < n; i++ {
		fmt.Scanf("%s %d", &mark, &number)
		m[mark][number] = 1
	}

	for i := 0; i < 4; i++ {
		for j := 1; j <= 13; j++ {
			if m[marks[i]][j] == 0 {
				fmt.Println(marks[i], j)
			}
		}
	}
}

1_6-C

package main

import (
	"fmt"
	"strings"
)

func main() {
	m1 := createMap()
	m2 := createMap()
	m3 := createMap()
	m4 := createMap()

	var n int
	fmt.Scanf("%d", &n)

	var b, f, r, v int

	for i := 0; i < n; i++ {
		fmt.Scanf("%d %d %d %d", &b, &f, &r, &v)

		if b == 1 {
			m1[f][r] += v
		} else if b == 2 {
			m2[f][r] += v
		} else if b == 3 {
			m3[f][r] += v
		} else if b == 4 {
			m4[f][r] += v
		}
	}
	printMap(m1)
	fmt.Println(strings.Repeat("#", 20))
	printMap(m2)
	fmt.Println(strings.Repeat("#", 20))
	printMap(m3)
	fmt.Println(strings.Repeat("#", 20))
	printMap(m4)
}

func createMap() map[int]map[int]int {
	m := make(map[int]map[int]int)
	for i := 1; i < 4; i++ {
		m[i] = make(map[int]int)
		for j := 1; j < 11; j++ {
			m[i][j] = 0
		}
	}

	return m
}

func printMap(m map[int]map[int]int) {
	for i := 1; i < 4; i++ {
		for j := 1; j < 11; j++ {
			fmt.Printf(" %d", m[i][j])
		}
		fmt.Printf("\n")
	}
}

1_6-D

package main

import (
	"fmt"
)

func main() {
	var n, m int
	fmt.Scanf("%d %d", &n, &m)

	a := make(map[int]map[int]int)
	b := make([]int, m)

	var tmp int
	for i := 0; i < n; i++ {
		a[i] = make(map[int]int)
		for j := 0; j < m; j++ {
			fmt.Scanf("%d", &tmp)
			a[i][j] = tmp
		}
	}
	for i := 0; i < m; i++ {
		fmt.Scanf("%d", &b[i])
	}

	for i := 0; i < n; i++ {
		sum := 0
		for j := 0; j < m; j++ {
			sum += a[i][j] * b[j]
		}
		fmt.Println(sum)
	}
}

1_7-A

package main

import (
	"fmt"
)

func main() {
	var m, f, r int
	for {
		fmt.Scanf("%d %d %d", &m, &f, &r)
		if m == -1 && f == -1 && r == -1 {
			break
		}
		if m == -1 || f == -1 {
			fmt.Println("F")
		} else if m+f >= 80 {
			fmt.Println("A")
		} else if m+f >= 65 && m+f < 80 {
			fmt.Println("B")
		} else if m+f >= 50 && m+f < 65 {
			fmt.Println("C")
		} else if m+f >= 30 && m+f < 50 && r >= 50 {
			fmt.Println("C")
		} else if m+f >= 30 && m+f < 50 && r < 50 {
			fmt.Println("D")
		} else if m+f < 30 {
			fmt.Println("F")
		}
	}
}

1_7-B

package main

import "fmt"

func main() {
	var n, x int
	for {
		fmt.Scanf("%d %d", &n, &x)
		if n == 0 && x == 0 {
			break
		}

		cnt := 0
		for i := 1; i <= n; i++ {
			for j := i + 1; j <= n; j++ {
				for k := j + 1; k <= n; k++ {
					if i+j+k == x {
						cnt++
					}
				}
			}
		}
		fmt.Println(cnt)
	}
}

1_7-C

package main

import (
	"fmt"
)

func main() {
	var r, c int
	fmt.Scanf("%d %d", &r, &c)
	var sum int
	w := make([]int, c)
	hSum := make([]int, c)
	for i := 0; i < r; i++ {
		sum = 0
		for j := 0; j < c; j++ {
			fmt.Scanf("%d", &w[j])
			sum += w[j]
			hSum[j] += w[j]

			if j == c-1 {
				fmt.Printf("%d %d\n", w[j], sum)
			} else {
				fmt.Printf("%d ", w[j])
			}
		}
	}

	sum = 0
	for i := range hSum {
		sum += hSum[i]

		if i == len(hSum)-1 {
			fmt.Printf("%d %d\n", hSum[i], sum)
		} else {
			fmt.Printf("%d ", hSum[i])
		}
	}
}

1_7-D

package main

import (
	"fmt"
)

func main() {
	var n, m, l int
	fmt.Scanf("%d %d %d", &n, &m, &l)

	a := make([][]int, n)
	for i := 0; i < n; i++ {
		a[i] = make([]int, m)
		for j := 0; j < m; j++ {
			fmt.Scanf("%d", &a[i][j])
		}
	}

	b := make([][]int, m)
	for i := 0; i < m; i++ {
		b[i] = make([]int, l)
		for j := 0; j < l; j++ {
			fmt.Scanf("%d", &b[i][j])
		}
	}

	for i := 0; i < n; i++ {
		for j := 0; j < l; j++ {
			tmp := 0
			for k := 0; k < m; k++ {
				tmp += a[i][k] * b[k][j]
			}
			if j == l-1 {
				fmt.Println(tmp)
			} else {
				fmt.Printf("%d ", tmp)
			}
		}
	}
}

1_8-A

package main

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

func main() {
	sc := bufio.NewScanner(os.Stdin)
	sc.Scan()
	tmp := sc.Text()
	for _, c := range tmp {
		if c >= rune('A') && c <= rune('Z') {
			fmt.Printf("%s", strings.ToLower(string(c)))
		} else if c >= rune('a') && c <= rune('z') {
			fmt.Printf("%s", strings.ToUpper(string(c)))
		} else {
			fmt.Printf("%s", string(c))
		}
	}
	fmt.Printf("\n")
}

1_8-B

package main

import (
	"fmt"
	"strconv"
)

func main() {
	var s string
	for {
		fmt.Scanf("%s", &s)
		if s == "0" {
			break
		} else {
			sum := 0
			for i := 0; i < len(s); i++ {
				n, _ := strconv.Atoi(string(s[i]))
				sum += n
			}
			fmt.Println(sum)
		}
	}
}

1_8-C

package main

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

func main() {
	keys := "abcdefghijklmnopqrstuvwxyz"
	cnt := make(map[string]int)
	sc := bufio.NewScanner(os.Stdin)

	for i := 0; i < len(keys); i++ {
		cnt[string(keys[i])] = 0
	}

	for {
		sc.Scan()
		if sc.Text() == "" {
			break
		} else {
			input := sc.Text()
			for i := 0; i < len(input); i++ {
				for j := 0; j < len(keys); j++ {
					tmp := strings.ToLower(string(input[i]))
					if tmp == string(keys[j]) {
						cnt[string(keys[j])]++
					}
				}
			}
		}
	}

	for i := 0; i < len(keys); i++ {
		fmt.Printf("%s : %d\n", string(keys[i]), cnt[string(keys[i])])
	}
}

1_8-D

package main

import (
	"fmt"
	"strings"
)

func main() {
	var s, p string
	fmt.Scanf("%s", &s)
	fmt.Scanf("%s", &p)

	s = strings.Repeat(s, 2)
	if strings.Contains(s, p) {
		fmt.Println("Yes")
	} else {
		fmt.Println("No")
	}
}

1_9-A

package main

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

func main() {
	var w string
	fmt.Scanf("%s", &w)

	sc := bufio.NewScanner(os.Stdin)
	cnt := 0
	for {
		sc.Scan()
		if sc.Text() == "END_OF_TEXT" {
			break
		}

		t := strings.Split(strings.ToLower(sc.Text()), " ")
		for i := 0; i < len(t); i++ {
			if t[i] == w {
				cnt++
			}
		}
	}
	fmt.Println(cnt)
}

1_9-B

package main

import "fmt"

func main() {
	for {
		var s string
		fmt.Scanf("%s", &s)
		if s == "-" {
			break
		}

		var m int
		fmt.Scanf("%d", &m)

		var h int
		for i := 0; i < m; i++ {
			fmt.Scanf("%d", &h)
			f := s[:h]
			l := s[h:]
			s = l + f
		}

		fmt.Println(s)
	}
}

1_9-C

package main

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

func main() {
	var n int
	fmt.Scanf("%d", &n)

	t, h := 0, 0
	sc := bufio.NewScanner(os.Stdin)
	for i := 0; i < n; i++ {
		sc.Scan()
		cards := strings.Split(sc.Text(), " ")

		if cards[0] == cards[1] {
			t++
			h++
		} else if cards[0] > cards[1] {
			t += 3
		} else {
			h += 3
		}
	}
	fmt.Println(t, h)
}

1_9-D

package main

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

func main() {
	var str string
	fmt.Scanf("%s", &str)

	var q int
	fmt.Scanf("%d", &q)

	sc := bufio.NewScanner(os.Stdin)
	for i := 0; i < q; i++ {
		sc.Scan()
		order := strings.Split(sc.Text(), " ")
		start, _ := strconv.Atoi(order[1])
		end, _ := strconv.Atoi(order[2])

		if order[0] == "print" {
			fmt.Println(str[start : end+1])
		} else if order[0] == "reverse" {
			word := str[start : end+1]
			var revS string
			for i := len(word) - 1; i >= 0; i-- {
				revS = revS + string(word[i])
			}
			str = str[:start] + revS + str[end+1:]
		} else if order[0] == "replace" {
			str = str[:start] + order[3] + str[end+1:]
		}
	}
}

1_10-A

package main

import (
	"fmt"
	"math"
)

func main() {
	var x1, y1, x2, y2 float64
	fmt.Scanf("%f %f %f %f", &x1, &y1, &x2, &y2)
	fmt.Println(math.Hypot(x2-x1, y2-y1))
}

1_10-B

package main

import (
	"fmt"
	"math"
)

func main() {
	var a, b, C float64
	fmt.Scanf("%f %f %f", &a, &b, &C)

	rad := C * math.Pi / 180
	S := 0.5 * a * b * math.Sin(rad)
	h := 2 * S / a
	c := math.Sqrt(a*a + b*b - 2*a*b*math.Cos(rad))
	L := a + b + c

	fmt.Printf("%f\n%f\n%f", S, L, h)
}

1_10-C

package main

import (
	"fmt"
	"math"
)

func main() {
	for {
		var n int
		fmt.Scanf("%d", &n)
		if n == 0 {
			break
		}

		s := make([]int, n)
		sum := 0
		for i := 0; i < n; i++ {
			fmt.Scanf("%d", &s[i])
			sum += s[i]
		}

		var m float64
		m = float64(sum) / float64(n)

		dispSum := 0.0
		for i := 0; i < n; i++ {
			dispSum += math.Pow(float64(s[i])-m, 2)
		}

		fmt.Println(math.Pow(dispSum/float64(n), 0.5))
	}
}

1_10-D

package main

import (
	"fmt"
	"math"
)

func main() {
	var n int
	fmt.Scanf("%d", &n)

	x := createSlice(n)
	y := createSlice(n)

	p1 := calEuclideanDistance(x, y, n, 1)
	p2 := calEuclideanDistance(x, y, n, 2)
	p3 := calEuclideanDistance(x, y, n, 3)

	fmt.Printf("%f\n", p1)
	fmt.Printf("%f\n", p2)
	fmt.Printf("%f\n", p3)

	pInf := 0.0
	for i := 0; i < n; i++ {
		tmp := math.Abs(float64(x[i]) - float64(y[i]))
		if pInf < tmp {
			pInf = math.Abs(float64(x[i]) - float64(y[i]))
		}
	}
	fmt.Printf("%f", pInf)
}

func createSlice(n int) []int {
	s := make([]int, n)
	for i := 0; i < n; i++ {
		fmt.Scanf("%d", &s[i])
	}
	return s
}

func calEuclideanDistance(x []int, y []int, n int, p int) float64 {
	dSum := 0.0
	for i := 0; i < n; i++ {
		dSum += math.Pow(math.Abs(float64(x[i])-float64(y[i])), float64(p))
	}

	var f float64
	f = 1.0 / float64(p)
	d := math.Pow(dSum, f)

	return d
}