LoginSignup
0
0

標準入力から空白区切りの整数を一行受け取る方法。

Last updated at Posted at 2023-09-09

学んだこと && もくじ

・ACしたコード && 解説
・split()について
・map()について
・stride()(ストライド関数)について
・stride()とfor-in文の違い
・手順まとめ
・ACしたコード && 解説なし

注意!

・以下のネタバレあり。

ACしたコード && 解説

// String型のみで利用できるsplit()を使い、空白区切りで標準入力から
// map{}を利用して文字列で受け取った文字列の整数をInt型の整数の配列として受け取る。
let values = readLine()!.split(separator: " ").map { Int(String($0))! }
// 整数の配列として受け取れているか確認。
print(values)
// 添え字が使えるか確認。
print(values[0])
// 足し算できるか確認。
print(values[0] + 1)
// values[1]からvalues[0] + 1の間、values[2]ずつ増えた回数をカウントする変数を用意。
var count = 0
for i in stride(from: values[1], to: values[0] + 1, by: values[2]) {
    // iがvalues[1]からvalues[0] + 1の間出力できるか確認。
    print(i)
    // iがvalues[2]ずつ増えている回数をカウントする。
    count += 1
}
print(count)

入力例1
13 3 5

出力例
[13, 3, 5]
13
14
3
8
13
3

split()について

・split()はString型で利用できるメソッドなので、Int型には利用できない。
▼ 以下のコードで実行したらエラーが出ました。

// 空白区切りで標準入力から整数の配列として受け取る。
let values = Int(readLine()!)!.split(separator: " ")
// 整数の配列として受け取れいてるか確認。
print(values)

入力例1
13 3 5

出力例
main.swift:2:32: error: value of type 'Int' has no member 'split'
let values = Int(readLine()!)!.split(separator: " ")
~~~~~~~~~~~~~~~~~ ^~~~~

int' 型の値には 'split' というメンバがない。

→ Int型には、splitが無いという解釈をしたのでSwiftの公式ドキュメントを確認。
Int型のページにsplitの記載を見つけられなかったので無いという判断をしています。
スクリーンショット 2023-09-09 16.26.32.png

map()について

・配列内の要素に同じ操作をしたい時に利用する。

let nums = [1, 2, 3, 4, 5]

// 各要素を2倍に変換するクロージャを使用して新しい配列を作成
// { $0 * 2 }をクロージャーというらしいけど、今回は深掘りしない。
let doubledNums = nums.map { $0 * 2 }

print(doubledNums)

出力例
[2, 4, 6, 8, 10]

※以下の文のコレクション部分は、配列に変換して読んでください。
・Swiftのmap()は、コレクション内の各要素に対して指定した変換操作を適用する。
・元のコレクションは変更されず、変換された結果を新しいコレクションとして取得できる。

コレクションとは、、、(ここは深掘りしない)
・配列(Array)
複数の要素を順序付けて格納するデータ構造。同じ型の要素を含むことが一般的。

・辞書(Dictionary)
キーと値のペアを格納するデータ構造で、キーを使用して値を取得する。

・集合(Set)
一意の要素を格納するデータ構造で、重複を許さない。重複のない要素のコレクション。

stride()(ストライド関数)について

・stride()は関数。
・stride()は、指定された範囲内で指定された増加幅でループを実行するために使用される。
・増加幅は整数型で指定され、正の整数、負の整数、0など、さまざまな値が設定できる。
・増加幅を使用することで、指定された範囲内で特定の間隔で値を生成することができる。
引数の詳細
stride()関数の引数はstride(from:to:by:)で構成される。
from:
指定した範囲の初期値。
to:
指定した範囲の終了する値、
by:
指定した増加量で数値を生成する。(for-in分でiの部分に当たる)

実験1
・0から10未満の範囲で+2の増加量でiの整数が出力される。

for i in stride(from: 0, to: 10, by: 2) {
    print(i) 
}

出力例
0
2
4
6
8

実験2(間違えたver)
・0から10までの範囲で偶数の時、iの整数が出力される。

for i in stride(from: 0, to: 11 + 1, by: i % 2 == 0) {
    print(i) 
}

出力例
error: cannot find 'i' in scope
for i in stride(from: 0, to: 11 + 1, by: i % 2 == 0) {
^

スコープに 'i' が見つからない

エラーの原因
・by:の後に条件式(i % 2 == 0)を直接指定することはできない。
・stride関数のbyの値は、整数型の値を指定する。結果、条件式(i % 2 == 0)は直接指定できない。

実験2(正解ver)(stride()を使って偶数の時、iを出力する方法)
・条件分岐を使って条件を指定する。

for i in stride(from: 0, to: 11 + 1, by: 2) {
    if i % 2 == 0 {
        print(i)
    }
}

出力例
0
2
4
6
8
10

stride()とfor-in文の違い

・for-in文は、制御構造の一つ。
・for-in文は、コレクション(配列、辞書、セットなど)の要素を反復処理するために使用される。
・for-in文は、コレクション内の各要素に対してループを実行し、各要素を順番に取り出します。

結果
・stride()関数は特定の範囲で数値を生成する際に便利。
・for-in文はコレクション内の要素を処理する際に使用される。

ACしたコード && 解説なし

let values = readLine()!.split(separator: " ").map { Int(String($0))! }
var count = 0
for i in stride(from: values[1], to: values[0] + 1, by: values[2]) {
    count += 1
}
print(count)

入力例1
13 3 5

出力例
3

手順まとめ

・空白区切りで整数を標準入力から受け取るには、split()を利用する。
・split()はString型のみで利用できるメソッドなので、整数を文字列として受け取る必要がある。
・今回の問題では、整数の操作をするので、文字列として標準入力から受け取った整数を改めてInt型に変換する必要がある。
・String型からInt型に変換する際にmap{}を利用する。

0
0
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
0
0