DY N DY

실력키우기 윤년(C) 본문

PARK/ALGORITHM

실력키우기 윤년(C)

손세지 2016. 4. 6. 00:01

2085 : 윤년

제한시간: 1Sec    메모리제한: 32mb
해결횟수: 545회    시도횟수: 2506회   



현재 어떤 사람이 살고 있는 년도 B와 다른 어떤 사람이 태어난 년도 A가 주어질 때, 그 사이에 포함된 윤년의 수가 몇인지 알아보는 프로그램을 작성하라.

여기서 윤년이란 2월 29일이 있는 해를 말하며, 해당 년의 숫자가 4로 떨어지고 100으로 나눠떨어지지 않거나, 400으로 떨어지는 년을 뜻한다.

태어난 년도가 윤년일 경우에는 세지 않으며, 현재 년도가 윤년일 경우는 세어준다.

 

입력은 2개의 자연수 B와 A가 입력되며, A와 B는 1이상 1,000,000,000 이하의 숫자이며 B가 A보다 크다.



입력된 년 사이의 A+1년부터 B년 사이에 존재하는 윤년의 수를 출력한다.


 [Copy]
2004 1980
 [Copy]
6



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/**************************************************************
    Problem: 2085
    User: a132034
    Language: C
    Result: Success
    Time:794 ms
    Memory:1092 kb
****************************************************************/
 
 
#include    <stdio.h>
int main()
{
    int s, e;
    scanf("%d %d", &e, &s);
    int y = 0;
    int i;
 
    for (i = s + 1; i <= e; i++)
    {
        if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0)
        {
            s = i;
            break;
        }
    }
    for (i = s; i <= e; i += 4)
    {
 
        if (i % 100 != 0)
        {
            y++;
        }
        if (i % 400 == 0)
        {
            y++;
        }
 
 
    }
    printf("%d", y);
    return 0;
}


윤년의 조건만 맞춰주면 Time Limit이 나온다. 최고값이 1,000,000,000이고 최저값이 1이기 때문에 그냥 for문으로 1씩 올리면 2초이상 걸리기 때문.

여러가지 해결 방안이 있겠지만 여기선 첫 윤년을 start로 설정해 준 후 4씩 올려가며(윤년은 공통적으로 4로 나누어지기 때문) 

찾는 방법을 사용했다. 두번째 for문에서 4로 나누어서 0으로 떨어지는지에 대한 검사를 안한 것은 

시작이 윤년이기때문에 4로 나누어 0으로 떨어질 것이 보장되고 4씩 증가하기 때문에 모든 i가 4로 나누어 떨어지는 것이 보장되기 때문이다. 





'PARK > ALGORITHM' 카테고리의 다른 글

실력키우기 각 자릿수의 합(C++)  (0) 2016.04.07
실력키우기 그릇(JAVA)  (0) 2016.04.06
실력키우기 이진수(C++)  (0) 2016.04.05
실력키우기 2진수를 10진수로(JAVA)  (0) 2016.04.04
실력키우기 팩토리얼(C++)  (0) 2016.04.02