오일러 프로젝트 009

둘레의 길이가 1000이고 각 변의 길이가 자연수인 직각삼각형 찾기

세 자연수 a, b, c 가 피타고라스 정리 a^2 + b^2 = c^2 를 만족하면 피타고라스 수라고 부릅니다 (여기서a \le b \le c ).
예를 들면 3^2 + 4^2 = 9 + 16 = 25 = 5^2 이므로 3, 4, 5는 피타고라스 수입니다.
a + b + c = 1000 인 피타고라스 수 a, b, c는 한 가지 뿐입니다. 이 때, a × b × c 는 얼마입니까?

삼각형의 세 변의 길이를 짧은 것 부터 a, b, c 라하자. ( a \le b \le c ) 이 때 a 가 가장 커질 수 있는 경우는 a = b = c, 즉 정삼각형이 되는 경우이다. 따라서 a는 둘레를 P라고 했을 때 1 ~ (P/3) 의 범위에 있을 수 있다. a가 특정한 값을 가진다고 하면 b는 a와 같거나 a를 제외한 둘레의 남은 길이의 절반에 이르는 범위를 가질 수 있다. 이 범위를 가지고 피타고라스 정리를 만족하는 경우를 검사한다. 문제에서는 둘레 1000일 때 이를 만족하는 조합은 단 한가지 경우 밖에 없다고 했으니, 해당 케이스를 찾으면 세 변의 길이의 곱을 출력하고 끝낸다.
Swift 코드는 아래와 같다.

let p = 1000 // 삼각형의 둘레
main: for a in 1..<(p / 3) {
// ^ "main"이라는 레이블을 붙인다.
  for b in a..<( (p - a) / 2) {
    let c = p - a - b
    if c * c == a * a + b * b {
      print(a * b * c)
      break main // 레이블을 이용해서 중첩 루프를 한 번에 빠져나간다.
    }
  }
}

그외 언어 풀이

모두 동일한 알고리듬으로 코딩했다.

파이썬

파이썬 3.6이다. 특별한 테크닉은 사용하지 않았다.

def e009():
  p = 1_000
  for a in range(1, p // 3):
    for b in range(a, (p-a)//2):
      c = p - a - b
      if c*c == a*a + b*b:
         print(a*b*c)
         return
e009()

자바스크립트

문법외에 어떤 특별한 부분도 없다.

let e009 = () => {
  let p = 1000;
  for(var a = 0; a < p / 3; a++) {
    for(var b = a; b < (p-a)/2; b++) {
      let c = p - a - b;
      if(c*c==a*a+b*b) {
        console.log(a*b*c);
        return;
      }
    }
  }
}
e009()

개인적으로는 C 스타일의 for 문을 싫어하는데, 자바스크립트는 특정 범위를 만들 수 있는 리터럴이 없어서 답답하다. LiveScript에서는 아래와 같이 쓸 수 있다.

e009 = !->
  p = 1000
  for a from 1 to p / 3
    for b from a to (p - a) / 2
       c = p - a - b
       if c*c == a*a + b*b then
         console.log a * b * c
         return

 

Read more

워드프레스에서 고스트로 이전

워드프레스에서 고스트로 이전

이 글을 쓰면서도 믿기 힘든 사실인데, 블로그라는 걸 처음 시작한지가 20년이 되었습니다. 이글루스에서 처음 시작했다가, SK컴즈가 인수한다고 발표함과 동시에 워드프레스로 플랫폼을 옮겼죠. 워드프레스오 옮긴 이후에는 호스팅 환경을 이리 저리 옮기긴 했지만 거의 18년 가까이 워드프레스를 사용해온 것 같습니다. 그 동안 워드프레스는 블로깅 툴에서 명실상부한 범용CMS로 발전했습니다. 사실 웬만한 홈페이지들은 이제

By sooop
띄어쓰기에 대한 생각

띄어쓰기에 대한 생각

업무 메일을 쓸 때 가장 많이 쓰는 말 중에 하나가 메일 말미에 ‘업무에 참고 부탁 드립니다.‘인데요, 어느 날부터 아웃룩에서 이 ‘부탁 드립니다’가 틀렸다고 맞춤법 지적을 하기 시작했습니다. 맞는 말은 ‘부탁드립니다’라고 붙여 쓰는 거라고. 사실 아래아한글 시절부터 이전의 MS워드까지, 워드프로세서들의 한국어 맞춤법 검사 실력은 거의 있으나 마나 한

By sooop

구글 포토에서 아이클라우드로 탈출한 후기

한 때 구글 포토가 백업 용량을 무제한으로 제공해 주겠다고해서, 구글 포토를 사용해서 사진을 백업해왔습니다. 물론 이 이야기의 결말은 저나 이 글을 읽고 있는 여러분이나 모두 알고 있습니다. 사실 AI에게 학습 시킬 이미지 데이터를 모으기 위한 것일 뿐이라거나 하는 이야기는 그 당시에도 있었습니다만, 에이 그래도 구글인데 용량은 넉넉하게 주겠지…하는 순진한

By sooop

Julia의 함수 사용팁

연산자의 함수적 표기 Julia의 연산자는 기본적으로 함수이며, 함수 호출 표기와 같은 방식으로 호출하는 것이 가능합니다. 또한 그 자체로 함수이기 때문에 filter(), map() 과 같이 함수를 인자로 받는 함수에도 연산자를 그대로 적용하는 것이 가능합니다. 특히 + 연산자는 sum() 함수와 같이 여러 인자를 받아 인자들의 합을 구할 수 있습니다. 2 + 3 # = 5 +(2,

By sooop