프로젝트 오일러를 푸는 4가지 방법. 2

idas4you(63)
Published in
#kr
Words
178
Reading
1 min
Listen
Play
9y


레온하르트 오일러 (1707-1783)

안녕하세요. 저는 사과농축액이고, 이 글은 프로젝트 오일러를 푸는 4가지 방법 두번째 글 입니다.

지난번 프로젝트 오일러 소개에 이어 오늘은 문제를 풀어 보려합니다.

Problem 1

10보다 작은 자연수 중에서 3 또는 5의 배수는 3, 5, 6, 9 이고, 이것을 모두 더하면 23입니다.
1000보다 작은 자연수 중에서 3 또는 5의 배수를 모두 더하면 얼마일까요?

먼저 글로 프로그래밍을 해볼까요?

저는 코드 작성전에 글로 적어본 후 프로그램하는것을 선호하는데요. 그 이유는 프로그래밍 이라는것이 생각을 컴퓨터가 이해할 수 있는 언어로 서술하는 행위이기 때문입니다. 쉽게 이야기하면 생각 -> 한국어 -> 프로그래밍 언어가 되겠습니다.

그럼 문제를 풀어 봅시다.
1~999까지 숫자를 1씩 증가하면서 그 수가 3의 배수 혹은 5의 배수이면 그 숫자를 더하면 되겠군요.

F#

module p1 = 
    let sum = 
        [ 1 .. 999]
        |> List.filter (fun x -> x % 3 = 0 || x % 5 = 0)
        |> List.sum

F#은 파이썬과 같이 들여쓰기로 Scope를 구분합니다.
1~999까지 리스트에서 3과 5의 배수만 추출(filter)한 뒤 추출된 모든 값을 덧샘(sum)하였습니다.
Java를 하셨던 분이라면 자바8에 추가된 stream api(steem api 아닙니다...)와 유사하죠!

자세한 설명은 차차하기로 하고요 다음 언어로 넘어가 보겠습니다.

Go

var sum = 0;
for i := 1; i < 1000; i++ {
    if ( (i % 3) == 0 || (i % 5) == 0 ) {
        sum += i;   
    }
}

코딩 컨벤션 case1 과 case2 중 어느것을 선호하시나요? (댓글 달아주세요. 참고로 전 case2 입니다)

// case 1
if () {
    ...
}
// case 2
if  () 
{
    ...
}

Go의 경우 위 고민을할 필요가 없습니다. 무조건 case1입니다. case2를 사용하면 에러나요.
변수 선언으로 var을 사용 했네요. javascript와 비슷해 보이는군요, 그렇지만 javascript 처럼 약타입언어는 아니에요

다음은 루비를 사용해 보겠습니다.

루비

sum=0
(1..999).each do |i|
  if i % 3 == 0 || i%5==0
    sum=sum+i
  end
end

루비는 Scope를 end로 구분하네요(위 코드는 가독성을 위하여 들여쓰기 하였습니다). 마치 visual basic 연상 시킵니다. 변수 선언 또한 별도의 예약어가 없습니다. 마치 python 같죠?

다음 언어는 R 입니다.

R

res <- 0
for (i in 1:999) { 
    if (i%%3 == 0 | i%%5 == 0) {
        res <- res + i
    }
}

변수 선언이 특이하네요. 람다표현식 같기도하고... R은 나머지 연산자 또한 특이 합니다. 다른언어와 다르게 %%를 사용하는군요. R에서 %가 어떤 기능을 하는지 찾아봤는데 나오지 않네요. 혹시 아시는분이 있으면 댓글 부탁드립니다.

R은 Scope도 특이합니다. 아래 코드 중 문제가 있는 코드는 무엇을까요?

# case1
res <- 0
for (i in 1:999) { 
    if (i%%3 == 0 | i%%5 == 0) {
        res <- res + i
    }
}

# case2
res <- 0
for (i in 1:999) 
{ 
    if (i%%3 == 0 | i%%5 == 0) 
    {
        res <- res + i
    }
}

# case3
res <- 0
for (i in 1:999) 
    if (i%%3 == 0 | i%%5 == 0) 
        res <- res + i

# case4
res <- 0
for (i in 1:999) 
if (i%%3 == 0 | i%%5 == 0) 
res <- res + i

정답은 없습니다. case4가 아닐까? 고민하셨겠지만 정상적인 코드입니다. 신기하죠?

이상 F#, Go, 루비, R을 이용하여 프로젝트 오일러 첫번째 문제를 풀어 봤습니다.
코드를 실행해보고싶으시다면 IDE 설치 없이 온라인으로 컴파일 후 결과 확인이 가능한 https://ideone.com 를 추천드립니다.

아울러 제가 진행하고 있는 보팅하고 문화상품권 받자 이벤트에도 많은 관심 부탁드립니다.

프로젝트 오일러를 푸는 4가지 방법. 2 | Ecency