St_Hakky’s blog

Data Science / Human Resources / Web Applicationについて書きます

【Golang】AtCoderの精選過去問10問やってみた

こんにちは。

今日は、Goの練習がてら、AtCoderの問題を解いてみました。以下の記事を読んで、入門者向けの過去問精選10問があることを知ったので、それをときました。


qiita.com

過去問集

問題はこちら。

atcoder.jp

解いたコード

第0問:WelcometoAtCoder
package main

import "fmt"

func main() {
	var a, b, c int
	var s string

	fmt.Scan(&a)
	fmt.Scan(&b, &c)
	fmt.Scan(&s)
	sumResult := a + b + c

	fmt.Printf("%d %s\n", sumResult, s)
}
第1問:Product
package main

import "fmt"

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

	if (a*b)%2 == 0 {
		fmt.Println("Even")
	} else {
		fmt.Println("Odd")
	}
}
第2問:Placing Marbles
package main

import "fmt"

func main() {
	var s string
	fmt.Scan(&s)
	result := 0

	for _, char := range s {
		if char == '1' {
			result = result + 1
		}
	}

	fmt.Println(result)
}
第3問:Shiftonly
package main

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

func convertStringListToIntList(data []string) []int {
	intList := make([]int, len(data))
	for i, v := range data {
		intList[i], _ = strconv.Atoi(v)
	}
	return intList
}

func checkEven(data []int) bool {
	for _, d := range data {
		if d%2 == 1 {
			return false
		}
	}
	return true
}

func divEven(data []int) []int {
	for pos, d := range data {
		data[pos] = d / 2
	}
	return data
}

func main() {
	var n int
	result := 0
	fmt.Scan(&n)

	var sc = bufio.NewScanner(os.Stdin)
	sc.Scan()
	aString := sc.Text()

	aStringList := strings.Split(aString, " ")
	aIntList := convertStringListToIntList(aStringList)

	for {
		if !checkEven(aIntList) {
			break
		}
		result = result + 1
		aIntList = divEven(aIntList)
	}
	fmt.Println(result)
}
第4問:Coins
package main

import "fmt"

func main() {
	var fiveHundred, oneHundred, fifty, x int
	fmt.Scan(&fiveHundred)
	fmt.Scan(&oneHundred)
	fmt.Scan(&fifty)
	fmt.Scan(&x)

	result := 0
	for a := 0; a <= fiveHundred; a++ {
		for b := 0; b <= oneHundred; b++ {
			for c := 0; c <= fifty; c++ {
				if 500*a+100*b+50*c == x {
					result = result + 1
				}
			}
		}
	}
	fmt.Println(result)
}
第5問:SomeSums
package main

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

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

	for i := 1; i <= n; i++ {
		s := strconv.Itoa(i)
		tmp := 0

		for _, v := range strings.Split(s, "") {
			iv, _ := strconv.Atoi(v)
			tmp = tmp + iv
		}

		if (tmp >= a) && (tmp <= b) {
			result = result + i
		}

	}
	fmt.Println(result)
}
第6問:CardGameforTwo
package main

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

func convertStringListToIntList(data []string) []int {
	intList := make([]int, len(data))
	for i, v := range data {
		intList[i], _ = strconv.Atoi(v)
	}
	return intList
}

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

	var sc = bufio.NewScanner(os.Stdin)
	sc.Scan()
	aString := sc.Text()

	aStringList := strings.Split(aString, " ")
	aIntList := convertStringListToIntList(aStringList)
	sort.Sort(sort.Reverse(sort.IntSlice(aIntList)))

	aliceSum, bobSum := 0, 0

	for i, a := range aIntList {
		if i%2 == 0 {
			aliceSum = aliceSum + a
		} else {
			bobSum = bobSum + a
		}
	}

	fmt.Println(aliceSum - bobSum)
}
第7問:Kagami Mochi
package main

import (
	"fmt"
	"sort"
)

func main() {
	var n int
	fmt.Scan(&n)
	dList := make([]int, n)

	for i := 0; i < n; i++ {
		fmt.Scanf("%d", &dList[i])
	}
	sort.Sort(sort.IntSlice(dList))

	result := 0
	for i := 0; i < n; i++ {
		if i == 0 {
			result = result + 1
		} else {
			if dList[i-1] != dList[i] {
				result = result + 1
			}
		}
	}
	fmt.Println(result)
}
第8問:Otoshidama
package main

import "fmt"

func existCandidate(n, total int) (int, int, int) {
	for x := 0; x <= n; x++ {
		for y := 0; y <= n; y++ {
			if total == x*10000+y*5000+(n-(x+y))*1000 && 0 <= n-(x+y) {
				return x, y, n - (x + y)
			}
		}
	}
	return -1, -1, -1
}

func main() {
	var n, total int
	fmt.Scan(&n, &total)
	x, y, z := existCandidate(n, total)
	fmt.Println(x, y, z)
}
第9問:白昼夢
package main

import (
	"fmt"
	"strings"
)

func main() {
	var s string
	fmt.Scan(&s)

	s = strings.Replace(s, "dream", "D", -1)
	s = strings.Replace(s, "erase", "E", -1)
	s = strings.Replace(s, "Der", "", -1)
	s = strings.Replace(s, "Er", "", -1)
	s = strings.Replace(s, "D", "", -1)
	s = strings.Replace(s, "E", "", -1)
	s = strings.TrimSpace(s)

	if s == "" {
		fmt.Println("YES")
	} else {
		fmt.Println("NO")
	}
}
第10問:Traveling
package main

import (
	"fmt"
	"math"
)

func main() {
	preT, preX, preY := float64(0), float64(0), float64(0)
	var n int
	var t, x, y float64
	fmt.Scan(&n)
	result := true

	for i := 0; i < n; i++ {
		fmt.Scanf("%f %f %f", &t, &x, &y)
		disT := math.Abs(float64(t - preT))
		disX := math.Abs(float64(x - preX))
		disY := math.Abs(float64(y - preY))
		disXY := disX + disY

		if int(disT)%2 != 0 {
			if (disT < disXY) || (int(disXY)%2 == 0) {
				result = false
			}
		} else {
			if (disT < disXY) || (int(disXY)%2 == 1) {
				result = false
			}
		}
		preT = t
		preX = x
		preY = y
	}
	if result {
		fmt.Println("Yes")
	} else {
		fmt.Println("No")
	}
}


以上です。今後、他の問題も解いていきたい。それでは。