c#/깨달음

최적화 (3의 배수와 5의 배수의 합 구하기)

mynote6590 2024. 12. 2. 00:07

문제

1 ~ 입력한 값 사이의 3의 배수와 5의 배수의 모든 합을 구하는 문제

 

문제를 보고 두가지 방식이 떠올랐지만 어떤 코드가 효율적인지 몰라서 두가지 방식을 모두 사용해보고 Stopwatch클래스를 이용해 시간을 체크해보았습니다.

 

첫 번째 방식

long result = 0;
for (long k = 1; k < a; k++)
{
    if (k % 3 == 0 || k % 5 == 0)
    {
        result += k;
    }
}

 

 

두번째 방식


// 3의 배수 더한 결과
long result3 = 0;

// 5의 배수 더한 결과
long result5 = 0;

// 15의 배수 더한 결과
long result15 = 0;

long resulFinal = result3 + result5 - result15

for (long i = 3; i < a; i += 3)
{
    result3 += i;
}

for (long j = 5; j < a; j += 5)
{
    result5 += j;
}

for (long k = 15; k < a; k += 15)
{
    result15 += k;
}

 

 

결과

입력값 : 9999999999

첫번째 방식 작동 시간 : 85878 ms 두번째 방식 작동 시간 : 8477 ms

 

 

 

 

전체 코드

using System.Diagnostics;
using System;


namespace opoopopoop
{
    internal class FileName
    {
        static void Main(string[] args)
        {
            Stopwatch watch = new Stopwatch();


            long a = long.Parse(Console.ReadLine());
            Console.WriteLine("");

            // 5의배수  +  3의배수  - 15의 배수
            watch.Start();
            Console.WriteLine(Result1(a));

            watch.Stop();
            Console.WriteLine("첫번째 방법 걸린 시간: " + watch.ElapsedMilliseconds);

            Console.WriteLine("-------");
            watch.Restart();
            watch.Start();

            // 3 or 5의 배수 찾기
            Console.WriteLine(Result2(a));
            watch.Stop();
            Console.WriteLine("두번째 방법 걸린 시간: " + watch.ElapsedMilliseconds);


        }
        static long Result1(long a)
        {
            long result = 0;

            for (long k = 1; k < a; k++)
            {
                if (k % 3 == 0 || k % 5 == 0)
                {
                    result += k;
                }
            }


            return result;
        }

        static long Result2(long a)
        {
            // 3의 배수 더한 결과
            long result3 = 0;
            // 5의 배수 더한 결과
            long result5 = 0;
            // 15의 배수 더한 결과
            long result15 = 0;

            for (long i = 3; i < a; i += 3)
            {
                result3 += i;
            }

            for (long j = 5; j < a; j += 5)
            {
                result5 += j;
            }

            for (long k = 15; k < a; k += 15)
            {
                result15 += k;
            }


            return result3 + result5 - result15;
        }





    }

}

 

 

 

.