はじめに
「エンジニア、アルゴリズムをサラッとコーディングできた方が良いのでは?」という思考があるので、最近競プロをちょこちょこやっています。
この記事にて、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
}