[Level1] 2016년 a월 b일에 해당하는 요일 구하기

실제 문제를 풀어보고, 다른사람과 비교하는 재미가 꽤 있다. 시간날때 하나씩 풀어보면 좋을듯 함.

프로그래머스> [Level1] 2016년

#include vector
#include string

using namespace std;

string solution(int a, int b)
{
    string answer = "";

    int year = 2016;
    int month = a;
    int day = b;

    // 날짜의 시작은 월요일이고, 가정된상황이 2016년 1월 1일은 금요일
    // 이기 때문에, 추가적으로 금요일(월[0]부터시작 화[1],수[2],목[3],금[4])
    // 만큼의 Day를 더해 주어야 함.
    int additionalDay = 4;

    // 전제 조건이 윤년이므로, 윤년을 체크하는 로직은 필요 없고,
    // 바로 윤년일때의 데이타를 사용하면 됨.
    int DayArr[13] = { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    int MonthTotalDay = 0;
    for (int i = 0; i < month; i++)
    {
        MonthTotalDay += DayArr[i];
    }

    // 1월1일에서 설정된 월, 일에 맞추어 합산된 Day에 따른
    // VIP(DayOfTheWeek의 약어)를 설정해서 보내준다.
    int DayOfTheWeek = (MonthTotalDay + day + additionalDay) % 7;

    switch (DayOfTheWeek)
    {
        case 0: answer = "SUN"; break;
        case 1: answer = "MON"; break;
        case 2: answer = "TUE"; break;
        case 3: answer = "WED"; break;
        case 4: answer = "THU"; break;
        case 5: answer = "FRI"; break;
        case 6: answer = "SAT"; break;
    }

    return answer;
}

 

  • 윤년 계산법
    • 윤년(4년에 한번)일때는 1일을 더해준다.
    • 윤년 계산에 대한 오차를 보정하기 위해 100년마다 하루를 뺀다.
    • 두번의 오차 수정에도 불구 하고 오류가 정확히 보정되지 않기 때문에 400년 마다 하루를 더해준다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Level01_2016 : MonoBehaviour
{
	void Start ()
    {
        // 01. 1년 부터 (Y-1)년 까지 윤년(LeapingYear)의 수를 구한다.
        int Y = 2016;
        int L = ((Y - 1) / 4) - ((Y - 1) / 100) + ((Y - 1) / 400);
        Debug.Log("1 To 2016 Year LeapingYearCount : " + L);

        Debug.Log("[Func] 1 To 2016 Year LeapingYearCount : " + GetLeapingYear(2016));

        // -- 여기서부터 실제 계산.
        // 2016년 1월 1일은 금요일 이기때문에 추가적으로 금요일(월[0]부터시작 화[1],수[2],목[3],금[4]) 만큼의 Day를 더해 주어야 함.

        int year  = 2016;
        int month = 6;
        int day   = 21;

        Debug.Log(year + ". " + month + ". " + day + " What the VIP");

        Debug.Log("[Func] " + year + " is LeapingYear : " + GetIsLeapingYear(year));

        int TotalMonthDay = GetTotalDayByMonth(month, GetIsLeapingYear(year)) + day + 4;
        string VIP = GetDayOfWeekToString(TotalMonthDay % 7);

        Debug.Log("[Func] VIP : " + VIP);
    }

	// Update is called once per frame
	void Update () {

	}

    string GetDayOfWeekToString(int DayOfTheWeek)
    {
        string DayOfTheWeek_Str = string.Empty;

        switch(DayOfTheWeek)
        {
            case 0: DayOfTheWeek_Str = "SUN"; break;
            case 1: DayOfTheWeek_Str = "MON"; break;
            case 2: DayOfTheWeek_Str = "TUE"; break;
            case 3: DayOfTheWeek_Str = "WED"; break;
            case 4: DayOfTheWeek_Str = "THU"; break;
            case 5: DayOfTheWeek_Str = "FRI"; break;
            case 6: DayOfTheWeek_Str = "SAT"; break;
        }

        return DayOfTheWeek_Str;
    }

    // 01. 1년 부터 TargetYear년 까지의 윤년의 수를 구한다.
    int GetLeapingYear(int TargetYear, int FromYear = 1)
    {
        int LeapingYear = 0;

        /**
         * 태양력에 대한 날짜보정(윤년 계산).
         * 1차. 4년마다 하루를 더해준다.
         * 2차. 1차에서의 계산에 오차가 있어, 100년 마다 하루 뺌.
         * 3차. 2차에서의 보정에 대해서도 오차가 있어 400년 마다 하루를 더함.
         */
        LeapingYear = ((TargetYear - FromYear) / 4) - ((TargetYear - FromYear) / 100) + ((TargetYear - FromYear) / 400);

        return LeapingYear;
    }

    bool GetIsLeapingYear(int TargetYear)
    {
        bool IsLeapingYear = false;

        if ((TargetYear % 4)  " + TotalYearPerDay);
        return TotalYearPerDay;
    }

}

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중

This site uses Akismet to reduce spam. Learn how your comment data is processed.