AIZU ONLINE JUDGE の問題をSwiftでやってみた(プログラミング入門 配列編)

##トピック #1　配列
[AIZU ONLINE JUDGE](https://onlinejudge.u-aizu.ac.jp/courses/lesson/2/ITP1/6)の問題にSwiftで解答したものになります。競技プログラミングは普段やりませんので、こうしたほうが簡単！などがあればコメントで教えて下さい。
[ブラウザでプログラミング・実行ができる「オンライン実行環境」paiza.IO](https://paiza.io/projects/g8pB6rEnJeIh4YLStunrNg)でテスト出力が行えます

##6_A
**問題**
与えられた数列を逆順に出力するプログラムを作成して下さい。入力は以下の形式で与えられます
n
a_1 a_2 a_3...a_n
逆順の数列を１行に出力して下さい。数列の要素の間に１つの空白を入れて下さい（最後の数の後に空白は入らないことに注意して下さい）。
**解答**

```Swift
let a = Int(readLine()!)!
var arr = readLine()!.split(separator: " ").map({Int($0)})
print(arr.reversed())
```

##6_
**問題**

**解答**

```Swift
let a = Int(readLine()!)!
var sArr:[Int] = []
var hArr:[Int] = []
var cArr:[Int] = []
var dArr:[Int] = []

for i in 0 ..< a {
    var b = readLine()!.split(separator: " ")
    var num = Int(b[1]) ?? 0
    switch b[0] {
    case "S":
        sArr.append(num)
    case "H":
        hArr.append(num)
    case "C":
        cArr.append(num)
    case "D":
        dArr.append(num)
    default:
        break
    }
}

func checkTramp(_ tramp: [Int]) -> [Int] {
    var notHaveArr:[Int] = []
    for i in 0 ..< tramp.count {
        if tramp.contains(i) == false {
            notHaveArr.append(i)
        }
    }
    return notHaveArr
}

for i in checkTramp(sArr) {
    print("S \(i)")
}
for i in checkTramp(hArr) {
    print("H \(i)")
}
for i in checkTramp(cArr) {
    print("C \(i)")
}
for i in checkTramp(dArr) {
    print("D \(i)")
}
```
##6_B
**問題**
太郎が花子と一緒にトランプ遊びをしようとしたところ、52枚あるはずのカードが n 枚のカードしか手元にありません。これらの n 枚のカードを入力として、足りないカードを出力するプログラムを作成して下さい。

太郎が最初に持っていたトランプはジョーカーを除く52枚のカードです。

52枚のカードは、スペード、ハート、クラブ、ダイヤの４つの絵柄に分かれており、各絵柄には13のランクがあります。
入力
最初の行に太郎が持っているカードの枚数 n (n ≤ 52)が与えられます。

続いて n 組のカードがそれぞれ１行に与えられます。各組は１つの空白で区切られた文字と整数です。文字はカードの絵柄を表し、スペードが'S'、ハートが'H'、クラブが'C'、ダイヤが'D'で表されています。整数はそのカードのランク(1 〜 13)を表しています。
出力
足りないカードをそれぞれ1行に出力して下さい。各カードは入力と同様に１つの空白で区切られた文字と整数です。
**解答**

```Swift
let a = Int(readLine()!)!
var sArr:[Int] = []
var hArr:[Int] = []
var cArr:[Int] = []
var dArr:[Int] = []

for i in 1 ... a {
    var b = readLine()!.split(separator: " ")
    var num = Int(b[1]) ?? 0
    switch b[0] {
    case "S":
        sArr.append(num)
    case "H":
        hArr.append(num)
    case "C":
        cArr.append(num)
    case "D":
        dArr.append(num)
    default:
        break
    }
}

func checkTramp(_ tramp: [Int]) -> [Int] {
    var notHaveArr:[Int] = []
    for i in 1 ... tramp.count {
        if tramp.contains(i) == false {
            notHaveArr.append(i)
        }
    }
    return notHaveArr
}

for i in checkTramp(sArr) {
    print("S \(i)")
}
for i in checkTramp(hArr) {
    print("H \(i)")
}
for i in checkTramp(cArr) {
    print("C \(i)")
}
for i in checkTramp(dArr) {
    print("D \(i)")
}
```

##6_C　公舎の入居数
**問題**
Ａ大学は１フロア１０部屋、３階建ての公舎４棟を管理しています。公舎の入居・退去の情報を読み込み、各部屋の入居者数を出力するプログラムを作成して下さい。

n件の情報が与えられます。各情報では、４つの整数b, f, r, vが与えられます。これは、b棟f階のr番目の部屋にv人が追加で入居したことを示します。vが負の値の場合、-v人退去したことを示します。

最初、全ての部屋には誰も入居していないものとします。
入力
最初の行に情報の数 n が与えられます。
続いて n 件の情報が与えられます。各情報には４つの整数 b, f, r, v が空白区切りで１行に与えられます。
出力
４棟について入居者数を出力して下さい。各棟について、１階、２階、３階の順に入居者数を出力します。各階については、１番目、２番目、・・・、１０番目の部屋の入居者数を順番に出力します。入居者数の前には１つの空白を出力して下さい。また、各棟の間には####################(20個の#)で区切って下さい。
出力例

```
3
1 1 3 8
3 2 2 7
4 3 8 1
```

```
0 0 8 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0
####################
 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0
####################
 0 0 0 0 0 0 0 0 0 0
 0 7 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0
####################
 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 1 0 0
```
**解答**

```Swift
let a = Int(readLine()!)!
var room1 = [[Int]](repeating: [Int](repeating: 0, count: 10), count: 3)
var room2 = [[Int]](repeating: [Int](repeating: 0, count: 10), count: 3)
var room3 = [[Int]](repeating: [Int](repeating: 0, count: 10), count: 3)
var room4 = [[Int]](repeating: [Int](repeating: 0, count: 10), count: 3)

func make(_ b: Int, _ f: Int, _  r: Int, _ v: Int) -> Void {
    switch b {
    case 1:
        room1[f-1][r-1] += v
    case 2:
        room2[f-1][r-1] += v
    case 3:
        room3[f-1][r-1] += v
    case 4:
        room4[f-1][r-1] += v
    default:
        break
    }
}

for i in 0 ..< a {
    var c = readLine()!.split(separator: " ").map({Int($0)!})
    make(c[0], c[1], c[2], c[3])
}


for i in 0 ..< 3 {
    for j in 0 ..< 10 {
    print(room1[i][j], terminator: " ")
    }
    print("\n")
}
print(String(repeating: "#", count: 20))
for i in 0 ..< 3 {
    for j in 0 ..< 10 {
    print(room2[i][j], terminator: " ")
    }
    print("\n")
}
print(String(repeating: "#", count: 20))
for i in 0 ..< 3 {
    for j in 0 ..< 10 {
    print(room3[i][j], terminator: " ")
    }
    print("\n")
}
print(String(repeating: "#", count: 20))
for i in 0 ..< 3 {
    for j in 0 ..< 10 {
    print(room4[i][j], terminator: " ")
    }
    print("\n")
}
```
##6_D ベクトルと行列の積
**問題**
長いので省略
サイトを見て下さい。

**解答**

```Swift
let a = readLine()!.split(separator: " ").map({Int($0)!})
var matrix = [[Int]]()
var vector = [Int]()
var solution = [Int](repeating: 0, count: a[0])

for i in 0 ..< a[0] {
    var m1 = readLine()!.split(separator: " ").map({Int($0)!})
    matrix.append(m1)
}

for i in 0 ..< a[1] {
    vector.append(Int(readLine()!)!)
}

for i in 0 ..< a[0] {
    for j in 0 ..< a[1] {
        solution[i] += matrix[i][j] * vector[j]
    }
}
for i in solution {
    print(i)
}
```