Outdated/Algorithm Solution

[BOJ] 1476번 날짜 계산

해달 2020. 6. 22. 08:00

복기

해당 문제는 ‘중국인의 나머지 정리’를 이용하면 더 빠르게 풀 수 있다.


코드

  • C++ 17


#include <stdio.h>

 

int main()

{

    int E, S, M;

    scanf("%d %d %d", &E, &S, &M);

 

    // 구하고자 하는 수 x는

    // x = 15a + 1 = 28b + 1 = 19c + 1이다.

 

    // 계산의 편의성을 위해 1을 빼준다.

    --E; --S; --M;

 

    // 정답을 구할 때까지 반복한다.

    int ans = E;

    while (!(ans % 28 == S && ans % 19 == M))

        ans += 15;

 

    // 지금까지 구한 수는 x - 1이므로 ans에 1을 더해 출력한다.

    printf("%d", ans + 1);

}


  • C# 6.0


using System;

using System.Collections.Generic;

using System.Security.Cryptography.X509Certificates;

 

namespace Csharp

{

    class Program

    {

        static void Main(string[] args)

        {

            var inputs = Console.ReadLine().Split();

            int E = Convert.ToInt32(inputs[0]);

            int S = Convert.ToInt32(inputs[1]);

            int M = Convert.ToInt32(inputs[2]);

 

            // 중국인의 나머지 정리를 이용하면

            // 28 * 19 * s1 % 15 == 1

            // 15 * 19 * s2 % 28 == 1

            // 15 * 28 * s3 % 19 == 1

            // s1 == 13, s2 == 17, s3 == 10

            // ans = (E * 28 * 19 * 13 + S * 15 * 19 * 17 + M * 15 * 28 * 10) % (15 * 28 * 19) 

            //     = (E * 6916 + S * 4845 + M * 4200) % 7980

 

            int ans = (E * 6916 + S * 4845 + M * 4200) % 7980;

            Console.WriteLine((ans != 0) ? ans : 7980);

        }

    }

}


  • Python 3


from sys import stdin

input = stdin.readline

 

E, S, M = map(int, input().split())

ans = (E * 6916 + S * 4845 + M * 4200) % 7980

print((ans if ans != 0 else 7980))


'Outdated > Algorithm Solution' 카테고리의 다른 글

[BOJ] 1074번 Z  (0) 2020.06.29
[BOJ] 1016번 제곱 ㄴㄴ수  (0) 2020.06.22
[BOJ] 11066번 파일 합치기  (0) 2020.06.15
[BOJ] 11055번 가장 큰 증가 부분 수열  (0) 2020.06.15
[BOJ] 5639번 이진 검색 트리  (0) 2020.06.01