본문 바로가기

알고리즘

[코딩테스트] Level. 1 - 2016년

728x90

 

문제 설명

2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요? 두 수 a ,b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요. 요일의 이름은 일요일부터 토요일까지 각각 

SUN,MON,TUE,WED,THU,FRI,SAT 입니다.

예를 들어 a=5, b=24라면 5월 24일은 화요일이므로 문자열 "TUE"를 반환하세요.

제한 조건
  • 2016년은 윤년입니다.
  • 2016년 a월 b일은 실제로 있는 날입니다. (13월 26일이나 2월 45일같은 날짜는 주어지지 않습니다)

입출력 예

result

5 24 "TUE"

 

 

첫번째 풀이로는 Calendar를 이용하는 방법이다. Calendar 날짜를 선택한 후 SimpleDateFormat 으로 결과를 반환하는 방법이다. 

이 문제를 풀기위해서는 SimpleDateFormat 의 반환형을 잘 알아야 하고,

uppercase(Locale.ROOT)라는 것을 알아야한다(대문자 변환) 

private fun solution(month: Int, date: Int): String {
    val calendar = Calendar.getInstance()
    calendar.set(2016, month - 1, date)
    return SimpleDateFormat("EEE", Locale.ENGLISH).format(calendar.timeInMillis)
        .uppercase(Locale.ROOT) //대문자로 변환 
}

 

 

https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

 

SimpleDateFormat (Java Platform SE 7 )

Parses text from a string to produce a Date. The method attempts to parse text starting at the index given by pos. If parsing succeeds, then the index of pos is updated to the index after the last character used (parsing does not necessarily use all charac

docs.oracle.com

 

 

두번째는 다른 블로그에서 본 방법인데 좋은 방법인것 같다.

풀이로는 List 를 만들어서 푸는 방법이다. 

private fun solution2(m: Int, b: Int): String {
    var total = 0
    val month = listOf(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
    val dayOfWeek = listOf("FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU")
    for (i in 0 until m - 1) {
//        println(month[i])
        total += month[i]  // 날짜 계산식
    }
//    println(total)
    total += (b - 1) // 월 + 요일을 합한 배열자리의 위치를 파악
//    println(total)

    return dayOfWeek[total % 7] // 요일 산출 , 배열위치에 맞는 요일을 return
}