このページについて
このページは、paiza ラーニング内に開設されているコンテンツ「レベルアップ問題集」で取り扱われているプログラミング課題について、独自の見解を述べたものです。
見解については、paizaラーニングの規約に基づき、許可されている範囲でのみ公開していますが、その内容については paiza とは一切関係なく、また paiza の立場を反映したものではありませんのでご注意ください。
挑戦する課題
レベルアップ問題集の日付セットから「令和を作る (paizaランク C 相当)」を取り上げます。
以下は、問題公開 Web ページからの引用です。
問題
N個の常用漢字が与えられるので、それらの2文字を組み合わせて作ることができる文字列を改行区切りですべて表示してください。
さらに、作った文字列の中に”令和”が含まれる場合は、”Nice”をそうでない場合は”Bad”と表示してください。
ただし、組み合わせて作った文字列の数が1000個を超える場合は、最初の1000個を表示し、残りは表示しないようにしてください。
入力される値
以下の形式で、与えられる常用漢字の数NとN個の常用漢字K_1, K_2, …, K_Nが与えられます。
1 2 3 4 5 |
N K_1 K_2 ... K_N |
期待する出力
与えられた漢字を与えられた順の昇順に組み合わせて表示してください。
- 令和を作れなかった場合
1 2 3 4 5 6 |
K_1K_1 K_1K_2 K_1K_3 ... K_NK_N Bad |
- 令和を作れた場合
1 2 3 4 5 6 |
K_1K_1 K_1K_2 K_1K_3 ... K_NK_N Nice |
- ただし、組み合わせが1000個を超える場合は最初の1000個を表示する。
条件
すべてのテストケースにおいて、以下の条件を満たします。
- 1≦N≦2135
- K_iは常用漢字
- 同じ漢字が重複して与えらることはありません
※ご利用のプログラミング言語によっては日本語の扱い方が複雑になる場合があるのでご注意ください。
※入力で与えられるデータの文字コードはUTF-8です(平成22年に制定された常用漢字のうち、UTF-8の4バイト文字の””を除く2135文字から選んで与えれます。)
考え方
これまで出題されたカレンダーの問題から考えると、かなり平易な問題。
最大2135個の漢字が入力されるため、それらを逐次組み合わせて出力するだけの課題。
注意しなければいけないのは次の2点。
- 出力する最大数は1000組まで
- 「令和」の組み合わせは全ての組み合わせから検索する(つまり、出力は1000組であっても、検索は総当たりさせる)。
解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// skip first line _ = readLine()! // 入力文字列を得る let sa = Array(AnyIterator { readLine() }).map{ String($0) } // 結果保存用の配列 var reiwa = [String]() // 単純に文字列を合成する for f in sa { for s in sa { reiwa.append(f+s) } } // 最大1000組の組み合わせだけ出力する reiwa.prefix(1000).forEach { print($0) } // 「令和」は全ての組み合わせの中から調べる print(reiwa.contains("令和") ? "Nice" : "Bad") |