Last Modified : 2012.01.31

테스트

문제 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. 반복문을 시작한다.
  2. 1~45 중의 난수를 발생한다.
  3. 배열에 발생한 난수가 존재하는지 검사한다.
  4. 존재하지 않으면 난수를 배열에 추가하고 존재한다면 반복문의 조건문으로 분기한다.
  5. 배열에 수를 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 과 같이 실행해 주세요");
		}
	}
	
}