본문 바로가기
코딩테스트/프로그래머스(lv1)

[프로그래머스 Level 1] 2016년 (C++)

by 모닥불꽃 2021. 1. 21.
반응형

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

 

코딩테스트 연습 - 2016년

2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요? 두 수 a ,b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요. 요일의 이름은 일요일부터 토요일까

programmers.co.kr

 

2016년 문제

 

구현 방법 

주어진 년도의 a월 b일인지 무슨 요일인지 알기 위해 저는 첼러의 합동식을 사용했습니다.

챌러의 합동식을 이용한 풀이는 메모리 초과로 답안이 통과되지 못했습니다.

그래도 좋은 공식같아 링크 첨부해 놓겠습니다.

 

https://terms.naver.com/entry.nhn?docId=3534029&cid=60209&categoryId=60209

 

요일을 구하는 첼러의 합동식

독일의 수학자 크리스티안 첼러(Christian Zeller, 1822~1899)는 요일을 구하는 보다 간편한 식을 만들었는데, 이를 첼러의 합동식(Zeller’s congruence)이라고 한다. 첼러의 합동식에서 구한 값 H는 요일을

terms.naver.com

2016년 1월 1일이 금요일이라고 주어졌으니, 입력한 a월 b일이 무슨 요일인지 알기 위해 1월 1일부터 a월 b일까지 총며칠이 있는지 계산해 주었습니다.

 

계산한 총 일수를 7로 나누어 떨어지면 금요일, 1이 남으면 토요일, 2가 남으면 일요일, 이렇게 진행되겠죠?

 

해당 알고리즘을 구현한 코드는 아래와 같습니다.

소스코드

#include <bits/stdc++.h>
using namespace std;

string solution(int a, int b) {
    string answer = "";
    
    string days[7] = {"FRI","SAT","SUN","MON","TUE","WED","THU"};

	//1월~12월 일수
    int months[12] = {31,29,31,30,31,30,31,31,30,31,30,31};

    int totdays=0;

    for(int i=0;i<a-1;i++) {
        totdays += months[i];
    }
    
    //월들의 일수 합 구하고, b일 더해주기
    totdays = totdays+b-1;
    
    //총 일수 합을 7로 나누어 나머지만큼 배열의 값 정답에 넣어줌
    answer=days[totdays%7];

    return answer;
}

 

반응형

댓글