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;
}
}
}