Go言語で挑む競プロ #3
前回はこちらから。
さあ、今回はABC114Bを解いていこう。B問題だから、素早く解くことを重視して頑張るぞ。
ABC114Bの問題
問題文
数字 1, 2, ..., 9 からなる文字列 S があります。
ダックスフンドのルンルンは、S から連続する 3 個の数字を取り出し、 1 つの整数 X としてご主人様の元に持っていきます。(数字の順番を変えることはできません。)
ご主人様が大好きな数は 753 で、これに近い数ほど好きです。
X と 753 の差(の絶対値)は最小でいくつになるでしょうか?
制約
S は長さ 4 以上 10 以下の文字列である。
S の各文字は 1, 2, ..., 9 のいずれかである。
アルゴリズム
この問題は、文字列から3連続した数字をすべて抽出して、差を計算するのが簡単かな。
1. 文字列を受け取る
2. 連続した3つの数字のパターンを抽出
3. 抽出した数字と753の差を計算
4. 2,3を全パターンに対して繰り返す
5. 最も小さい差を出力
こんな感じで実装してみよう。
文字列から数字を抽出して、753との差を求めるのはこんな感じかな。
n, _ := strconv.Atoi(s[i : i+3])
d := abs(753 - n)
求めた差が今までで最小なら、解の候補として保持しておけばよいよね。
if d < ans {
ans = d
}
あとは、ループ処理を追加して完成!
解答
最終的に、以下のようなコードに。
package main
import (
"fmt"
"strconv"
)
func main() {
var s string
fmt.Scan(&s)
ans := 999
for i := 0; i < len(s)-2; i++ {
n, _ := strconv.Atoi(s[i : i+3])
if d := abs(753 - n); d < ans {
ans = d
}
}
fmt.Println(ans)
}
func abs(a int) int {
if a < 0 {
return -a
}
return a
}
B問題は解くだけなら簡単なんだけども、時間が10分弱かかってしまった...
もう少し早く解けるように頑張んないと。
次は、ABC114Cを解いていこうかな。
さぁ、めげずに次回も頑張ろう。
この記事が気に入ったらサポートをしてみませんか?