레온하르트 오일러 (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 를 추천드립니다.
아울러 제가 진행하고 있는 보팅하고 문화상품권 받자 이벤트에도 많은 관심 부탁드립니다.
go 는 틀리셨네요.. && 가 아니라 || 입니다.
상품 없나요? ㅋㅋ
이런 문제는 함수형이 깔끔합니다.
Haskel 코드는
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
수정 했습니다. 지적 감사합니다. 제 생각에도 수리 계산에는 함수형이 잘 어울리는것 같아요.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
자바를 했다고 java8 을 쓸 수 있는 것은 아닌 것 같습니다.
처음에 stream 을 봤을때, 뭐 이런 괴상한게 다 있어...
이젠 자바가 자바가 아니구나 했던 기억이 나네요...
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
자바도 그렇고 포인트 사용을 배제하는 c11도 그렇고 참 공부할것이 많은것 같아요.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
어..아..음..
제가 1도 모르는 프로그래밍의 세계라
친한척하러왔다가 급 당황을 ㅠㅠ
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
글 적을때 초보자를 염두해두고 쓸까? 했었는데. 그럼 설명해야 될것이 너무 많아져서 제가 자신이 없더라고요.. 당황하셨다니 왠지 죄송합니다.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit