배열과 난수를 이용한 프로그램을 2개 만들었다!
배열이란
같은 타입의 변수들로 이루어진 묶음이다.
난수란
특정할 수 없는 임의의 값이 추출되는 것을 말한다. 규칙성이 없다.
이 친구들을 이용해서 정말정말 간단한 방 입실 퇴실 관리 프로그램과 로또 프로그램을 만들었다.
일단 입퇴실 프로그램부터 살펴보자.
import java.util.Scanner;
public class MotelFunc {
public void go() {
Scanner sc = new Scanner(System.in);
boolean[] noRoom = new boolean[10];// 모텔 방이 비어있으면 false 안비어있으면 true
boolean proEnd = false;// 프로그램 종료 여부를 결정하는 변수
for (int i = 0; i < noRoom.length; i++) {// 모든 방이 비어있는 상태로 시작한다.
noRoom[i] = false; // noRoom[]가 false 일 경우 방이 비어있는 상태로 생각한다.
} // for done
true와 false값을 받는 boolean변수를 만들어 방이 비었는지 안비었는지를 정해줄 것 이다.
noRoom[] = false 일때, 방이 비어있는 상태로 정했다.
본격적으로 프로그램을 짜본다.
while (true) {// 프로그램이 실행중
System.out.println("모텔 관리 프로그램 v1.0");
System.out.println("1.입실\t 2.퇴실\t 3.방보기\t 4.종료");
System.out.print("선택 > ");
int select = sc.nextInt();// 실행자가 메뉴를 선택
switch (select) {
정말 간단한 프로그램이다. 입실,퇴실,방보기,종료 4가지의 메뉴가있다. 종료를 선택하는 경우를 제외하고는 모두 프로그램의 첫화면, 즉 이 화면으로 다시 돌아오게 코드를짤거다.(while문 이용)
1.입실을 선택했을 경우부터 차근차근 만들어본다.
case 1: // 입실을 선택했을 경우
System.out.println("몇번방에 입실하시겠습니까?");
int roomNum = sc.nextInt();
if (noRoom[roomNum] == true) {// 선택한 방이 비어있지 않은 경우
System.out.println(roomNum + "번방은 현재 손님이 있습니다.");
} else {// 선택한 방이 비어있을 경우
System.out.println(roomNum + "번방에 입실하셨습니다.");
noRoom[roomNum] = true;// 방이 비어있지 않은 상태로 바꾼다.
} // if done
break;// case 1 done
빈방에 입장했을 경우, noRoom[roomNum]의 값을 true로 바꿔준다.
case 2:// 퇴실을 선택했을 경우
System.out.println("몇번방에서 퇴실하시겠습니까?");
int roomNum2 = sc.nextInt();
if (noRoom[roomNum2] == true) {// 선택한 방이 비어있지 않은 경우
System.out.println(roomNum2 + "번방에서 퇴실하셨습니다.");
noRoom[roomNum2] = false;
} else {// 선택한 방이 비어있을 경우
System.out.println(roomNum2 + "번방은 현재 빈 방입니다.");
} // if done
break;// case 2 done
그렇게 입실한 방은 메뉴에서 2.퇴실 을 입력하면 퇴실할 수 있다.
case 3:// 방보기를 선택했을 경우
for (int i = 0; i < noRoom.length; i++) {
if (noRoom[i] == true) {// 방에 입실한 사람이 있을 경우
System.out.println((i + 1) + "번방은 현재 손님이 있습니다.");
} else {// 방에 입실한 사람이 없을 경우
System.out.println((i + 1) + "번방은 현재 비어있습니다.");
} // if done
} // for done
break;// case 3 done
3. 방보기 를 입력했을 경우에는 1~9번방의 현재 상태가 출력된다.
case 4:// 종료를 선택했을 경우
proEnd = true;
break;// case 4 done
4. 종료를 선택한 경우, while문을 벗어나 프로그램을 종료한다.
이때 미리 입력해둔 preEnd라는 boolean형의 변수를 true로 바꿔준다.
default: // 메뉴에 없는 숫자를 골랐을 경우
System.out.println("잘못 선택 하셨습니다.");
break;// default done
}// switch done
그 외에 다른수를 입력했을 때에는 잘못입력했다는 메세지를 띄워주고 프로그램의 처음으로 돌려보낸다.
이렇게 sitch문이 종료된다.
if (proEnd == true) { // 프로그램 종룔를 선택했을 경우
break;
}
} // while done 프로그램 종료
}// go() done
마지막으로 while문을 종료시키는 조건을 설정해주면 프로그램이 완성된다.
필자는 이 코드에 proEnd == 0 을 proEnd = 0으로 쳤어서 상당히 고생했다...
=은 대입이고, ==은 같다는거다... 알고있었는데 저걸 못봤다...
나같은 초보가 자주 할만한 실수라고 생각한다. 앞으로 조심해야겠다!
다음 프로그램으로는 로또 프래그램이다.
로또 프로그램 요구사항
1. 사용자에게 1~45사이의 숫자를 중복되지 않게 6개를 받아서 사용자 배열에 저장
2. 1~45사이의 랜덤숫자를 중복되지 않게 6개를 컴퓨터 배열에 저장
3. 화면 출력 시 사용자배열,컴퓨터배열 모두 오름차순으로 정렬한 후 출력
4. 컴퓨터 번호와 사용자번호 일치하는 번호 수에따라 등수 출력
4-1) 6개 모두 일치하는 경우 1등
4-2) 5개 일치하는 경우 2등
4-3) 4개 일치하는 경우 3등
4-4) 3개 일치하는 경우 4등
4-5) 2개,1개,0개 일치하는 경우 꽝
로또 프로그램의 요구사항이다. 이 조건들을 지겨가며 프로그램을 짜본다.
import java.util.Scanner;
import java.util.Random;
public class LottoFunc {
public void lotto() {
Scanner sc = new Scanner(System.in);
Random r = new Random();
System.out.println("======= 로또 프로그램 =======");
int[] userNum = new int[6];// 유저가 선택할 숫자
int[] comNum = new int[6];// 컴퓨터가 뽑을 로또 당첨번호
int same = 0;// 일치하는 수를 넣어줄 변수
필요한 변수들부터 추가해준다.
// 유저 숫자 입력 시작
for (int i = 0; i < userNum.length; i++) {// 유저가 숫자를 입력하는 반복문
System.out.print((i + 1) + "번째 번호 입력 (1~45) :");
userNum[i] = sc.nextInt();
if (userNum[i] < 1 || userNum[i] > 45) {// 1~45사이의 값만 입력하도록 제어
System.out.println("잘못입력하셨습니다. 1~45 중 한개를 입력해주세요.");
i--;
continue;
}//inner if done
for (int j = 0; j < i; j++) {
if (userNum[i] == userNum[j]) {// 중복된 값을 못넣게 제어
System.out.println("이미 중복된 번호입니다. 다시입력해주세요.");
i--;
break;
} // inner if done
} // for done
} // for done 숫자 입력 종료
for문을 사용하여 사용자들이 로또 번호를 입력하도록 짠다.
사용자가 같은 숫자를 2개 입력하는 경우나, 1~45의 범위를 벗어나는 경우는 for문의 정수형 변수 i의 값을 1줄이고 continue를 이용하여 다시 for문으로 돌아가게한다. i의 값을 1 줄이는것으로 인해 이전의 수행 과정은 새로운 수행과정에 의해 값이 덮어질 것 이다.
// 입력한 숫자 오름차순 버블정렬
for (int j = 0; j < userNum.length - 1; j++) {
for (int i = 0; i < userNum.length - 1 - j; i++) {
if (userNum[i] > userNum[i + 1]) {
int save = userNum[i];
userNum[i] = userNum[i + 1];
userNum[i + 1] = save;
}
}
}
// 버블정렬 끝
기본적인 버블정렬을 이용해 입력받은 숫자를 오름차순으로 정리한다.
// 컴퓨터 숫자 지정 시작
for (int j = 0; j < comNum.length; j++) {// 컴퓨터가 1~45 사이의 번호를 랜덤하게 지정
comNum[j] = r.nextInt(45) + 1;
for (int k = 0; k < j; k++) {// 컴퓨터가 중복된 숫자를 입력하지 못하도록 하는 반복문
if (comNum[j] == comNum[k]) {
j--;//다시 for문을 돌려줄 때 j값을 1빼주어 컴퓨터 배열값을 다시 대입
break;
} // if done
} // for done 중복된 숫자 입력X
컴퓨터 배열에 1~45범위의 난수를 입력받는다. 아까와 같이 변수의 크리를 줄여 다시 for문을 실행하는 것으로 이전의 수행을 덮어 조건을 만족할때까지 반복한다.
사실 필자는 이 코드를 처음 짤때 이렇게 짜지 않았다. 이건 모범답안이다.
// 컴퓨터 숫자 지정 시작
for (int j = 0; j < comNum.length; j++) {// 컴퓨터가 1~45 사이의 번호를 랜덤하게 지정
comNum[j] = r.nextInt(45) + 1;
for (int k = 0; k < j; k++) {// 컴퓨터가 중복된 숫자를 입력하지 못하도록 하는 반복문
if (comNum[j] == comNum[k]) {
comNum[j] = r.nextInt(45) + 1;
k = -1;
continue;
} // if done
} // for done 중복된 숫자 입력X
} // for done 숫자 지정 완료
이런식으로 반목문에서 conNum[j]의 값을 다시 입력받아서, 내부 반복문에서 반복을 돌렸다.
변수의 값을 1 줄이는 대신 내부 for문의 변수 k 의 값에 -1을 대입해 처음부터 다시 비교하도록 만들었다.
// 지정된 숫자 오름차순 버블정렬
for (int j = 0; j < comNum.length - 1; j++) {
for (int i = 0; i < comNum.length - 1 - j; i++) {
if (comNum[i] > comNum[i + 1]) {
int save = comNum[i];
comNum[i] = comNum[i + 1];
comNum[i + 1] = save;
}
}
} // 버블정렬 끝
컴퓨터 배열도 버블정렬을 사용해 오름차순으로 정리해준다.
for (int l = 0; l < userNum.length; l++) {// 일치하는 수의 개수를 알려줌
for (int m = 0; m < userNum.length; m++) {
if (userNum[l] == comNum[m]) {
same++;
}
}
} // for done;
두 배열을 하나하나 비교해 같은 숫자가 몇개 있는지 알려주는 코드를 썼다.
System.out.println("사용자 번호");
for (int a = 0; a < userNum.length; a++) {
System.out.print(userNum[a] + "\t");
} // 사용자 번호 표시
System.out.println();// 줄바꿈
System.out.println("컴퓨터 번호");
for (int b = 0; b < userNum.length; b++) {
System.out.print(comNum[b] + "\t");
} // 컴퓨터 번호 표시
System.out.println();// 줄바꿈
System.out.println("맞은 갯수 : " + same);
switch (same) {
case 0:
case 1:
case 2:
System.out.println("꽝");
break;// case 0,1,2 done
case 3:
System.out.println("4등");
break;// case 3 done
case 4:
System.out.println("3등!");
break;// case 4 done
case 5:
System.out.println("2등!!!");
break;// case 5 done
case 6:
System.out.println("1등!!!!!!!!!!!!");
break;// case 6 done
}
}
}
마지막 출력단계이다. 맞은 개수에 따라 출력되는 결과를 다르게했다.
필자는 마지막 switch부분을 case 0 부터 순차적으로했지만,
case 6:
System.out.println("1등!!!!!!!!!!!!");
break;// case 6 done
case 5:
System.out.println("2등!!!");
break;// case 5 done
case 4:
System.out.println("3등!");
break;// case 4 done
case 3:
System.out.println("4등");
break;// case 3 done
default:
System.out.println("꽝");
으로 표현해주는게 더 좋다.
어차피 0,1,2,의 출력 결과가 모두 꽝이므로 default값으로 설정해주는게 더 좋은 코드라고 생각한다.
이 로또 프로그램을 사용해 내가 입력한 숫자가 몇회차만에 당첨되는지 보려고한다.
그럴경우에는 내가 입력한 배열과 컴퓨터가 입력한 배열이 맞는지 비교하고 다시하면 된다고 생각했지만
우리에겐 이미 그 값이 있지않은가?
same값이 6이 아닌 경우에 컴퓨터 배열 값을 다시 받는 프로그램을 짜본다.
처음에는 same값을 생각을 못하고, 다시 for문을 짜고있는 머리가 깨진 나였다...
그 코드는 다음과 같다.
import java.util.Scanner;
import java.util.Random;
public class LottoFunc2 {
public void lotto() {
Scanner sc = new Scanner(System.in);
Random r = new Random();
int chance = 0;
System.out.println("======= 로또 프로그램 =======");
int[] userNum = new int[6];// 유저가 선택할 숫자
int[] comNum = new int[6];// 컴퓨터가 뽑을 로또 당첨번호
int same = 0;// 일치하는 수를 넣어줄 변수
// 유저 숫자 입력 시작
for (int i = 0; i < userNum.length; i++) {// 유저가 숫자를 입력하는 반복문
System.out.print((i + 1) + "번째 번호 입력 (1~45) :");
userNum[i] = sc.nextInt();
if (userNum[i] < 1 || userNum[i] > 45) {// 1~45사이의 값만 입력하도록 제어
System.out.println("잘못입력하셨습니다. 1~45 중 한개를 입력해주세요.");
i--;
continue;
} // inner if done
for (int j = 0; j < i; j++) {
if (userNum[i] == userNum[j]) {// 중복된 값을 못넣게 제어
System.out.println("이미 중복된 번호입니다. 다시입력해주세요.");
i--;
break;
} // inner if done
} // for done
} // for done 숫자 입력 종료
// 입력한 숫자 오름차순 버블정렬
for (int j = 0; j < userNum.length - 1; j++) {
for (int i = 0; i < userNum.length - 1 - j; i++) {
if (userNum[i] > userNum[i + 1]) {
int save = userNum[i];
userNum[i] = userNum[i + 1];
userNum[i + 1] = save;
}
}
}
// 버블정렬 끝
while (true) {
// 컴퓨터 숫자 지정 시작
for (int j = 0; j < comNum.length; j++) {// 컴퓨터가 1~45 사이의 번호를 랜덤하게 지정
comNum[j] = r.nextInt(45) + 1;
for (int k = 0; k < j; k++) {// 컴퓨터가 중복된 숫자를 입력하지 못하도록 하는 반복문
if (comNum[j] == comNum[k]) {
comNum[j] = r.nextInt(45) + 1;
k = -1;
continue;
} // if done
} // for done 중복된 숫자 입력X
} // for done 숫자 지정 완료
// 지정된 숫자 오름차순 버블정렬
for (int j = 0; j < comNum.length - 1; j++) {
for (int i = 0; i < comNum.length - 1 - j; i++) {
if (comNum[i] > comNum[i + 1]) {
int save = comNum[i];
comNum[i] = comNum[i + 1];
comNum[i + 1] = save;
}
}
} // 버블정렬 끝
for (int l = 0; l < userNum.length; l++) {// 일치하는 수의 개수를 알려줌
for (int m = 0; m < userNum.length; m++) {
if (userNum[l] == comNum[m]) {
same++;
}
}
} // for done;
System.out.println(chance + "회차");
System.out.println("사용자 번호");
for (int a = 0; a < userNum.length; a++) {
System.out.print(userNum[a] + "\t");
} // 사용자 번호 표시
System.out.println();// 줄바꿈
System.out.println("컴퓨터 번호");
for (int b = 0; b < userNum.length; b++) {
System.out.print(comNum[b] + "\t");
} // 컴퓨터 번호 표시
System.out.println();// 줄바꿈
System.out.println("맞은 갯수 : " + same);
switch (same) {
case 0:
case 1:
case 2:
System.out.println("꽝");
break;// case 0,1,2 done
case 3:
System.out.println("4등");
break;// case 3 done
case 4:
System.out.println("3등!");
break;// case 4 done
case 5:
System.out.println("2등!!!");
break;// case 5 done
case 6:
System.out.println("1등!!!!!!!!!!!!");
break;// case 6 done
}
if (same != 6) {
chance++;
same=0;
continue;
} else {
break;
}
}
}
전체 코드를 한번에 올릴 겸 넣어봤다.
while문을 사용해 same의 값이 6이 아닌경우 계속해서 컴퓨터가 값을 받도록 명령했다!
이외에도 백준 문제도 몇개 풀었지만, 오늘은 여기까지 정리해야겠다.
만약 틀린 부분이나 지적해줄만한 부분이 있다면, 언제나 환영이다!(사실 해주셨음 좋겠습니다..!!)
오늘은 여기까지!