Script / CSS

G1sUtil.js

G1sBlogger.js

G1sNavigationList.js

G1sCode

Posts List

2012년 4월 11일 수요일

[Project Euler] 42. 주어진 텍스트 파일에 들어있는 '삼각단어'의 개수는?

42. 주어진 텍스트 파일에 들어있는 '삼각단어'의 개수는?

n번째 삼각수는 tn = ½ n (n + 1) 이라는 식으로 구할 수 있는데, 처음 10개는 아래와 같습니다.

1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...

어떤 영어 단어에 대해서, 각 철자의 알파벳 순서(A=1, B=2, ..., Z=26)를 모두 더한 값을 '단어값'이라 부르기로 합니다.
예를 들어 'SKY'의 단어값은 19 + 11 + 25 = 55가 되는데, 이것은 우연히도 t10과 같습니다.
이렇게 어떤 단어의 단어값이 삼각수일 경우에는 이 단어를 '삼각단어'라 부르기로 합니다.

약 16KB의 텍스트 파일 words.txt에는 2000개 정도의 영어 단어가 수록되어 있습니다.
이 중에서 삼각단어는 모두 몇 개입니까?
Click
삼각함수 Tn = n*(n+1)/2
               2*Tn = n*(n+1) 

여기서 2*Tn 의 제곱근의 값을 내림 한 값이 n이 될거라는 것을 추측할 수 있다.
즉. ceil(sqrt(2Tn)) = k 이라고 할때 k*(k+1)/2 = Tn 일 경우 해당 수는 삼각함수입니다.   
그리고 나머지는 22번 문제를 수정하여 완성.
<script language="Javascript" type="text/javascript">
/* 삼각함수 판단 */
function isTriangular(Tn){
    var sqrtTn = parseInt(Math.sqrt(2*Tn));
    return (Tn == sqrtTn*(sqrtTn+1)/2);
}
/* 텍스트의 점수를 더한 값이 삼각함수인지 체크하여 count. */
function p042(values){
    var names = values.split(',');
    var cnt = 0;
    for(var i=0; i< names.length; i++){
        var sum = 0;
        for(var j=1; j< names[i].length-1; j++)
            sum += names[i].charCodeAt(j)-64;
        if(isTriangular(sum))
            cnt ++;
    }
    alert(cnt);
}
</script>
아래는 파일 접근을 위한 함수.. 아래 함수에서 파일을 읽어서 p042함수를 실행 시킵니다.
<script language="Javascript" type="text/javascript">
/* 파일을 읽어서 함수 실행. */
function getData(url){
    // 기본적인 변수 선언 
    var xmlhttp = null; 
    if (window.XMLHttpRequest)  { xmlhttp=new XMLHttpRequest(); } // code for IE7+, Firefox, Chrome, Opera, Safari
    else    { xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");   } // code for IE6, IE5

    // URL 주소의 값을 가져온다 
    xmlhttp.open("GET", url, true); 
    xmlhttp.setRequestHeader("Cache-Control", "no-cache");
    xmlhttp.setRequestHeader("Pragma", "no-cache");

    // 값을 가져 왔을경우 호출할 메소드를 선언 
    xmlhttp.onreadystatechange = function() { 
        // readyState 가 4 고 status 가 200 일 경우 올바르게 가져옴 
        if(xmlhttp.readyState==4){
            if (xmlhttp.status == 200){
                //F
                if (xmlhttp.responseText != null)
                    // 지정된 함수 실행.
                    p042(xmlhttp.responseText); 
                else
                    alert("Failed to receive RSS file from the server - file not found.");
            }
            else
                alert(responseText = "Error code " + xmlhttp.status + " received: " + xmlhttp.statusText); 
        } 
    } 
    
    xmlhttp.send(null); 
}
</script>

댓글 없음:

댓글 쓰기