このページについて
このページは、paiza ラーニング内に開設されているコンテンツ「レベルアップ問題集」で取り扱われているプログラミング課題について、独自の見解を述べたものです。
見解については、paizaラーニングの規約に基づき、許可されている範囲でのみ公開していますが、その内容については paiza とは一切関係なく、また paiza の立場を反映したものではありませんのでご注意ください。
挑戦する課題
レベルアップ問題集の文字列処理メニューから「文字列の書き換え (paizaランク D 相当)」を取り上げます。
以下は、問題公開 Web ページからの引用です。
問題
文字列 S と整数 i と文字 c が与えられるので、S の i 文字目を c に書き換えたものを出力してください。
入力される値
1 2 |
S i c |
- 1 行目では、文字列 S が与えられます。
- 2 行目では、整数 i と、文字 c が与えられます。
期待する出力
S の i 文字目を c に書き換えたものを 1 行で出力してください。考え方
真面目にやろうとすると、
String.Index を扱うことになるが、これは少々厄介なため別の方法を取ることにする。
入力された文字列(
S)を、1文字から構成される文字列の配列とし、その配列の特定の要素(
i)を指定された要素(
c)で入れ替える、という方法で解決することにする。
まず、入力された文字列を1文字からなる文字列の配列、つまり "ABC" という文字列であれば ["A", "B", "C"] という配列に変換する処理を行う。
次の行では、入れ替える要素の番号 i と入れ替える文字 c が指定されるが、ここでは一旦文字列の配列として取り込み、その後要素番号については Int 型に変換する( Int 型のイニシャライザを使う)ことで整数に変換する。
Swift の場合、配列の特定の要素の入れ替えは単なる代入で行うことが可能なため、インデックスとして指定された値(実際には、 i は 1 から始まる値であるため、 i - 1 として指定)の要素に直接代入する。ちなみに、入力文字列を代入する際、 let で変数を作ると書き換え不可能となるため、ここでは var で宣言しておく。
最後に、文字列の配列となっている要素を joined() で連結し、出力させる。
解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// 入力文字列を1文字だけで構成される文字列の配列にする var s = readLine()!.map { String($0) } // 2行目は空白で分解して文字列の配列にする let sa = readLine()!.split(separator: " ").map{ String($0) } // 問題文にあわせて代入しなおす let i = Int(sa[0])! let c = sa[1] // 配列の指定された要素の文字列を置き換える s[i - 1] = c // 連結して出力する print(s.joined()) |