[프로그래머스] 코딩테스트 풀이 - 2016년

Reference : 프로그래머스 코딩 테스트 연습

문제 설명

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일같은 날짜는 주어지지 않습니다)

입출력 예

a b result
5 24 TUE

풀이

사용언어 : Kotlin

날짜 구하는 함수를 직접 만들경우
  1. 2016년의 모든 달(1월~12월)의 마지막 날을 적는다.

    1
    2
    val month = listOf(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
    // 1월~12월의 전체 날짜 수
  2. 2016년 1월 1일이 무슨일인지 알아낸다. (금요일)

  3. 금요일부터 목요일까지 영어로 적혀있는 배열을 만든다.

    1
    2
    val dayOfWeek = listOf("FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU")
    // 1월 1일부터 반복되는 요일 영어
  1. 1월 1일이라면 (0 + 1 - 1) % 7 = 0 -> FRI
    3월 6일이라면 (31 + 29 + 6 - 1) % 7 = 2 -> SUN
    숫자로 계산한 후 dayOfWeek에서 대응하는 날짜를 찾아 변환한다.
    1
    2
    3
    4
    5
    6
    for (i in 0 until a - 1) {  
    total += month[i] // 날짜 계산식
    }

    total += (b-1)
    return dayOfWeek[total%7] // 요일 산출
내장 라이브러리를 사용해서 만들경우
  1. 월, 일을 날짜 변수에 넣는다

    1
    2
    val calendar = Calendar.getInstance()  
    calendar.set(2016, a-1, b)
  2. 현재 날짜를 밀리초 단위로 변경한 후, 반환값이 날짜 포맷으로 출력되는 함수 SimpleDateFormat을 활용해서 영어단어로 출력한다.

    1
    2
    return SimpleDateFormat("EEE", Locale.ENGLISH).format(calendar.timeInMillis).toUpperCase()  
    // 밀리초단위로 변경 후 SimpleDateFormat으로 요일 출력

해당 내장함수에 대한 설명은 타 포스팅 참조

전체 답안

1
2
3
4
5
6
7
8
9
10
import java.text.SimpleDateFormat  
import java.util.*

class Solution {
fun solution(a: Int, b: Int): String {
val calendar = Calendar.getInstance()
calendar.set(2016, a-1, b)
return SimpleDateFormat("EEE", Locale.ENGLISH).format(calendar.timeInMillis).toUpperCase()
}
}
공유하기