[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]+" "); }
- 위에서
댓글 입력