Swift教室 Swift と競技プログラミングの教室

配列

読了目安 約2分

配列の作り方、append と添字アクセス、範囲外エラー、N 個の入力を配列で受け取る定石。

この章の目次

100 人分の点数を 100 個の変数で持つわけにはいきません。 配列は、複数の値を順番に並べて 1 つの名前で持つ入れ物です。

配列を作る

[値, 値, ...] と書くと配列ができます。 整数を並べた配列の型は [Int] です。

要素には先頭から 0、1、2 と番号が振られています。 この番号を添字と呼び、配列[添字] で要素を取り出します。 要素の個数は .count で得られます。

Swift
let scores = [70, 80, 90]
print(scores[0])
print(scores[2])
print(scores.count)

試してみよう: scores[2]scores[3] に変えて実行してみてください。

添字が 0 から count - 1 の範囲を外れると、コンパイルは通りますが実行時エラーで落ちます。

テキスト
Fatal error: Index out of range

競プロで最もよく出会うエラーで、プログラムが途中で落ちたらまず添字の範囲を疑ってください。

要素の追加と初期化

あとから要素を増やすには、var で宣言して append を呼びます。 空の整数配列は [Int]() で作ります。 var の配列は a[0] = 99 のように要素を書き換えられます。

同じ値を並べた配列は Array(repeating:count:) で作れます。 先に N 個の入れ物を用意して、あとから添字で書き換えていく使い方が競プロでは定番です。

Swift
var a = [Int]()
a.append(10)
a.append(20)
a[0] = 99
print(a)
print(Array(repeating: 0, count: 5))

配列の走査

for-in 文で先頭から順に要素を取り出せます。 添字も一緒に使いたいときは enumerated() を添えます。

Swift
let a = [3, 1, 4]
for x in a {
    print(x)
}
for (i, x) in a.enumerated() {
    print("\(i) 番目は \(x)")
}

入力を配列で受け取る

1 行に並んだ N 個の整数は、入力と実行順序の定型句がそのまま配列にしてくれます。 1 行に 1 個ずつ N 行で届く入力は、append で集めます。

Swift
let n = Int(readLine()!)!
var a = [Int]()
for _ in 0..<n {
    a.append(Int(readLine()!)!)
}
print(a)
入力例
3
10
20
30

学びどころ

概念一言まとめ
[1, 2, 3]配列のリテラル。型は [Int]
添字0 から始まる番号。範囲外は実行時エラー
append末尾に要素を追加する
Array(repeating:count:)同じ値を N 個並べた配列を作る
enumerated()添字と要素を同時に取り出す

演習

1 行目に整数 N が入力されます。 2 行目に N 個の整数が空白区切りで入力されます。 N 個の整数の平均値を求め、各整数から平均値を引いた値を、入力の順に 1 行ずつ出力してください。

N は 1 以上 100 以下、整数は -1000 以上 1000 以下で、平均値は必ず整数になります。

テキスト
入力例:
3
1 2 3

出力例:
-1
0
1

入力例の平均値は 2 です。

模範解答
Swift
let n = Int(readLine()!)!
let a = readLine()!.split(separator: " ").map { Int($0)! }

var sum = 0
for x in a {
    sum += x
}
let average = sum / n

for x in a {
    print(x - average)
}

合計を N で割ると平均値です。 もう一度走査して、各要素との差を出力します。