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

in kr •  7 years ago  (edited)


레온하르트 오일러 (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 를 추천드립니다.

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

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

go 는 틀리셨네요.. && 가 아니라 || 입니다.
상품 없나요? ㅋㅋ

이런 문제는 함수형이 깔끔합니다.
Haskel 코드는

sum [x | x <- [1..999], x `mod` 3 == 0 || x `mod` 5 == 0]

수정 했습니다. 지적 감사합니다. 제 생각에도 수리 계산에는 함수형이 잘 어울리는것 같아요.

자바를 했다고 java8 을 쓸 수 있는 것은 아닌 것 같습니다.
처음에 stream 을 봤을때, 뭐 이런 괴상한게 다 있어...
이젠 자바가 자바가 아니구나 했던 기억이 나네요...

자바도 그렇고 포인트 사용을 배제하는 c11도 그렇고 참 공부할것이 많은것 같아요.

어..아..음..
제가 1도 모르는 프로그래밍의 세계라
친한척하러왔다가 급 당황을 ㅠㅠ

글 적을때 초보자를 염두해두고 쓸까? 했었는데. 그럼 설명해야 될것이 너무 많아져서 제가 자신이 없더라고요.. 당황하셨다니 왠지 죄송합니다.