[R] Problem 1 : 1000보다 작은 자연수 중에서 3 또는 5의 배수를 모두 더하면?

해당 포스트는 프로그래밍 공부를 위해 Project Euler에서 제공되는 알고리즘 문제를 다양한 접근으로 풀이한 글입니다.

project-euler-multilple-sum
[출처] 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 == 0x가 3의 배수인지를 검사하는 조건식이고, x %% 5 == 0x가 5의 배수인지를 검사하는 조건식입니다.

위 조건식을 이용하여 1부터 1000까지의 자연수 중에서 3 또는 5의 배수를 찾아내면, 이들을 하나의 벡터로 합칠 수 있습니다. 이를 위해 R의 c() 함수를 사용할 수 있습니다.

그 다음, 중복되는 수를 제거하고 남은 수들을 모두 더하면 주어진 문제의 답을 구할 수 있습니다. 중복되는 수를 제거하기 위해 R의 unique() 함수를 사용할 수 있습니다. 그리고 나서 남은 수들을 모두 더하기 위해 sum() 함수를 사용합니다.

요약 정리

  1. 1부터 1000까지 수가 담긴 x 벡터 생성
  2. 3 또는 5로 나눈 나머지가 0인 벡터들을 추출하여 multiples에 저장
  3. 중복 수를 제거하고 합을 계산하여 answer에 저장
  4. 결과 출력

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의 배수인 수들과 해당 수들의 누적합이 모두 출력됩니다.

요약 정리

  1. 빈 벡터 sum 생성
  2. 1부터 1000까지 1씩 증가(i)
  3. 3 또는 5로 나누었을 때, 나머지가 0인 경우 해당 수(i)를 총합(sum)에 합산

마무리

이번 알고리즘 풀이에서는 2가지 풀이를 제안하였습니다. 첫 번째 풀이가 보다 효율적인 해법이며, 두 번째 풀이는 동일한 문제에도 다양한 해법이 있을 수 존재한다는 의미로 이해하시면 됩니다.

관련 링크

[1] [Project Euler] Problem 1 : 1000보다 작은 자연수 중에서 3 또는 5의 배수를 모두 더하면?