본문으로 바로가기
반응형
오늘은 프로그래머스 문제인 2016년을 풀이를 하려고 합니다. 코드만 확인하려고 하시는 경우 제일 하단에 소스 코드를 확인해주세요. 문제 설명 및 제한 조건은 프로그래머스 사이트에서 문제 2016년을 확인 부탁드립니다. 먼저 문제를 풀기 전 월별 일수를 알아야 합니다. 2016년은 윤년이기 때문에 2월에는 29일까지 있습니다. 문제를 풀기 전에 월별 일수에 대해서 알아보도록 하겠습니다.


 매월 일수



1월 : 31일

2월 : 28/29일
3월 : 31일
4월 : 30일
5월 : 31일
6월 : 30일
7월 : 31일
8월 : 31일
9월 : 30일
10월 : 31일
11월 : 30일
12월 : 31일


구글에 지구의 공전 주기를 검색해보면 365.256일이라고 나옵니다. 1년이 365일로 딱 나누어떨어지지가 않으며, 소수점 0.256일로 인해서 4년마다 1일의 오차가 생기게 됩니다. 그렇기 때문에 4년마다 윤년이라고 부르는 2월 29일이 들어간 달을 넣어 오차를 줄여주게 되는 것입니다. 문제에서는 2016년을 기준으로 하기 때문에 2월에는 29일이 들어가게 되는 것이죠.


소스 코드



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
 
char* solution(int a, int b) {
    char *DayOfTheWeek[] = { "THU""FRI""SAT""SUN""MON""TUE""WED" };
    int DayOfMonth[12= {312931303130313130313031 };
    int Total = 0;
 
    scanf("%d %d"&a, &b);
    a--;
    
    while(a > 0){
        Total += DayOfMonth[--a];
    }
    Total += b;
    
    // 리턴할 값은 메모리를 동적 할당해주세요.
    char* answer = (char*)malloc(sizeof(char)  * 4);
    answer = DayOfTheWeek[Total % 7];
    
    return answer;
}







소스 풀이


2016년 1월 1일 기준으로 금요일입니다. 


2차원 배열에 목요일 부터 금요일 순서대로 배열에 넣은 이유?

char *DayOfTheWeek[] = { "THU""FRI""SAT""SUN""MON""TUE""WED" };

1월 1일의 7일 뒤인 1월 8일에 다시 금요일이 되게 됩니다. 총 일수에 7을 나누어 1이 되게 되면 금요일, 0이 되게 되면 목요일이 되기 때문에 0번째 배열에 목요일, 1번째 배열에는 금요일 순서대로 요일이 들어가게 됩니다. 7로 나눈 나머지에 따라서 해당 배열의 요일과 일치하게 되는 것입니다.



2016년 기준 당월 일수?

int DayOfMonth[12= {312931303130313130313031 };

2번째 배열에는 각 달에 해당하는 일수를 배열에 받았습니다.



해당 날짜의 총 일수 계산 방법?

    a--;
    
    while(a > 0){
        Total += DayOfMonth[--a];
    }
    Total += b;

마지막으로 요일을 구하기 위해서 총 일수를 구하고 7로 나누어 줘야 합니다. 총 일수를 구하는 방법은 1월 ~ 전월의 합 + 당월의 일수 입니다. 예를 들어 7월 21일이면 1 ~ 6월의 일수 + 21일이 되는 것입니다. 배열로는 DayOfMonth[5]까지 합입니다.


제일 처음에 a--를 해준 이유는 당월의 일수는 따로 계산하기 위해서입니다. 당월의 일수를 계산해주는 부분이 마지막 줄에 있는 Total += b 부분입니다.



해당 날짜의 요일 계산 방법?

answer = DayOfTheWeek[Total % 7];

1월 1일의 기준으로 7일 뒤에 1월 8일에 2번째 금요일이 됩니다. 즉, 7일을 주기로 요일을 계산하게 되므로 총일 수에서 7을 나눈 나머지 값을 배열에 넣으면 요일이 됩니다. 




2019/10/24 - [프로그래밍] - 블루투스의 모든 것 - Bluetooth COD(Class Of Device)란?

2019/11/05 - [프로그래밍] - 블루투스의 모든 것 - Bonding과 Pairing의 차이

2019/08/13 - [MCU/AVR] - ATmega128 타이머를 이용한 DC모터 제어

2019/08/25 - [프로그래밍/C#] - C# 마우스 제어(클릭, 좌표 이동)

2019/06/20 - [프로그래밍] - Arabic 프로그래밍 규칙

2019/06/09 - [프로그래밍] - 소스 코드 주석 다는 법

반응형