paizaの練習問題を解く 3項間漸化式 1 Go編

こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 3項間漸化式 1 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】 実装 実装は以下の通りです。 フィボナッチ数列の計算ですね。 package main import "fmt" func main(){ a := make([]int, 41) a[1] = 1 a[2] = 1 for i := 3; i <= 40; i++ { a[i] = a[i - 2] + a[i - 1] } var k int fmt.Scan(&k) fmt.Println(a[k]) } 前回からの流れを踏んでいれば簡単ですね。 ということで今回はこれで👍

2026年5月6日 · にあえん

paizaの練習問題を解く 特殊な2項間漸化式 2 Go編

こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 特殊な2項間漸化式 2 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】 実装 以下のように実装しました。 package main import "fmt" func main(){ var x, d1, d2, q int fmt.Scan(&x, &d1, &d2, &q) a := make([]int, 1001) a[1] = x for i := 2; i <= 1000; i++ { if i % 2 != 0 { a[i] = a[i - 1] + d1 } else { a[i] = a[i - 1] + d2 } } for i := 0; i < q; i++ { var k int fmt.Scan(&k) fmt.Println(a[k]) } } 前回の応用で実装できました。 ということで今回はこれで👍

2026年5月5日 · にあえん

paizaの練習問題を解く 特殊な2項間漸化式 1 Go編

こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 特殊な2項間漸化式 1 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】 実装 以下のように実装しました。 package main import "fmt" func main(){ var x, d1, d2, k int fmt.Scan(&x, &d1, &d2, &k) a := make([]int, k + 1) a[1] = x for i := 2; i <= k; i++ { if i % 2 != 0 { a[i] = a[i - 1] + d1 } else { a[i] = a[i - 1] + d2 } } fmt.Println(a[k]) } for文内にifを追加しただけです。 今回は一発で実装できました。 ということで今回はこれで👍

2026年5月4日 · にあえん

paizaの練習問題を解く 2項間漸化式 2 Go編

こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 2項間漸化式 2 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】 実装 このように実装しました。s package main import "fmt" func main(){ var x, d, q int fmt.Scan(&x, &d, &q) k := make([]int, q) max := 0 for i := 0; i < q; i++ { fmt.Scan(&k[i]) if i == q - 1 { max = k[i] } } a := make([]int, max) a[0] = x for i := 1; i < max; i++ { a[i] = a[i - 1] + d } for i := 0; i < q; i++ { fmt.Println(a[k[i] - 1]) } } ですがこれだと通りませんでした。。 k_Qが必ずmaxになるわけではないようです。 ということで少し修正しました。 package main import "fmt" func main(){ var x, d, q int fmt.Scan(&x, &d, &q) k := make([]int, q) max := 0 for i := 0; i < q; i++ { fmt.Scan(&k[i]) if max < k[i] { max = k[i] } } a := make([]int, max) a[0] = x for i := 1; i < max; i++ { a[i] = a[i - 1] + d } for i := 0; i < q; i++ { fmt.Println(a[k[i] - 1]) } } これでうまく動作しました。 ...

2026年5月3日 · にあえん

paizaの練習問題を解く 2項間漸化式 1 Go編

こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 2項間漸化式 1 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】 DP(動的計画法)についてはなんとな~く理解はしているものの、実装となるととんと出来ないのでここで極めておきます。 実装 実装は以下の通りです。 package main import "fmt" func main(){ var x, d, k int fmt.Scan(&x, &d, &k) a := make([]int, k) a[0] = x for i := 1; i < k; i++ { a[i] = a[i - 1] + d } fmt.Println(a[k - 1]) } これが一番簡単なDPのコードか… このくらいならシンプルで理解しやすいですね。 ということで今回はこれで👍

2026年5月2日 · にあえん

競プロ典型 90 問 004 - Cross Sum

こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回はAtCoderの問題を解いていきます。 問題は以下です。 004 - Cross Sum(★2) 実装 二次元の累積和ですね。 とりあえず愚直に解いてみます。 package main import "fmt" func main() { var h, w int fmt.Scan(&h, &w) g := make([][]int, h) for i := 0; i < h; i++ { g[i] = make([]int, w) for j := 0; j < w; j++ { fmt.Scan(&g[i][j]) } } hg := make([]int, h) for i := 0; i < h; i++ { s := 0 for j := 0; j < w; j++ { s += g[i][j] } hg[i] = s } wg := make([]int, w) for i := 0; i < w; i++ { s := 0 for j := 0; j < h; j++ { s += g[j][i] } wg[i] = s } ans := make([][]int, h) for i := 0; i < h; i++ { ans[i] = make([]int, w) for j := 0; j < w; j++ { ans[i][j] = hg[i] + wg[j] - g[i][j] } } for i := 0; i < h; i++ { for j := 0; j < w; j++ { if j < w - 1 { fmt.Printf("%d ", ans[i][j]) } else { fmt.Printf("%d", ans[i][j]) } } fmt.Println() } } ですがこれだとタイムオーバーしてしまいました。 ...

2026年4月17日 · にあえん

paizaの練習問題を解く 【マップの扱い 4】マップのナンバリング Go編

こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 【マップの扱い 2】マップの書き換え・縦横 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】 実装 以下のように実装しました。 (解答例のpythonコードをgoに書き換えただけですが…) package main import "fmt" func main(){ var h, w, d int fmt.Scan(&h, &w, &d) g := make([][]int, h) for i := 0; i < h; i++ { g[i] = make([]int, w) } min := func(a, b int) int { if a > b { return b } else { return a } } c := 1 switch d { case 1: for i := 0; i < h; i++ { for j := 0; j < min(w, i + 1); j++ { g[i - j][j] = c c++ } } for i := 1; i < w; i++ { for j := 0; j < min(h, w - i); j++ { g[h - 1 - j][i + j] = c c++ } } case 2: for i := 0; i < h; i++ { for j := 0; j < w; j++ { ty, tx := i, j g[ty][tx] = c c++ } } case 3: for i := 0; i < w; i++ { for j := 0; j < h; j++ { ty, tx := j, i g[ty][tx] = c c++ } } case 4: for i := 0; i < w; i++ { for j := 0; j < min(h, i + 1); j++ { g[j][i - j] = c c++ } } for i := 1; i < h; i++ { for j := 0; j < min(w, h - i); j++ { g[i + j][w - 1 - j] = c c++ } } } for i := 0; i < h; i++ { for j := 0; j < w; j++ { fmt.Printf("%d", g[i][j]) if j < w - 1 { fmt.Print(" ") } } fmt.Println() } } これに関してはなんか複雑で自分でよくわかっていません。。。よくないとはわかりつつも。。。 ...

2026年4月15日 · にあえん

paizaの練習問題を解く 【マップの扱い 3】マップの判定・縦横斜め Go編

こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 【マップの扱い 3】マップの判定・縦横斜め | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】 実装 最初は以下のように実装しましたが、この実装だとダメでした。 縦横斜めのカラムを反対にするのではなく、すべてのカラムを反対にしているからです。 package main import "fmt" func main(){ var h, w, sy, sx int fmt.Scan(&h, &w) g := make([]string, h) for i := 0; i < h; i++ { fmt.Scan(&g[i]) } repl := func(sy, sx int, r rune) { runes := []rune(g[sy]) runes[sx] = r g[sy] = string(runes) } fmt.Scan(&sy, &sx) for dy := -20; dy <= 20; dy++ { for dx := -20; dx <= 20; dx++ { ty, tx := sy + dy, sx + dx if ty >= 0 && tx >= 0 && ty < h && tx < w { if g[ty][tx] == '.' { repl(ty, tx, '#') } else { repl(ty, tx, '.') } } } } for i := 0; i < h; i++ { fmt.Println(g[i]) } } ということで解答例を見つつ修正します。 ...

2026年4月13日 · にあえん

paizaの練習問題を解く 【マップの扱い 2】マップの書き換え・縦横 Go編

こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 【マップの扱い 2】マップの書き換え・縦横 | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】 実装 以下のように実装しました。 package main import "fmt" func main(){ var h, w, sy, sx int fmt.Scan(&h, &w) g := make([]string, h) for i := 0; i < h; i++ { fmt.Scan(&g[i]) } fmt.Scan(&sy, &sx) repl := func(sy, sx int, r rune) { runes := []rune(g[sy]) runes[sx] = r g[sy] = string(runes) } dy := []int{1, -1, 0, 0, 0} dx := []int{0, 0, 1, -1, 0} for i := 0; i < 5; i++ { ty, tx := sy + dy[i], sx + dx[i] if g[ty][tx] == '.' { repl(ty, tx, '#') } else { repl(ty, tx, '.') } } for i := 0; i < h; i++ { fmt.Println(g[i]) } } ですが、ランタイムエラーが頻発してしまいました。。 ということで修正します。 package main import "fmt" func main(){ var h, w, sy, sx int fmt.Scan(&h, &w) g := make([]string, h) for i := 0; i < h; i++ { fmt.Scan(&g[i]) } fmt.Scan(&sy, &sx) repl := func(sy, sx int, r rune) { runes := []rune(g[sy]) runes[sx] = r g[sy] = string(runes) } dy := []int{1, -1, 0, 0, 0} dx := []int{0, 0, 1, -1, 0} for i := 0; i < 5; i++ { ty, tx := sy + dy[i], sx + dx[i] // 以下のif文を追加 if ty < 0 || tx < 0 || ty >= h || tx >= w { continue } if g[ty][tx] == '.' { repl(ty, tx, '#') } else { repl(ty, tx, '.') } } for i := 0; i < h; i++ { fmt.Println(g[i]) } } インデックスが表からはみ出していた場合の考慮が漏れていました。 ...

2026年4月12日 · にあえん

paizaの練習問題を解く 【マップの扱い 1】マップの書き換え・1 マス Go編

こんにちは、ナナオです。 前回に引き続き競プロを実施していきたいと思います。 今回の問題は以下です。 【マップの扱い 1】マップの書き換え・1 マス | レベルアップ問題集 | プログラミング学習サイト【paizaラーニング】 実装 以下のように実装しました。 package main import "fmt" func main(){ var h, w, x, y int fmt.Scan(&h, &w) g := make([]string, h) for i := 0; i < h; i++ { fmt.Scan(&g[i]) } fmt.Scan(&y, &x) if g[y][x] == '#' { runes := []rune(g[y]) runes[x] = '.' g[y] = string(runes) } else { runes := []rune(g[y]) runes[x] = '#' g[y] = string(runes) } for i := 0; i < h; i++ { fmt.Println(g[i]) } } 文字の置き換えがGoだと少し面倒ですが、実装できましたね。 では今日はこれで👍

2026年4月10日 · にあえん