윤년 찾기
윤년이란 ? - 태양력의 윤년
현재 전 세계 대부분의 나라에서 쓰는 그레고리력은 4년에 반드시 하루씩 윤날(2월 29일)을 추가하는 율리우스력을 보완한 것으로, 태양년과의 편차를 줄이기 위해 율리우스력의 400년에서 3일(세 번의 윤년)을 뺐다.
그레고리력의 정확한 윤년 규칙은 다음과 같다.
- 서력 기원 연수가 4로 나누어떨어지는 해는 윤년으로 한다. (1992년, 1996년, 2004년, 2008년, 2012년, 2016년, 2020년, 2024년, 2028년 ...)
- 서력 기원 연수가 4, 100으로 나누어떨어지는 해는 평년으로 한다. (1900년, 2100년, 2200년, 2300년, 2500년...)
- 서력 기원 연수가 4, 100, 400으로 나누어떨어지는 해는 윤년으로 둔다. (1600년, 2000년, 2400년...)
즉, 400년에 97년은 윤년이 되며, 1년은 평균 365.2425일이 된다. 이는 춘분점을 기준으로 한 태양년보다 0.0003일(26초)이 길기 때문에, 약 3,300년마다 1일의 편차가 난다
위키백과 윤년 - https://ko.wikipedia.org/wiki/%EC%9C%A4%EB%85%84
TestCode
class LeapTest {
@Test
fun yearNotDivisibleBy4() {
assertFalse(Year(2015).isLeap)
}
@Ignore
@Test
fun yearDivisibleBy4NotDivisibleBy100() {
assertTrue(Year(1996).isLeap)
}
@Ignore
@Test
fun yearDivisibleBy100NotDivisibleBy400() {
assertFalse(Year(2100).isLeap)
}
@Ignore
@Test
fun yearDivisibleBy400() {
assertTrue(Year(2000).isLeap)
}
}
해결안 1) if를 이용한
class Year(val year: Int) {
val isLeap = cal()
private fun cal(): Boolean {
if ((year % 4 == 0) && (year % 100 == 0) && (year % 400 == 0)) return true
if ((year % 4 == 0) && (year % 100 == 0)) return false
if (year % 4 == 0) return true
return false
}
}
해결안 2) when을 이용
class Year(private val year: Int) {
val isLeap: Boolean = when {
isDivisibleBy(400) -> true
isDivisibleBy(100) -> false
isDivisibleBy(4) -> true
else -> false
}
private fun isDivisibleBy(divider: Int) = year % divider == 0
}
'Kotlin > Exercise' 카테고리의 다른 글
RNA를 DNA로 바꾸기 (4) | 2019.03.03 |
---|---|
Twofer - 스트링 리턴하기 (2) | 2019.03.03 |
Hamming -DNA 차이 (2) | 2019.03.03 |
영어에서 돼지 라틴어로 번역하기 (2) | 2019.02.24 |
Isogram인지아닌지 판단하기 (2) | 2019.02.24 |
댓글