본문 바로가기
Kotlin/Exercise

윤년 찾기

by 봄석 2019. 3. 3.

윤년 찾기


윤년이란 ? - 태양력의 윤년

현재 전 세계 대부분의 나라에서 쓰는 그레고리력은 4년에 반드시 하루씩 윤날(2월 29일)을 추가하는 율리우스력을 보완한 것으로, 태양년과의 편차를 줄이기 위해 율리우스력의 400년에서 3일(세 번의 윤년)을 뺐다.

그레고리력의 정확한 윤년 규칙은 다음과 같다.

  1. 서력 기원 연수가 4로 나누어떨어지는 해는 윤년으로 한다. (1992년, 1996년, 2004년, 2008년, 2012년, 2016년, 2020년, 2024년, 2028년 ...)
  2. 서력 기원 연수가 4, 100으로 나누어떨어지는 해는 평년으로 한다. (1900년, 2100년, 2200년, 2300년, 2500년...)
  3. 서력 기원 연수가 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 == 0return 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

댓글