LoginSignup
20
14

More than 3 years have passed since last update.

Swift で競プロをする際の標準入力について

Last updated at Posted at 2020-05-02

はじめに

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()は一行に書かれた値を読み込むので、改行で区切られている場合の方がコードは短いです。

このほかにも様々な入力のパターンがありますが、例として出したパターンの応用で乗り越えられると思います。

20
14
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
14