見出し画像

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を解いていこうかな。
さぁ、めげずに次回も頑張ろう。

この記事が気に入ったらサポートをしてみませんか?