해당 포스트는 프로그래밍 공부를 위해 Project Euler에서 제공되는 알고리즘 문제를 다양한 접근으로 풀이한 글입니다.
Problem
- 문제번호 : 1
- 제목 : 1000보다 작은 자연수 중에서 3 또는 5의 배수를 모두 더하면?
- 설명 : 10보다 작은 자연수 중에서 3 또는 5의 배수는 3, 5, 6, 9 이고, 이것을 모두 더하면 23입니다. 1000보다 작은 자연수 중에서 3 또는 5의 배수를 모두 더하면 얼마일까요?
Solution-1
R Code
# 1부터 1000까지의 수열을 생성합니다.
x <- 1:1000
# 3 또는 5의 배수를 찾아서 벡터로 만듭니다.
multiples <- c(x[x %% 3 == 0], x[x %% 5 == 0])
# 중복되는 수를 제거하고 합계를 구합니다.
answer <- sum(unique(multiples))
# 결과를 출력합니다.
cat("1000보다 작은 자연수 중에서 3 또는 5의 배수를 모두 더하면", answer, "입니다.")
## 1000보다 작은 자연수 중에서 3 또는 5의 배수를 모두 더하면 234168 입니다.
코드 설명
해당 문제는 1부터 1000까지의 자연수 중에서 3 또는 5의 배수의 모든 합을 구하는 것이 목적입니다. 다양한 풀이 방법이 있을 수 있으나 가장 짧은 코드 풀이를 아래에서 설명하도록 하겠습니다.
먼저 1부터 1000까지의 자연수를 담은 벡터 x
를 생성합니다. 이 때, R의 수열 생성 함수 중 하나인 :
연산자를 사용할 수 있습니다.
그 다음, 이 수열에서 3 또는 5의 배수를 찾아내기 위해 주어진 수가 3 또는 5의 배수인지 판단합니다. R에서 자주 사용되는 판단 방법은 주어진 수가 3 또는 5로 나누어 떨어지는지를 검사하는 것이며, R에서는 나머지 연산자인 %%
를 사용할 수 있습니다. 예를 들어, x %% 3 == 0
은 x
가 3의 배수인지를 검사하는 조건식이고, x %% 5 == 0
은 x
가 5의 배수인지를 검사하는 조건식입니다.
위 조건식을 이용하여 1부터 1000까지의 자연수 중에서 3 또는 5의 배수를 찾아내면, 이들을 하나의 벡터로 합칠 수 있습니다. 이를 위해 R의 c()
함수를 사용할 수 있습니다.
그 다음, 중복되는 수를 제거하고 남은 수들을 모두 더하면 주어진 문제의 답을 구할 수 있습니다. 중복되는 수를 제거하기 위해 R의 unique()
함수를 사용할 수 있습니다. 그리고 나서 남은 수들을 모두 더하기 위해 sum()
함수를 사용합니다.
요약 정리
- 1부터 1000까지 수가 담긴
x
벡터 생성 - 3 또는 5로 나눈 나머지가 0인 벡터들을 추출하여
multiples
에 저장 - 중복 수를 제거하고 합을 계산하여
answer
에 저장 - 결과 출력
Solution-2
R Code
sum = 0
for (i in 1:1000){
if (i %% 3 == 0){
sum = sum + i
} else if (i %% 5 == 0){
sum = sum + i
} else {
}
cat(i, "|", sum, "\n")
}
## 234168
코드 설명
위 코드는 for 반복문을 이용해 풀이하는 해법입니다. 1부터 1000까지의 자연수를 반복적으로 검사하여 3 또는 5의 배수인 경우에 sum
변수에 해당 값을 더하는 방식으로 누적합을 계산하는 방식입니다.
if문과 else if문을 사용하여 i가 3 또는 5의 배수인지 검사하며, 만약 i가 3 또는 5의 배수인 경우에는 sum 변수에 i를 더하고, i가 3 또는 5의 배수가 아닌 경우에는 아무것도 하지 않고 다음 자연수를 검사합니다.
또한, 해당 코드에서는 cat()
함수를 사용하여 각각의 자연수 i와 누적합 sum
을 출력합니다. 따라서, 해당 코드를 실행하면 1부터 1000까지의 자연수 중에서 3 또는 5의 배수인 수들과 해당 수들의 누적합이 모두 출력됩니다.
요약 정리
- 빈 벡터
sum
생성 - 1부터 1000까지 1씩 증가(
i
) - 3 또는 5로 나누었을 때, 나머지가 0인 경우 해당 수(
i
)를 총합(sum
)에 합산
마무리
이번 알고리즘 풀이에서는 2가지 풀이를 제안하였습니다. 첫 번째 풀이가 보다 효율적인 해법이며, 두 번째 풀이는 동일한 문제에도 다양한 해법이 있을 수 존재한다는 의미로 이해하시면 됩니다.
관련 링크
[1] [Project Euler] Problem 1 : 1000보다 작은 자연수 중에서 3 또는 5의 배수를 모두 더하면?