프로그래머스 - 2016 (with Kotlin)

Purang·2023년 2월 14일
0

Programmers

목록 보기
5/5

문제 설명
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"

문제 생각
import java.util.Calendar를 통해 날짜를 계산하는 방법을 사용하기

답변 코드

import java.util.Calendar
class Solution {
    fun solution(a: Int, b: Int): String {
        var answer = ""
        val c = Calendar.getInstance()
        c.add(Calendar.YEAR, -7)
        c.add(Calendar.MONTH, a - 2)
        c.add(Calendar.DATE, b-14)
        val nw : Int = c.get(Calendar.DAY_OF_WEEK)
        if (nw == 1) {
            answer = "SUN"
        } else if (nw == 2) {
            answer = "MON"
        } else if (nw == 3) {
            answer = "TUE"
        } else if (nw == 4) {
            answer = "WED"
        } else if (nw == 5) {
            answer = "THU"
        } else if (nw == 6) {
            answer = "FRI"
        } else if (nw == 7) {
            answer = "SAT"
        }
        return answer
    }
}

현재 날짜(2023-02-14)를 기준으로 c를 구성하였습니다.
DAYOFWEEK을 통해 c날짜의 요일을 구하도록 하였습니다.

다른 사람들의 풀이

class Solution {
    fun solution(a: Int, b: Int): String {
        val dayOfWeek = listOf("THU", "FRI", "SAT", "SUN", "MON", "TUE", "WED")
        val year2016 = listOf(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
        val totalDay = (0 until a - 1).map { year2016[it] }.sum() + b

        return dayOfWeek[totalDay % 7]
    }
}

2016-01-01은 금요일, 모든 월의 날짜를 구해서 그에 맞게 dayOfWeek과 날짜들을 구성하였고,
dayOfWeek은 배열은 일주일을 기준으로 2016-01-01이 금요일이니 맨 처음의 기준이 금요일이 되는데 1일이 금, 2일이 토, 3일이 일, 4일이 월,,, 순 인데 만약 금요일이 index 0에 위치할 경우 달력 규칙상 1일(금) + 7일(금) = 8일(금)이 되어야하는데 0일로 규칙이 깨지게 되므로 index 1에 위치 시켰습니다. 그 후 1월 1일을 기준으로 a월 b일은 1월 1일 ~ a월 b일까지의 총 일수에 % 7을 하면 그 날짜가 나오도록 하였습니다.

제 코드보다 굉장히 효율적이네요.. 더 열심히 공부하겠습니다

profile
몰입의 즐거움

0개의 댓글