配列
読了目安 約2分
配列の作り方、append と添字アクセス、範囲外エラー、N 個の入力を配列で受け取る定石。
この章の目次
100 人分の点数を 100 個の変数で持つわけにはいきません。 配列は、複数の値を順番に並べて 1 つの名前で持つ入れ物です。
配列を作る
[値, 値, ...] と書くと配列ができます。
整数を並べた配列の型は [Int] です。
要素には先頭から 0、1、2 と番号が振られています。
この番号を添字と呼び、配列[添字] で要素を取り出します。
要素の個数は .count で得られます。
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 個の入れ物を用意して、あとから添字で書き換えていく使い方が競プロでは定番です。
var a = [Int]()
a.append(10)
a.append(20)
a[0] = 99
print(a)
print(Array(repeating: 0, count: 5))配列の走査
for-in 文で先頭から順に要素を取り出せます。
添字も一緒に使いたいときは enumerated() を添えます。
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 で集めます。
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 です。
模範解答
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 で割ると平均値です。 もう一度走査して、各要素との差を出力します。