このページについて
このページは、paiza ラーニング内に開設されているコンテンツ「レベルアップ問題集」で取り扱われているプログラミング課題について、独自の見解を述べたものです。
見解については、paizaラーニングの規約に基づき、許可されている範囲でのみ公開していますが、その内容については paiza とは一切関係なく、また paiza の立場を反映したものではありませんのでご注意ください。
挑戦する課題
レベルアップ問題集の日付セットから「西暦の和暦変換 (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 |
G年m月d日 |
- Gは”明治”、”大正”、”昭和”、”平成”、”令和”のいずれかの元号です。
- 今回の問題では、元号のみで和暦年は表示しません。
考え方
この問題は単純なようで、境界条件が存在するので気を付ける必要がある。
たとえば、「明治」の判定を次のようにしたとする。
1 |
if y <= 1912 && m <= 7 && d <= 29 { |
この場合、
- 「1912年6月27日」は「明治年6月27日」と正しく判定
- 「1911年8月28日」は誤って判定(1911年は1912年以前だが、8月は7月以降なので、2番目の条件判定で却下される)
- 「1910年7月30日」は誤って判定(1910年は1912年以前、7月は7月と等しいが、30日は29日より大きいため、3番目の条件で却下される)
となってしまう。
従って、まずは西暦年だけで判断し、次に境界と同じ西暦年で日付を判断する必要がある。
解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// 西暦、年、月が順番に配列に入る let ia = readLine()!.split(separator: " ").map { Int($0)! } // わかりやすいように、変数に置き換え let y = ia[0] let m = ia[1] let d = ia[2] // 境界条件に気を付ける if y < 1912 || ( y == 1912 && m <= 7 && d <= 29 ) { print("明治", terminator: "") } else if y < 1926 || ( y == 1926 && m <= 12 && d <= 24 ) { print("大正", terminator: "") } else if y < 1989 || ( y == 1989 && m <= 1 && d <= 7 ) { print("昭和", terminator: "") } else if y < 2019 || ( y == 2019 && m <= 4 && d <= 30 ) { print("平成", terminator: "") } else { print("令和", terminator: "") } print("年\(m)月\(d)日") |