[javascript] 로또 중복 수 제거 질문 (goto 문)


<!DOCTYPE html>
<html>
    <head>
        <title> </title>
    </head>
    <body>
    <script type="text/javascript">
    var i;
    var j
    var cnt=5;
    var y
    var arr=[];
    for(y=0;y<cnt;y++){
        a:
        for(i=0;i<6;i++){
            arr[i]=parseInt(Math.random()*45+1);
            for(j=0;j<i;j++){
                if(arr[i]==arr[j]){
                    continue a;
                }
            }
        }
        for(i=0;i<6;i++){
            document.write(arr[i]+" ");
        }
        document.write("<br>");
    }

    </script>
    </body>
</html>

C에서 작성했던 코드를 자바스크립트로 변환시킨건데요,

continue를 사용하지 않고 goto를 사용하려고 저렇게 했더니 계속 중복수가 나옵니다.

goto문을 어떻게 사용하면 되나요?

또 continue나 break문을 사용해서 하는 법도 알려주시면 감사하겠습니다.

꼭 goto가 아니여도 됩니다.. ㅠ

  • 2016년 11월 13일에 작성됨

조회수 63


1 답변


좋아요
0
싫어요
채택취소하기

문제점

  • 위에서 continue a; 해당하는 경우는 이미 중복된 값을 찾은 경우라고 할 수 있습니다.
  • 이때 중복된 요소는 arr[i]arr[j]가 같은 경우에 해당합니다.
  • 그런데 continue를 호출하게 되면, 레이블 a:에 해당하는 for문에 next step에 해당합니다. 즉 i++이 실행되어 버립니다.
  • 따라서, 중복된 요소를 그대로 두고, 다음 로또 번호를 찾는 형상이 됩니다.
  • 간단히 해결하는 방법은 현재의 arr[i]가 중복된 번호임으로 다시 찾을 필요가 있습니다. 즉 continue로 i++할 것을 알기 때문에, continue a;를 하기전에 i--를 하면 해결될 수 있습니다.
        a:
        for(i=0;i<6;i++){
            process.stdout.write("a: " + i +"\n");
            arr[i]=parseInt(Math.random()*45+1);
            for(j=0;j<i;j++){
                if(arr[i]==arr[j]){
                    i--; // continue하기전에 이번 인덱스를 한번더 해야함으로 i--를 수행함.
                    continue a;
                }
            }
        }

다른 방법

45개 숫자중 중복되지 않게 6개를 선택하는 문제라면 다음과 같이 하는 방법도 있습니다.

/**
 * 배열 arr의 순서를 셔플하는 함수
 */
function shuffle(arr)
{
    for(var i=arr.length;i>0;i--) 
    {
        // 0<= pick < i 인 임의의 위치 pick을 선택.
        var pick = Math.floor(Math.random()*i);    
        var tmp = arr[i-1]; // i-1번째의 값과
        arr[i-1] = arr[pick]; // 선택된 pick의 위치의 값의 순서를 바꿈
        arr[pick] = tmp;
    }
}

// 로또 번호 배열을 만들고
var lotto = [];
for(var i=1;i<=45;i++) {
    lotto[i-1] = i;
}

// 배열을 뒤섞어서
shuffle(lotto);

// 앞에서 6개 선택하기
for(i=0;i<6;i++) {
    document.write(arr[i]+" ");
}
  • 2016년 11월 15일에 작성됨
    리눅스(유닉스) 기반의 시스템에서 웹 서비스를 개발하고 있습니다.

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close