프로그래머스

[프로그래머스] 2016년 (JAVA)

코 밑 2025. 1. 25. 18:13
Contents

https://school.programmers.co.kr/learn/courses/30/lessons/12901

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

하... 너무너무 귀찮아서 포스팅을 미뤘다...

그렇다고 문제를 안풀고 그냥저냥 방구석에서 굴러다닌 건 아니다. 풀어둔 문제로 앨범 두개 뚝딱 나올거 같다.

이제 밀린 포스팅 시작합니다

연, 월, 일 을 받아서 요일을 반환하는 문제다.

 

이 문제를 읽어보니 영화 썸머워즈가 생각난다.

주인공이 여주의 태어난 날의 요일을 맞추는 장면이 영화 초반에 등장한다.

 

나는 이 문제를 풀기 위해 요일 계산법을 찾아보았다.

https://blog.naver.com/akdlwng/221513865412?viewType=pc

 

암산으로 요일 계산하는 방법!!

어릴 적 어머니로부터 배운 지식입니다. 아무렇게나 한 날짜를 정해서 그 날의 요일을 맞추는 방법! 먼저, ...

blog.naver.com

이 블로그의 계산 방법을 활용했다.

 

먼저 144 025 036 146 이 숫자들을 외워야 한다.

각 1월 ~ 12월에 대응하는 숫자다.

 

이 월에 대응하는 숫자에 을 더한다.

만약 1월 25일이라면

1(1월) + 25 = 26이 되는 것이다.

 

이제 이 더한 숫자에 7로 나누어 나머지를 구한다.

26 / 7 = 3 ... 5가 되어

최종 숫자는 5가 나온다.

이제 나오는 숫자 1 ~ 7(7은 0과 같이 취급)은

월 ~일요일까지 대응하는 숫자가 된다.

그래서 2019년 1월 25일은 숫자 5에 대응하는 금요일이다.

검증

하지만 주의사항

연도에 따른 보정 숫자를 넣어줘야 한다. 이 보정숫자는 마지막 계산에 더해준다.

2019년 기준 보정 숫자가 0이다. 그리고 이 보정숫자는 매년 1씩 증가하고 7까지 증가한다.

 

그리고 윤년(2월에 29일까지 있음)도 있기 때문에 고려해주어야 한다.

4년 주기로 윤년이 돌기 때문에 2월 이후에는 1을 또 더해주어야 한다.

2019년 보증 숫자 0

2020년 2월까지 보증 숫자 1

2020년 3월부터 보정 숫자 2

2021년 보정 숫자 3

2022년 보정 숫자 4

2023년 보정 숫자 5

2024년 2월까지 보정 숫자 6

2024년 3월부터 보정 숫자 7(7 = 0)

2025년 보정 숫자 1

그래서 포스팅 기준 날짜인 2025년 1월 25일은

(1 + 25) / 7의 나머지 5에 1을 더해서 6

6에 대응하는 요일 토요일이 나오게 된다.

 

기준년을 하나 외워둔다면 어렵지 않게 쓸 수 있는 계산법이다.

 

// 프로그래머스 2016년
// 2016년의 월, 일이 매개변수로 주어진다 그날의 요일 반환
// 2016년은 윤년이라 2월에 29일까지 있음. 총 366일
// 날짜 구하는 공식을 이용함
// 144 025 036 146 각 월에 해당하는 날짜임
// 월에 해당하는 숫자 + 일
// 합계 % 7 의 값이 요일
// 2016년의 보증숫자 3 2월 이후에는 4
class Solution {
    public String solution(int a, int b) {
        String[] day = { "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" };
        int[] arr = { 1, 4, 4, 0, 2, 5, 0, 3, 6, 1, 4, 6 };
        // 2월 이후로 1일씩 더 늘어나니까 1 더해줌
        int tmp = a > 2 ? (arr[a - 1] + b + 4) % 7 : (arr[a - 1] + b + 3) % 7;

        return day[tmp];
    }
}

 

2019년이 보정 숫자가 0이었으니까

2018년은 6

2017년은 5

2016년 3월 이후 4

2016년 2월까지 3

이라는 보증 숫자를 넣어 계산했다.

 

새복많입니다~