테스트
문제 1
로또 번호를 생성하는 코드를 아래 제시한 코드를 보고 작성한다.
메인 메소드는 변경하지 않는다.
generateLotto() 메소드의 //TODO 부분만을 완성한다.
로또번호는 중복되지 않아야 한다.
package test;
public class Test1 {
public static int[] generateLotto() {
int[] lotto = new int[6];
//TODO
return lotto;
}
public static void main(String[] args) {
int[] lotto = generateLotto();
System.out.println("이번주 로또 번호 추측");
for (int i = 0; i < lotto.length; i++) {
System.out.print(lotto[i] + "\t");
}
System.out.println();
}
}
java.lang 팩키지의 Math.random() 이라는 메소드를 이용한다.
Math의 random() 메소드는 0이상(0을 포함한다) 1미만의 영역의 임의의 double 값을 반환한다.
따라서 1에서 45까지의 수에서 임의의 수를 발생시키려면 다음과 같다.
int su = (int)(Math.random() * 45) + 1;
문제 1 풀이
아래와 같이 알고리즘을 작성해 본다.
- 반복문을 시작한다.
- 1~45 중의 난수를 발생한다.
- 배열에 발생한 난수가 존재하는지 검사한다.
- 존재하지 않으면 난수를 배열에 추가하고 존재한다면 반복문의 조건문으로 분기한다.
- 배열에 수를 6개가 다 채우면 반복문을 빠져나온다.
public static int[] generateLotto() {
int[] lotto = new int[6];
int idx = 0;
while (true) {
int su = (int) (Math.random() * 45) + 1;
for (int i = 0; i < lotto.length; i++) {
if (su == lotto[i]) {
continue;
}
}
lotto[idx++] = su;
if (idx > 5) {
break;
}
}
return lotto;
}
위와 같이 작업하면 우리가 작성한 알고리즘대로 작성한 것 같다.
하지만 continue; 문장은 자신을 감싸고 있는 가장 가까운 반복문의 조건문으로로 분기한다.
그 조건절은 while 문의 조건문이 아닌 for문의 조건문으로 분기하므로 원하는 결과를 얻지 못한다.
while 문의 조건문으로 분기하도록 고치려면 다음과 같이 레이블을 이용하는 것으로 변경한다.
public static int[] generateLotto() {
int[] lotto = new int[6];
int idx = 0;
WHILE: while (true) {
int su = (int) (Math.random() * 45) + 1;
for (int i = 0; i < lotto.length; i++) {
if (su == lotto[i]) {
continue WHILE;
}
}
lotto[idx++] = su;
if (idx > 5) {
break;
}
}
return lotto;
}
continue 다음에 WHILE 이란 레이블명을 사용하여 while문의 조건절로 분기하도록 소스를 고치면 알고리즘대로 작성한 것이 된다.
레이블을 사용하지 않으려면 다음과 같이 고칠 수도 있다.
boolean check = true; 이라는 변수로 발생한 난수를 배열에 넣을것인지 여부를 판단하도록 한다.
public static int[] generateLotto() {
int[] lotto = new int[6];
int idx = 0;
while (true) {
boolean check = true;
int su = (int) (Math.random() * 45) + 1;
for (int i = 0; i < lotto.length; i++) {
if (su == lotto[i]) {
check = false;
break;
}
}
if (check) {
lotto[idx++] = su;
}
if (idx > 5) {
break;
}
}
return lotto;
}
아래는 다른 방법으로 푼 예이다.
로또 볼을 상자에서 하나씩 꺼낸다고 가정하자.
로또 볼 상자를 나타내는 것이 아래에서 balls 란 int형 1차원 배열변수이다.
balls 에서 값을 꺼낸 후에는 해당하는 위치의 배열값을 -1로 바꾼다.
만약 로또 볼 상자에서 꺼낸 값이 -1이 아니면 lotto 배열에 추가한다.
public static int[] generateLotto() {
int[] lotto = new int[6];
// 로또 상자 초기화
int[] balls = new int[45];
for (int i = 0,ball = 0; i < balls.length; i++) {
balls[i] = ++ball;
}
int idx = 0; // lotto 배열의 인덱스,lotto 배열에 순서대로 값을 넣기 위해서
while (idx < 6) {
int ballsIdx = (int) (Math.random() * 45);//balls 배열 인덱스 값
int su = balls[ballsIdx];
if (su != -1) {
balls[ballsIdx] = -1;
lotto[idx++] = su;
}
}
return lotto;
}
문제 2
package test;
public class Test2 {
public static void main(String[] args) {
if (args.length > 0 ) {
int temp = Integer.parseInt(args[0]);
if (temp >=2 && temp <= 9) {
for (;temp > 0;temp--) {
for (int i = 0; i < temp; i++) {
System.out.print("*");
}
System.out.println();
}
} else {
System.out.println("2이상 9이하의 값을 명령형 매개변수의 값으로 주세요");
}
} else {
System.out.println("java test.Test2 7 과 같이 실행해 주세요");
}
}
}
