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

조회수 3409회
<!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가 아니여도 됩니다.. ㅠ

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 문제점

    • 위에서 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]+" ");
    }
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)