얼렁뚱땅 개발 블로그

[프로그래머스] Level 1 - 2016 본문

코딩테스트/프로그래머스

[프로그래머스] Level 1 - 2016

김경원0519 2021. 4. 3. 17:15
반응형

문제

두 수 a , b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요.

 

입출력 예시

a b result
5 24 "TUE"

 

문제를 풀기 전

이 문제를 풀기 전 주어진 날짜의 요일을 구하는 공식인 제라의 공식(Zeller's congruence)이 있다.

참고 자료를 보면 꽤나 읽기 어렵다. 하지만 해당 공식을 이해를 할 필요는 없고, 공식을 알아두기만 하면 언제든지 사용할 수 있다.

제라의 공식그레고리력, 율리우스력이 있다. 현재 사용하는 력은 그레고리력이므로, 그레고리력 공식을 사용하면 된다. 

공식 중 소프트웨어에서 사용 중 단순화 공식을 사용하면 된다.

  • h - 요일 ( 0 : 토요일, 1 : 일요일 , 2 : 월요일 ... 6 : 금요일 )
  • q - 일
  • m - 월
  • y - 년도

윤년이며 1월 2월 같은 경우 지난 해의 13월 14월로 계산을 한다.

 

참고 자료

en.wikipedia.org/wiki/Zeller%27s_congruence

 

풀이 

1. 요일을 담은 문자열 배열을 선언 및 정의한다.

2. 2016년은 윤년이기 때문에 y-- 와 m += 12을 해준다.

3. 제라의 공식을 이용하여 h을 구한다.

4. answer에 week[h]를 넘겨준다.

 

코드

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

// 제라의 공식은 토요일 : 0 이다. 따라서 토요일 부터 시작하는 문자열 배열을 만든다.
char* week[7] = { "SAT", "SUN", "MON", "TUE", "WED", "THU", "FRI"};

char* solution(int a, int b) {
    char* answer = NULL;
    
    int q = b, m = a, y = 2016;

	// 2016년은 윤년이기 때문에 지난 해의 13월 14월로 맞춰준다.
    if (m <= 2) {
        m += 12;
        y--;
    }

	// 제라의 공식을 이용한다.
    int h = (q + 13 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7;
    
    // h에 해당하는 요일을 넘겨준다.
    answer = week[h];
    
    return answer;
}
반응형
Comments