こんにちは。
今日は、Goの練習がてら、AtCoderの問題を解いてみました。以下の記事を読んで、入門者向けの過去問精選10問があることを知ったので、それをときました。
解いたコード
第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") } }
以上です。今後、他の問題も解いていきたい。それでは。