##はじめに
swiftで競技プログラミングに挑戦しようとしたところ標準入力readLine()がうまく使えず行き詰まっていましたが、解決したので共有します。
参考になれば幸いです。
入力される値がスペースで区切られているのか、何行にも渡っているかなどの条件により対応が異なります。
##例1.入力される値が一つ
###String型の場合
**入力される文字列nameに対し"Hello,name!"という文字列を出力せよ。**という問題を想定します。
let name = readLine()!
print("Hello,\(name)!")
入力される文字をnameと定義するためにはreadLine()を用います。
###数値型の場合
**入力される数字の2倍の数字を出力せよ。**という問題を想定します。
let input = Int(readLine()!)!
print(input * 2)
readLine()はString型を返り値にもつ関数なので、数値型(ここではInt型)に変換しましょう。
##例2.入力される値が複数ある
###スペースで区切られている場合
**入力される2つの数の和を出力せよ。
ただし入力は 3 4
のように入力されるものとする。 **という問題を想定します。
let input = readLine()!
let num = input.split(separator: " ")
let stringNum1 = num[0]
let stringNum2 = num[1]
let Intnum1 = Int(stringNum1)
let Intnum2 = Int(stringNum2)
print(Intnum1! + Intnum2!)
配列の抜き出しや数値型の変換について飛躍することなくコーディングすると上のようになります。
上のコードを短くまとめると
let input = readLine()!
let num = input.split(separator: " ")
print(Int(num[0])! + Int(num[1])!)
のように書くことができます。numはスペースを含んだ配列inputに対して、スペースをのぞいた要素を格納した配列であることに注意しましょう。
###改行で区切られている場合
**入力される2つの数の和を出力せよ。
ただし入力は以下のように入力される。
3 4
**という問題を想定します。
readLine()は一行に入力される値を読み込むので
let input1 = Int(readLine()!)!
let input2 = Int(readLine()!)!
print(input1 + input2)
のようにします。もちろん
let input1 = readLine()!
let input2 = readLine()!
print(Int(input1)! + Int(input2)!)
のように変換する場所を変更しても大丈夫です。
##例3.はじめに入力された整数Nの数だけ入力が繰り返される
###入力がスペースで区切られている場合
**一行目に整数Nを入力される。
二行目に入力される数の和を出力せよ。
ただし値は
4 1,4,5,2
のように入力されるものとする。**という問題を想定します。
let N = Int(readLine()!)!
let inputNumbers = readLine()!
var numberArray:[Int] = []
for i in 0..<N {
let splitedArray = inputNumbers.split(separator: " ")
numberArray.append(Int(splitedArray[i])!)
}
var sum = 0
for i in 0..<N {
sum += numberArray[i]
}
print(sum)
入力のfor文と和を求めるためのfor文を分けて書いています。
手順としては、入力されたスペースを含む文字列をsplitで要素ごとに分けて配列に格納し、予め用意しておいたnumberArray[Int]
にappendしています。
配列に格納することで1,4,5,2
と入力された値をそれぞれnumberArray[0],numberArray[1],numberArray[2],numberArray[3]
のように扱うことができるようになります。
###改行で区切られている場合
**一行目に整数Nを入力される。
二行目に入力される数の和を出力せよ。
ただし値は
4 1 4 5 2
のように入力されるものとする。**という問題を想定します。
let N = Int(readLine()!)!
var sum = 0
for i in 0..<N {
let number = Int(readLine()!)!
sum += number
}
print(sum)
readLine()は一行に書かれた値を読み込むので、改行で区切られている場合の方がコードは短いです。
このほかにも様々な入力のパターンがありますが、例として出したパターンの応用で乗り越えられると思います。