실제 문제를 풀어보고, 다른사람과 비교하는 재미가 꽤 있다. 시간날때 하나씩 풀어보면 좋을듯 함.
#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;
}
}
37.535524
126.956222