Day7에서 한 가위바위보 게임을 이어서 만들어보자.
pcNum |
userNum |
1 |
1 or 2 or 3 |
2 |
1 or 2 or 3 |
3 |
1 or 2 or 3 |
int pcNum = (int)(Math.random()*(3-1+1))+1;
String result = "";
// 사용자가 이긴 경우
if((pcNum==1 && userNum==2) ||
(pcNum==2 && userNum==3) ||
(pcNum==3 && userNum==1)) {
result = ">>> 사용자님이 이겼습니다.\n";
}
// 사용자가 진 경우
else if((pcNum==2 && userNum==1) ||
(pcNum==3 && userNum==2) ||
(pcNum==1 && userNum==3)) {
result = ">>> 사용자님이 졌습니다.\n";
}
// 사용자와 컴퓨터가 비긴 경우
else {
result = ">>> 비겼습니다.\n";
}
System.out.println(result);
컴퓨터가 내는 값이 무엇인지 알 수 있도록 나타내 보자.
String pcNumStr="";
if(pcNum==1) {
pcNumStr = "가위";
}
else if(pcNum==2) {
pcNumStr = "바위";
}
else{
pcNumStr = "보";
}
System.out.println("\n컴퓨터는" + pcNumStr + "을 냈습니다.");
-- pcNumd은 정수만 들어갈 수 있으므로 String pcNumStr를 선언하여 각 숫자마다 가위, 바위, 보를 출력할 수 있도록 바꾸어 준다.
숫자를 맞히는 게임을 만들어 보자.
import java.util.Scanner;
public class MainBingo {
public static void main(String[] args) {
// 컴퓨터가 1~100까지 중 랜덤하게 생성한 숫자 한 개 맞추기 게임
Scanner sc = new Scanner(System.in);
int randNum = (int) (Math.random() * (100 - 1 + 1)) + 1;
int userCnt = 0;
do {
System.out.println(">> 1부터 100까지 중 숫자 하나를 입력하세요 ==> ");
int userNum = 0;
try {
userNum = Integer.parseInt(sc.nextLine());
} catch (NumberFormatException e) {
System.out.println(">> 숫자만 입력하세요. 다시 처음부터 게임을 시작합니다.");
userCnt = 0;
continue;
}
if (randNum < userNum) {
userCnt++;
System.out.println(">> " + userNum + "보다 작습니다.");
} else if (randNum > userNum) {
userCnt++;
System.out.println(">> " + userNum + "보다 큽니다.");
} else {
userCnt++;
System.out.println(">> BINGO! " + userCnt + "번 만에 맞추었습니다.");
break;
}
} while (true);
sc.close();
System.out.println("== 프로그램 종료 ==");
}
}
다시 시작할 때 랜덤 값을 다시 설정해야 count가 제대로 된다.
try {
userNum = Integer.parseInt(sc.nextLine());
} catch (NumberFormatException e) {
System.out.println(">> 숫자만 입력하세요. 다시 처음부터 게임을 시작합니다.");
randNum = (int) (Math.random() * (100 - 1 + 1)) + 1; // 랜덤 값 다시 설정
userCnt = 0;
continue;
}
질문 ▷▷ 레이블을 사용하여 break; 하기
-- 레이블명 뒤에 : 을 붙이며 반드시 반복문 앞에 써야 한다.
for(int i=0; i<10; i++) { // 10행
for(int j=0; j<5; j++) { // 5열
if(i==2 && j==2) break;
System.out.print("["+i+","+j+"]");
}
System.out.println("");
}
outer:
for(int i=0; i<10; i++) { // 10행
for(int j=0; j<5; j++) { // 5열
if(i==2 && j==2) break outer;
System.out.print("["+i+","+j+"]");
}
System.out.println("");
}
-- outer: 을 레이블이라고 부르는데 그 레이블 이름이 지금은 outer일 뿐이지 바꿀 수 있다.
-- break 레이블명; 을 하면 레이블명: 다음에 오는 반복문을 빠져나간다.
레이블을 사용하여 가위바위보 게임을 빠져나가 보자.
outer:
do {
for (;;) {
System.out.print(">> 게임을 계속하시겠습니까?(Y/N) => ");
yn = sc.nextLine();
if ("y".equalsIgnoreCase(yn))
break;
if ("n".equalsIgnoreCase(yn))
break outer;
else {
System.out.println("▷ 계속여부는 Y/N이어야 합니다.");
continue;
}
} while (!(userNum == 4));
-- do while() 밖에 레이블을 잡아 놓고 break outer;를 해 준다.
Ⅰ. 배열(Array)
-- 동일한 데이터타입을 가지는 여러개의 데이터를 담을 수 있는 데이터 타입을 말한다.
-- 배열 또한 객체라는 것을 꼭 기억하도록 하자.
1. 배열의 선언
▷▷ 첫 번째 방법
-- 데이터타입[] 배열명;
-- 데이터타입 배열명[];
int[] subjectArr; // 또는 int subjectArr[];
2. 선언되어진 배열을 메모리에 할당해 준다.
subjectArr = new int[7];
0 |
1 |
2 |
3 |
4 |
5 |
6 |
-- 위의 숫자는 배열의 인덱스(index)를 가리키는 번호로서 0부터 시작하여 1씩 증가한다.
-- 배열의 인덱스(index)를 "배열의 방번호"라고 흔히 부른다.
-- 배열에 저장된 데이터를 표현할 때는 아래와 같이 배열명[인덱스번호]로 나타낸다.
▷ subjectArr[0]
subjectArr[1]
subjectArr[2]
subjectArr[3]
subjectArr[4]
subjectArr[5]
subjectArr[6]
▷ subjectArr[7] ==> 오류
-- 배열로 선언된 변수에는 자동적으로 초기값이 들어간다.
-- 정수는 0, 실수는 0.0, char는 '', String을 포함한 객체는 null이 들어간다.
배열의 길이에 대해 알아보자.
subjectArr = new int[7];
System.out.println("배열 subjectArr의 길이 : " + subjectArr.length);
▷결과
배열 subjectArr의 길이 : 7
배열에 들어가 있는 값이 무엇인지 알아보자.
for(int i=0; i<subjectArr.length; i++) {
int val = subjectArr[i];
System.out.print(val);
}
▷결과
0000000
3. 데이터 값 넣어 주기
subjectArr[0] = 100; // 국어
subjectArr[1] = 90; // 영어
subjectArr[2] = 95; // 수학
subjectArr[3] = 70; // 과학
subjectArr[4] = 98; // 사회
subjectArr[5] = 100; // 음악
subjectArr[6] = 90; // 체육
for(int i=0; i<subjectArr.length; i++) {
int val = subjectArr[i];
System.out.println("subjectArr["+i+"] =>"+ val);
}
▷결과
subjectArr[0] =>100
subjectArr[1] =>90
subjectArr[2] =>95
subjectArr[3] =>70
subjectArr[4] =>98
subjectArr[5] =>100
subjectArr[6] =>90
점수들의 총점을 구해 보자.
int total=0;
for(int i=0; i<subjectArr.length; i++) {
total += subjectArr[i];
}
System.out.println("총점 : "+total);
▷결과
총점 : 643
점수들의 평균을 구해 보자.
double avg = (double)total/subjectArr.length;
System.out.println("평균 : "+ avg);
▷결과
평균 : 91.85714285714286
소수부 첫째자리까지만 보여주고 반올림을 해 보자.
System.out.println("평균 : "+ Math.round((avg*10))/10.0);
▷결과
평균 : 91.9
▷▷ 두 번째 방법
-- 위의 1. 배열의 선언과 2. 선언되어진 배열을 메모리에 할당을 각각 따로 하지 않고 아래와 같이 동시에 할 수 있다.
int[] subjectArr2 = new int[7];
-- 위의 코드와 똑같이 값 입력, 총점, 평균을 구할 수 있다.
subjectArr2[0] = 100; // 국어
subjectArr2[1] = 90; // 영어
subjectArr2[2] = 95; // 수학
subjectArr2[3] = 70; // 과학
subjectArr2[4] = 98; // 사회
subjectArr2[5] = 100; // 음악
subjectArr2[6] = 90; // 체육
for (int i = 0; i < subjectArr2.length; i++) {
int val = subjectArr2[i];
System.out.println("subjectArr2[" + i + "] =>" + val);
}
total = 0;
for (int i = 0; i < subjectArr2.length; i++) {
total += subjectArr2[i];
}
System.out.println("총점 : " + total);
avg = (double) total / subjectArr2.length;
System.out.println("평균 : " + avg);
System.out.println("평균 : " + Math.round((avg * 10)) / 10.0);
▷결과
subjectArr2[0] =>100
subjectArr2[1] =>90
subjectArr2[2] =>95
subjectArr2[3] =>70
subjectArr2[4] =>98
subjectArr2[5] =>100
subjectArr2[6] =>90
총점 : 643
평균 : 91.85714285714286
평균 : 91.9
▷▷ 세 번째 방법
-- 위의 1.배열의 선언과 2. 선언되어진 배열을 메모리에 할당과 3. 데이터 값을 넣어주기를 각각 따로 하지 않고 아래와 같이 동시에 할 수 있다.
int[] subjectArr3 = new int[] {100, 90, 95, 70, 98, 100, 90};
for (int i = 0; i < subjectArr3.length; i++) {
int val = subjectArr3[i];
System.out.println("subjectArr3[" + i + "] =>" + val);
}
total = 0;
for (int i = 0; i < subjectArr3.length; i++) {
total += subjectArr3[i];
}
System.out.println("총점 : " + total);
avg = (double) total / subjectArr3.length;
System.out.println("평균 : " + avg);
System.out.println("평균 : " + Math.round((avg * 10)) / 10.0);
▷결과
subjectArr3[0] =>100
subjectArr3[1] =>90
subjectArr3[2] =>95
subjectArr3[3] =>70
subjectArr3[4] =>98
subjectArr3[5] =>100
subjectArr3[6] =>90
총점 : 643
평균 : 91.85714285714286
평균 : 91.9
-- 세 번째 방법에서 new int[]는 생략이 가능하다.
int[] subjectArr4 = {100, 90, 95, 70, 98, 100, 90};
for (int i = 0; i < subjectArr4.length; i++) {
int val = subjectArr4[i];
System.out.println("subjectArr4[" + i + "] =>" + val);
}
total = 0;
for (int i = 0; i < subjectArr4.length; i++) {
total += subjectArr4[i];
}
System.out.println("총점 : " + total);
avg = (double) total / subjectArr4.length;
System.out.println("평균 : " + avg);
System.out.println("평균 : " + Math.round((avg * 10)) / 10.0);
▷결과
subjectArr4[0] =>100
subjectArr4[1] =>90
subjectArr4[2] =>95
subjectArr4[3] =>70
subjectArr4[4] =>98
subjectArr4[5] =>100
subjectArr4[6] =>90
총점 : 643
평균 : 91.85714285714286
평균 : 91.9
Ⅱ. 확장된 for문
-- 개선된 for문, for each문 라고도 한다.
for(int val:subjectArr4) {
System.out.println(val);
}
-- subjectArr4 배열의 길이만큼 반복한다.
-- 반복하면서 int val 속에 배열방(index)에 들어있는 값을 넣어준다.
▷결과
100
90
95
70
98
100
90
확장된 for문을 사용하여 총점을 구해 보자.
int total=0;
for(int val:subjectArr4) {
total += val;
}
System.out.println("총점 : " + total);
▷결과
총점 : 643
배열을 이용하여 암호를 확인하는 프로그램을 만들어 보자.
-- 암호를 입력받고자 하는데 암호의 길이는 8글자 이상 15글자 이하이어야 하고,
암호는 반드시 영문대문자, 영문소문자, 숫자, 특수기호가 최소한 1개 이상 들어가야 한다.
-- 암호를 입력하기 위해 Scanner를 사용한다.
Scanner sc = new Scanner(System.in);
do {
System.out.print(">> 암호를 입력하세요. => ");
String passwd = sc.nextLine();
}while(true);
sc.close();
-- 1) 입력받은 passwd 의 길이 검사
int len = passwd.length();
if(len<=8 || len>=15) {
System.out.println("▷ 암호의 길이는 8글자 이상 15글자 이하이어야 합니다.\n");
}
else {
}
-- 2) 위의 1)의 else 안에 입력받은 passwd 글자 하나하나를 검사한다.
boolean flagUpper = false; // 영문대문자 표식을 위한 용도
boolean flagLower = false; // 영문소문자 표식을 위한 용도
boolean flagNumber = false; // 숫자 표식을 위한 용도
boolean flagSpecial = false; // 특수문자 표식을 위한 용도
char[] chrArr = passwd.toCharArray(); // 리턴타입이 char타입의 배열로 나온다.
for(char ch:chrArr) {
if('A'<=ch && ch<='Z') { // 영문대문자인지 검사
flagUpper = true;
}
else if('a'<=ch && ch<='z') { // 영문소문자인지 검사
flagLower = true;
}
else if('0'<=ch && ch<='9') { // 숫자인지 검사
flagNumber = true;
}
else { // 특수문자인지 검사
flagSpecial = true;
}
}
-- passwd에서 받은 문자열을 char 배열에 넣어서 문자 하나씩 영문 대문자인지, 소문자인지, 숫자인지, 특수문자인지 검사한다.
-- boolean 변수는 do while문 안, if~else문 밖에 선언해 주자.
if(flagUpper && flagLower && flagNumber && flagSpecial) {
// 암호요구 조건에 충족하는 경우
System.out.println("▷ 암호입력 성공! \n");
System.out.println("▷ 입력한 암호 : "+passwd);
break;
}
else {
// 암호요구 조건에 충족하지 못하는 경우
System.out.println("▷ 암호는 영문 대문자, 소문자, 숫자, 특수기호가 혼합이 되어져야 합니다. \n");
}
다른 클래스에 passwdCheck명의 static method를 만들어서 불러와 보자.
package my.day8.b.array;
import java.util.Scanner;
import my.util.MyUtil;
public class MainQuiz {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print(">> 암호를 입력하세요. => ");
String passwd = sc.nextLine();
boolean isUse = MyUtil.passwdCheck(passwd);
if(isUse) {
System.out.println("입력하신 암호 " +passwd+ "는 사용이 가능합니다.");
}
else {
System.out.println("입력하신 암호 " +passwd+ "는 사용이 불가합니다.");
}
sc.close();
}
}
my.util(package) - MyUtil(class, main() 미포함)
Ⅲ. Random
-- 어떤 범위 내의 무작위 수를 얻어오는 것
-- Math.random 대신 사용할 수 있다.
-- 보안상 Math.random() 보다 new Random();을 사용하는 것이 더 안전하다.
5부터 10까지 랜덤한 수를 만들어 보자.
Random rnd = new Random();
int n = rnd.nextInt(6)+5;
System.out.println(n);
-- rnd.nextInt(마지막수-처음수+1)+5
배열을 이용하여 로또 당첨 번호를 만들어 보자.
int[] ballArr = new int[45];
int[] tempArr = new int[5]; // 기존에 뽑았던 방번호를 기억시켜두는 공간
for(int i=0; i<ballArr.length; i++) {
ballArr[i] = i+1; // 배열의 방마다 데이터 입력하기
// 데이터값은 1~45
}
for(int i=0; i<tempArr.length; i++) {
tempArr[i] = -1;
/*
공을 꺼내어 오면 꺼내온 공의 방번호(index 번호)를 기억하는 곳으로 사용한다
꺼내온 공의 방번호(index 번호)가 0(실제로는 1번볼)이 들어올 수 있으므로
데이터 값은 방번호(index 번호)로 사용하지 않는 -1로 모두(5개) 초기화한다.
*/
}
// 공의 방번호를 꺼내는 작업을 6번 반복
// 0번 방부터 44번 방까지 랜덤하게 6번 뽑아야 한다.
// 즉, 0~44까지 난수를 발생
String result = ""; // 랜덤하게 뽑은 공의 데이터 값(1~45)을 보여주기 위한 용도
Random rnd = new Random();
outer:
for(int i=0; i<6; i++) {
// int idx = rnd.nextInt(마지막수-처음수+1)+처음수);
int idx = rnd.nextInt(44-0+1)+0; // 방번호
// 9 0 12 7 34 20
// tempArr[5] <= 랜덤하게 뽑은 배열의 방번호를 기억하는 공간
/*
---------------------
배열의 방번호 | 0 | 1 | 2 | 3 | 4 |
---------------------
배열속의 데이터값 -1 -1 -1 -1 -1
---------------------
랜덤하게 뽑은 9 0 12 7 34 20(ok)
배열의 방번호
// 9 0 12 9(중복) 34 20
---------------------
배열의 방번호 | 0 | 1 | 2 | 3 | 4 |
---------------------
배열속의 데이터값 -1 -1 -1 -1 -1 // 0도 난수값에 해당되므로 아예 다른 수를 초기치로 잡아야 한다.
---------------------
랜덤하게 뽑은 9 0 12 (다시)7 34 20(ok)
배열의 방번호
*/
for(int j=0; j<tempArr.length; j++) {
if(tempArr[j] == idx) { // 이미 9를 뽑았는데 9를 또 뽑으면 어떻게 할지
i--; // 위에서 시도할 횟수를 다시 한번 주어야 한다.
// 해주지 않으면 6번 뽑아야 하는데 중복 될수록 횟수가 1씩 줄어든다.
continue outer; // 새로 random하게 뽑을 수 있도록 위의 for문부터 다시 할 수 있도록 continue; 해야 한다.
}
} // end of for(j<tempArr.length)
if(i<5)
tempArr[i] = idx; // 뽑은 공의 방번호(indxe 번호)를 기억시켜둔다.
String str = (i<5)?", ":"\n";
result += ballArr[idx]+str;
} // end of for(int<6) ----------------------
System.out.println("로또 1등 당첨번호 : "+result);
Ⅳ. 버블 정렬(Bubble Sort)
-- 버블 정렬(Bubble Sort)은 정렬 대상 리스트(배열)의 항목을 수평방향으로 나열했다고 가정했을 때,
왼쪽 끝에서부터 시작해서 인접하는 두 항목의 값을 비교하여 올바른 순서(오름차순 또는 내림차순)로 되어있지 않으면
서로 위치를 교환하는 정렬방법이다.
-- 이렇게 인접하는 항목의 값을 비교해서 위치를 교환하는 과정을 리스트(배열)의 마지막 항목까지 반복해서
제일 큰(또는 작은) 값이 끝에 오도록 한다.
-- 각 회전(Pass)과정이 끝날때마다 정렬은 뒤에서부터 하나씩 완료된다.
int[] numArr = {9,7,3,5,1};
System.out.print("정렬하기전: ");
for(int i=0; i<numArr.length; i++) {
String str = (i<numArr.length-1)?", ":"";
System.out.print(numArr[i]+str);
}
▷결과
정렬하기 전 : 9, 7, 3, 5, 1
for(int i=0; i<numArr.length-1; i++) { // 추출대상 개수 ==> 배열 길이-1
for(int j=0; j<numArr.length-1-i; j++) { // 비교대상 갯수 ==> (배열길이-1) 부터 1씩 감소
if(numArr[j] > numArr[j+1]) {
int temp = numArr[j];
numArr[j] = numArr[j+1];
numArr[j+1] = temp;
}
}
}
System.out.print("오름차순 정렬한 후: ");
for(int i=0; i<numArr.length; i++) {
String str = (i<numArr.length-1)?", ":"";
System.out.print(numArr[i]+str);
}
▷결과
오름차순 정렬한 후 : 1, 3, 5, 7, 9
내림차순으로 정렬해 보자.
int[] numArr2 = {9,7,3,5,1};
System.out.println("\n=== 내림차순 정렬한 후 ===");
for(int i=0; i<numArr2.length-1; i++) {
for(int j=0; j<numArr2.length-1-i; j++) {
if(numArr2[j] < numArr2[j+1]) {
int temp = numArr2[j];
numArr2[j] = numArr2[j+1];
numArr2[j+1] = temp;
}
}
}
for(int i=0; i<numArr2.length; i++) {
String str = (i<numArr2.length-1)?", ":"";
System.out.print(numArr2[i]+str);
}
▷결과
내림차순 정렬한 후 : 9, 7, 5, 3, 1
정렬 메소드를 사용하여 오름차순으로 정렬해 보자.
int[] numArr3 = {9,7,3,5,1};
Arrays.sort(numArr3);
System.out.print("Arryas.sort()한 결과 : ");
for(int i=0; i<numArr3.length; i++) {
String str = (i<numArr3.length-1)?", ":"";
System.out.print(numArr3[i]+str);
}
▷결과
Arryas.sort()한 결과 : 1, 3, 5, 7, 9
-- Arrays.sort()로 하면 오름차순으로만 정렬이 된다.
▷▷ Arrays.sort()를 사용하여 내림차순으로 정렬해 보자.
int[] numArr4 = {9,7,3,5,1};
System.out.print("Arryas.sort()한 결과(내림차순) : ");
Arrays.sort(numArr4);
for(int i=(numArr4.length-1); i>=0; i--) {
String str = (i>0)?", ":"";
System.out.print(numArr4[i]+str);
}
Arryas.sort()한 결과(내림차순) : 9, 7, 5, 3, 1
'수업내용' 카테고리의 다른 글
[Day10][Java] 상속 / 구인구직 관리 프로그램 (0) | 2019.09.02 |
---|---|
[Day9][Java] 이차원 배열 / String 클래스 메소드 / 로또 당첨 프로그램 / Calendar / OOP(Object Oriented Programming) (0) | 2019.09.01 |
[Day7][Java] while문 / do~while문 / Math.random / equals / 가위바위보 프로그램 (0) | 2019.09.01 |
[Day6][Java] For 문제풀이 / 별 찍기 (0) | 2019.09.01 |
[Day5][Java] switch case / 반복문(for) / break / continue (0) | 2019.09.01 |