このページについて
このページは、paiza ラーニング内に開設されているコンテンツ「レベルアップ問題集」で取り扱われているプログラミング課題について、独自の見解を述べたものです。
見解については、paizaラーニングの規約に基づき、許可されている範囲でのみ公開していますが、その内容については paiza とは一切関係なく、また paiza の立場を反映したものではありませんのでご注意ください。
挑戦する課題
レベルアップ問題集の日付セットから「西暦の和暦変換2 (paizaランク C 相当)」を取り上げます。
以下は、問題公開 Web ページからの引用です。
問題
西暦年y、月m、日付dが与えられるので、和暦で表示してください。
和暦は、以下の条件を確認し、西暦から変換してください。
- 明治は1912年7月29日まで
- 大正は1912年7月30日から1926年12月24日まで
- 昭和は1926年12月25日から1989年1月7日まで
- 平成は1989年1月8日から2019年4月30日まで
- 令和は2019年5月1日から
入力される値
整数y m dが次のように、スペース区切りで1行で入力されます。
1 |
y m d |
期待する出力
以下のような形式で、答えを出力してください。
1 |
Gx年m月d日 |
- Gは”明治”、”大正”、”昭和”、”平成”、”令和”のいずれかの元号で、和暦のxは元号の年です。
- xは2より大きな整数か、”元”です。和暦が1年になる場合は、元年となることに注意してください。
考え方
基本的な考え方は、前問である「西暦の和暦変換 (paizaランク C 相当) 」と同じ。
追加されたのは、和暦の表示部分。
いろいろな実装が考えられるが、ここでは元号に続く年を計算するため、一旦元号開始年を変数にいれ、最終的な判断部分で「元年」と「X年」を判別している。この計算方法だと、「元年 = 0年」となるため、 +1 を加えることで補正している。
解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
// 西暦、年、月が順番に配列に入る let ia = readLine()!.split(separator: " ").map { Int($0)! } // わかりやすいように、変数に置き換え let y = ia[0] let m = ia[1] let d = ia[2] // 元号 var g = "" // 新元号開始年 var ys = 0 // 境界条件に気を付ける if y < 1912 || ( y == 1912 && m <= 7 && d <= 29 ) { g = "明治" ys = 1868 } else if y < 1926 || ( y == 1926 && m <= 12 && d <= 24 ) { g = "大正" ys = 1912 } else if y < 1989 || ( y == 1989 && m <= 1 && d <= 7 ) { g = "昭和" ys = 1926 } else if y < 2019 || ( y == 2019 && m <= 4 && d <= 30 ) { g = "平成" ys = 1989 } else { g = "令和" ys = 2019 } // y (西暦) から新元号開始年を引いた結果が 0 なら「元」、違う場合には元号年(+1) let yy = (y - ys == 0 ? "元" : String(y - ys + 1)) print("\(g)\(yy)年\(m)月\(d)日") |