이번문제는 개발자라면 누구라도 풀어본 로또 문제다.
여기서 조건을 하나 추가해 회차당 번호중복이 안된다.
번호는 1 부터 45까지.
회차당 번호 중복은 안됨.
총 5번 출력
위에 3개가 조건이였다.
나는 for문을 사용했다.
처음 문제 접근의 시작은 일단 로또번호 보관해야 출력이 가능해 배열로 변수를 만들었다. 그다음은 회차당 번호 중복을 피하기 위해 어떤 조건식을 넣어야 할 지 고민했고, 결과적으로 아래표처럼 정리 해보니 어렵지 않게 생각했다.
| 번호 | 5 | 2 | 2 | 6 | 16 | 20 |
|---|---|---|---|---|---|---|
| 인덱스 | 0 | 1 | 2 | 3 | 4 | 5 |
인덱스 1번은 0번만 비교하면되고 2번은 0,1 과 비교하면된다.
3번은 0,1,2 이렇게 보면 생성되는 번호와 생성되었던 번호만 비교하면 간단히 중복를 걸러낼 수 있고, 중복 시에 번호를 새로 출력 받으면 된다. 여기서 제일 중요한점은 위에 표를 참고하면 인덱스 1번과 2번이 번호과 중복이 발생했다.
근데 2번 인덱스 출력 후 출력을 위해서 3번 인덱스로 넘어간다.
그래서 내가 생각한 방법은 소인수분해를 구할 때 사용한 i--; 이 생각나 바로 적용해 다행히 출력에 성공했다. 이제 코드로 확인해보자
public class Lotto {
public static void main(String[] args) {
//문제 2. 로또번호 5번 생성. 1번당 6개의 숫자 중복없이..중복체크..
int[] lotto=new int [6]; //로또 번호 담은 배열변수
//비교를 위한
for(int times= 0; times<lotto.length-1; times++) {
lotto[0]=(int) Math.floor(Math.random()*45)+1; // 1번 째 번호
for(int i =1; i<lotto.length; i++) { //2번부터 6번까지 번호 뽑기 횟수
lotto[i]=(int) Math.floor(Math.random()*45)+1; // //2번부터 6번까지 번호 뽑기
for(int j=0; j<i; j++) {
if(lotto[i]==lotto[j]) {
//비교하다 해당차례에서 중복 수가 나오면
//그 차례를 다시 뽑으면 되기 때문에 i--해주면 해결된다.
i--;
}
}
}
System.out.println("로또 "+(times+1)+" 회차 :"+lotto[0]+","+lotto[1]+","+lotto[2]+","
+lotto[3]+","+lotto[4]+","+lotto[5]);
}
}
}
참고가 된 소인수분해 코드
public class Practices {
public static void main(String[] args) {
int i = 50;
for(int j =2; j<=i; j++) {
if(i%j==0) {
i=i/j;
System.out.println(j);
j--;
}
}
}
}
확실히 처음에 못 풀었어도 복습을 철저히 한 노력의 결과가 오늘 문제를 풀면서 절실히 느꼈다. 그리고 이해못하는 이해할때 까지 포기 하지않고 친절히 설명해준 희두형 때문에 풀 수 있었다.
고맙다는 말은 여기에 조용히 남긴다.