재밌고 어려운 IT를 이해해보자~!
반복문과 배열 본문
C언어를 배우면서도 느꼈지만 단순해 보이는 반복문 활용도 바로바로 생각이 떠오르지 않고
오랬동안 고민해야 겨우 풀리거나 해답을 보기 전까지 풀지 못하는 경우가 많다....
스스로 해결해보려는 노력이 부족했던걸까 하하핳 그래도 재밌다.
for, while, do while, switch case 의반복문을 배웠고
do while 과 while의 차이점은 do while은 조건에 들어가기 전에 한번은 꼭 실행시킨다는 점이다.
상황에 따라서 효율적인 반복문을 사용해야한다.
C언어를 배울때도 배열의 이름과 첫번째 원소는 포인터로 쓸 수 있다고 배웠는데 Java도 비슷한 느낌인 것같다.
배열을 선언하면 그것은 배열의 값을 가르키는게 아닌 주소를 가르킨다.
int[] array = new int[5]; // 메모리에 새롭게 5요소를 가지고 있는 int 배열 선언
System.out.println(array); // int[5] 배열의 주소를 출력
배운것들을 활용해서 로또번호를 출력하고 유저에게 입력을 받아 당첨인지 확인할 수 있는 코드를 인강을 보며 실습해보았다.
// 로또당첨기원
int LottoMachine[] = new int[45];
int LottoBall[] = new int[6];
for (int i=0 ; i<45 ; i++) {
LottoMachine[i] = i+1;
}
int ballcount =0;
int bonusnumber =0;
while (ballcount <7) {
int index = (int)(Math.random()*45);
// 공을 찾고 나면 그 위치를 0 으로 바꾼다
// 선택된 인덱스의 값이 0이면 사용 아니면 미사용
if (LottoMachine[index] != 0) {
if (ballcount <6) {
LottoBall[ballcount++] = LottoMachine[index];
} else {
bonusnumber = LottoMachine[index];
ballcount ++;
}
LottoMachine[index] = 0;
}
}
System.out.print("로또 번호는 !!! -> ");
for (int i=0; i<LottoBall.length; i++) {
System.out.print(LottoBall[i] +" ");
}
System.out.println("보너스 넘버 : " + bonusnumber );
Scanner scan = new Scanner(System.in);
int userLotto[] = new int[6];
count = 0;
while (count<6) {
System.out.println( (count+1) + " 번째 로또번호를 입력하세요 : ");
int balls = scan.nextInt();
//유저 로또번호 중복체크
for (int i=0; i<count; i++) {
if(userLotto[i] == balls) {
balls = 0; //중복되었다는 의미
break;
}
}
if(balls !=0 ) {
userLotto[count++] = balls;
}
}
scan.close();
System.out.println("사용자 로또 : ");
for (int i=0; i<LottoBall.length; i++) {
System.out.println(userLotto[i] + " ");
}
System.out.println();
int matchcount =0;
boolean isBonus = false;
// match 카운트로 당첨등수 확인
for (int i=0; i<LottoMachine.length; i++) {
for (int j=0; j<userLotto.length; j++) {
if ( LottoMachine[i]==userLotto[j]) {
matchcount ++;
break;
}
}
if (!isBonus) {
if(userLotto[i] == bonusnumber){
isBonus = true;
}
}
}
if(matchcount == 6) {
System.out.println("1등");
}
else if(matchcount == 5 && isBonus) {
System.out.println("2등");
}
else if(matchcount == 4) {
System.out.println("3등");
}
else if(matchcount == 3) {
System.out.println("4등");
}
코드를 짜기전에.... 어떻게 목적에 맞는 코드를 짤것인가를 오래 생각해보는게 중요한 것 같다.
어차피 바로 코딩하려고해도 아무것도 떠오르지 않는다.
고려해봐야할 사항들-
1. 로또의 번호는 45까지 존재.
2. 중복으로 나오지 않는다.
3. 공이 나올때마다 전체 갯수가 1씩 줄어듦.
4. 뽑는공은 일반 6개와 보너스 공 1개. 총 7개
전체적으로 쉽지 않았지만 특히 중복을 고려하는 요소가 생각해내기 정말 어려웠다.
배열에서는 중간에 요소를 제거하거나 추가할 수가 없는데 어떻게 중복을 피해서 7개의 공을
45개의 공에서 뽑을 수 있을까
해당 코드에서는 먼저 공을 찾은 후에 그 자리를 0으로 만들어서
0이 아닐때만 찾은 공을 7개의 배열에 넣는 방법으로 진행을 했다.
[1,2,3,4,5] 중에 3개를 뽑는다고 생각해보자
랜덤함수가 4를 찾으면 4를 선언해둔 배열의 첫번쨰 자리에 넣는다 [4,0,0]
그리고 해당 자리를 0으로 만든다. 그럼 배열은 다음과 같이 된다.
A= [1,2,3,0,5], B =[4,0,0]
B의 자리가 채워지면 ballcount++
그리고 랜덤함수가 찾은 인덱스 값이 0이 아닐때만 실행하고 B배열의 자리가 다 채워지도록 while (allcount<3) 으로
반복문을 돌리면 중복이 되지 않게 3개의 숫자를 뽑을 수 있다.
너무 난해한 글이다... 이해가 되기 쉽게 정리하는게 필요해보인다.