2차원 배열
- 배열 안에 배열이 존재하는 형태를 2차원 배열이라 한다.
- 실제 배열에는 배열의 주소값이 들어가게 된다.
import java.util.Arrays;
public class Array2D {
public static void main(String[] args) {
int[][] arr = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
{10, 11, 12, 13, 14}
};
System.out.println(arr.length);
System.out.println(Arrays.toString(arr[0]));
System.out.println(Arrays.toString(arr[1]));
System.out.println(Arrays.toString(arr[2]));
System.out.println(arr[2][2]);
System.out.println(arr[1][0]);
System.out.println(Arrays.deepToString(arr));
System.out.println("----------------------------------------");
//빈 2차원 배열 만들기
int[][] arr2 = new int[3][4];
System.out.println(Arrays.deepToString(arr2));
System.out.println("----------------------------------------");
//2차원 배열에 값 넣기
arr2[1][2] = 50;
arr2[2][1] = 70;
for(int[] array : arr2) {
for(int n : array) {
System.out.print(n + " ");
}
System.out.println();
}
}
}
Array2D Quiz
문제)
1. 각 학생의 평균을 소수점 첫 째 자리까지 출력
2. 각 과목의 평균을 출력
3. 반 평균 출력
public class Array2DQuiz {
public static void main(String[] args) {
int[][] score = {
{79, 80, 99}, //A학생
{95, 85, 89}, //B학생
{90, 65, 56}, //C학생
{69, 78, 77} //D학생
//과목: 3과목
};
String[] stuName = {"A학생", "B학생", "C학생", "D학생"};
String[] subName = {"국어", "영어", "수학"};
double totalAvg = 0.0; //학생들의 평균점수의 총합
//1번
int idx = 0; //stuName배열에서 학생의 이름을 꺼내올 용도로 사용할 변수
for(int[] stu : score) {
int total = 0;
for(int s : stu) {
total += s;
}
double avg = (double) total / subName.length;
totalAvg += avg;
System.out.printf("%s 평균: %.1f점\n", stuName[idx], avg);
idx++;
}
System.out.println("------------------------------------------------");
//2번
for(int i = 0; i < subName.length; i++) {
int total = 0;
for(int j = 0; j < stuName.length; j++) {
total += score[j][i];
}
double avg = (double) total / stuName.length;
System.out.printf("%s 평균점수: %.1f점\n", subName[i], avg);
}
//3번
double classAvg = totalAvg / stuName.length;
System.out.printf("우리반 평균: %.1f점\n", classAvg);
}
}
사원 관리 프로그램 제작
import java.util.Scanner;
public class EmployeeManager {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//사원의 정보: 사번, 이름, 나이, 부서명
String[] userNums = new String[100];
String[] names = new String[100];
int[] ages = new int[100];
String[] departments = new String[100];
//실제로 입력된 데이터(사원의 정보)의 개수를 체크하는 변수.
int count = 0;
while(true) {
System.out.println("\n========== 사원 관리 프로그램 ==========");
System.out.println("# 1. 사원 정보 신규 등록");
System.out.println("# 2. 모든 사원 정보 보기");
System.out.println("# 3. 사원 정보 검색");
System.out.println("# 4. 사원 정보 수정");
System.out.println("# 5. 사원 정보 삭제");
System.out.println("# 6. 프로그램 종료");
System.out.println("========================================");
System.out.print("메뉴 입력: ");
int menu = sc.nextInt();
if(menu == 1) {
//사원 정보 4가지를 입력 받아 각 배열에 저장하는 코드를 작성
//사번은 중복되면 안됨
//(무한루프를 구현해서 중복이 발생하면 다시 입력받기.)
System.out.println("# 사원 정보 등록을 시작합니다.");
System.out.print("- 사번: ");
String empNum = sc.next();
while(true) {
boolean flag = false;
for(int i = 0; i < count; i++) {
if (empNum.equals(userNums[i])) { //입력한 사번이 이미 존재하는 경우
System.out.println("사번은 중복될 수 없습니다.");
flag = true;
break;
}
}
if(!flag) { //flag -> false -> 중복 발생 x
userNums[count] = empNum;
break; //사번 확인용 무한 루프를 탈출.
} else {
System.out.print("- 사번 재입력: ");
empNum = sc.next();
}
}
System.out.print("- 이름: ");
names[count] = sc.next();
System.out.print("- 나이: ");
ages[count] = sc.nextInt();
System.out.print("- 부서명: ");
departments[count] = sc.next();
System.out.println(names[count] + "님의 정보가 정상 등록 되었습니다.");
count++;
} else if(menu == 2) {
//각 배열을 반복문으로 저장된 데이터까지만 출력.
//만약 사용자가 사원 등록을 한 명도 하지 않았다면
//"등록된 사원 정보가 없습니다."를 출력
if(count == 0) {
System.out.println("등록된 사원 정보가 없습니다.");
} else {
System.out.println("========== 전체 사원 정보 ==========");
for(int i = 0; i < count; i++) {
System.out.printf("%s %s %d세 %s\n", userNums[i], names[i], ages[i], departments[i]);
}
}
} else if(menu == 3) {
System.out.println("# 조회할 사원의 번호를 입력하세요.");
System.out.print("> ");
String empNum = sc.next();
//입력한 사번에 일치하는 사원의 4가지 정보를 모두 출력
//입력한 사번이 존재하지 않는다면 "조회한 사원의 정보가 없습니다."
int i;
for(i = 0; i < count; i++) {
if(empNum.equals(userNums[i])) {
System.out.println("========== 사원 정보 ==========");
System.out.printf("%s %10s %10d세 %10s\n", userNums[i], names[i], ages[i], departments[i]);
break;
}
}
if(i == count) {
System.out.println("조회한 사원의 정보가 없습니다.");
}
} else if(menu == 4) {
//해당 사번과 일치하는 사원의 나이와 부서를 선택적으로 변경할 수 있도록
//프로그램을 구성, 나이와 부서를 수정하는 코드를 작성
//사번 입력 -> 존재하는 사번이 맞으면 -> [1. 나이 변경 | 2. 부서 변경 | 3. 취소]
System.out.println("# 수정할 사원의 번호를 입력하세요.");
System.out.print("> ");
String empNum = sc.next();
boolean flag = false;
for(int i = 0; i < count; i++) {
if(empNum.equals(userNums[i])) {
System.out.println("# " + names[i] + "님의 정보를 변경합니다.");
System.out.println("[1. 나이 변경 | 2. 부서 변경 | 3. 취소]");
System.out.print("> ");
int sel = sc.nextInt();
switch (sel) {
case 1:
System.out.print("- 변경할 나이: ");
ages[i] = sc.nextInt();
System.out.printf("나이가 %d세로 변경 되었습니다.\n", ages[i]);
break;
case 2:
System.out.print("- 변경할 부서명: ");
departments[i] = sc.next();
System.out.print("부서가 %s로 변경 되었습니다.\n" + departments[i]);
break;
case 3:
System.out.println("- 정보 수정을 취소합니다.");
break;
default:
System.out.println("- 변경 메뉴를 잘못 입력하였습니다.");
}
flag = true;
break;
}
}
if(!flag) {
System.out.println("조회 결과 존재하는 사원의 번호가 아닙니다.");
}
} else if(menu == 5) {
//해당 사번과 일치하는 사원의 4가지 정보를 각 배열에서 모두 삭제하고
//삭제하기 전에 "삭제하겠습니까? [Y/N]" 를 입력 받아서
//y를 눌렀을 시에 삭제가 되도록 코드를 구성하시오.
//배열의 크기는 줄이지 않는다. 삭제할 인덱스를 기준으로 뒤에 있는 값을
//앞으로 한칸씩 땡기고 count를 하나 내린다.
System.out.println("# 삭제할 사원의 번호를 입력하세요.");
System.out.print("> ");
String empNum = sc.next();
boolean flag = false;
for(int i = 0; i < count; i++) {
if(empNum.equals(userNums[i])) {
System.out.println("삭제할 사원 이름: " + names[i]);
System.out.println("삭제하시겠습니까? [Y/N]");
System.out.print("> ");
String answer = sc.next();
switch (answer) {
case "Y": case "y": case "ㅛ":
for(int j = i; j < count-1; j++) {
userNums[j] = userNums[j + 1];
names[j] = names[j + 1];
ages[j] = ages[j + 1];
departments[j] = departments[j + 1];
}
count--;
System.out.println("# 삭제가 정상적으로 진행되었습니다.");
break;
case "N": case "n": case "ㅜ":
System.out.println("# 삭제를 취소합니다.");
break;
default:
System.out.println("# 잘 못 입력하였습니다.");
}
flag = true;
break;
}
}
if(!flag) {
System.out.println("# 조회한 사원 정보는 존재하지 않습니다.");
}
} else if(menu == 6) {
System.out.println("프로그램 종료");
sc.close();
break;
} else {
System.out.println("메뉴를 잘못 입력하였습니다.");
}
}
}
}
RussianRoulette
문제)
- 게임 인원은 2 ~ 4명 입니다.
- 실탄 개수는 6개 미만으로 설정
- 게임이 시작되면, 시작 인원은 랜덤으로 순서가 설정 또한 총알의 위치도 랜덤으로 설정
- 총알의 위치는 boolean 타입의 배열로 선언하여 배치
ex) [false, false, false, true, false, false]
- 정해진 룰은 없고, 한명이 사망하면 총알의 위치를 랜덤으로 바꿔서 남은 인원으로 다시 진행 원하는 규칙이 있다면 자유롭게 커스텀
import java.util.Arrays;
import java.util.Scanner;
public class RussianRoulette {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("게임 인원(2~4) --> ");
int playerNum = sc.nextInt();
if(playerNum < 2 || playerNum > 4) {
System.out.println("게임 인원이 올바르지 않습니다. 게임을 종료합니다.");
return; //main 함수 종료.
}
System.out.println("\n플레이어의 이름을 등록합니다.");
String[] players = new String[playerNum];
for(int i = 0; i < players.length; i++) {
System.out.printf("%d번 플레이어 이름: ", i + 1);
players[i] = sc.next();
}
System.out.println(Arrays.toString(players) + " 참가");
System.out.print("\n실탄 개수 (6개 미만): ");
int bullet = sc.nextInt();
if(bullet < 1 || bullet > 5) {
System.out.println("실탄 수가 올바르지 않습니다. 게임을 종료합니다.");
return;
}
System.out.println("실탄을 넣고 탄창을 무작위로 돌립니다.");
boolean[] bulletPos = new boolean[6];
int checkCount = 0; //실탄을 정확하게 장전한 횟수
while(checkCount < bullet) {
int position = (int) (Math.random() * bulletPos.length);
if(bulletPos[position]) {
continue;
} else {
bulletPos[position] = true;
checkCount++;
}
} //총알 배치 끝.
//실행 순서 정하기
int startIdx = (int) (Math.random() * playerNum);
System.out.printf("\n총을 돌렸습니다. %s부터 시작합니다.\n", players[startIdx]);
//일부러 입력 대기를 해서 흐름을 잠시 끊어준다.
//입력값을 받아서 활용하는 것이 아니기 때문에 변수를 선언하지 않는다.
sc.nextLine();
while(true) {
//최후의 1인이 남을 때 까지 게임을 진행
//또는 총알을 다 소비할 때 까지 게임을 진행
//총알을 소모하면 true값을 false로 변경
//사람이 한명 아웃되면 배열의 크기를 줄여야 한다.
int realBulletPos = (int) (Math.random() * bulletPos.length);
System.out.printf("\n\n[%s의 턴]\t탄창을 무작위로 돌립니다.\n", players[startIdx]);
System.out.println("# 엔터를 누르면 격발합니다.");
sc.nextLine();
if(bulletPos[realBulletPos] == true) { // 비교를 위해 true 사용하지만 지워서 사용하는 것이 깔끔한 코드
System.out.printf("\n탕!!!\n[%s] 사망\n", players[startIdx]);
bulletPos[realBulletPos] = false; //총알이 소모되어 false로 변경
bullet--;
playerNum--;
System.out.println("남은 총알 수: " + bullet + "개");
for(int i = startIdx; i < players.length - 1; i++) {
players[i] = players[i + 1];
}
String[] temp = new String[players.length - 1];
for(int j = 0; j < temp.length; j++) {
temp[j] = players[j];
}
players = temp;
temp = null;
System.out.println("생존 인원: " + Arrays.toString(players));
if(players.length == 1) {
System.out.println("최종 생존자: " + players[0]);
System.out.println("게임을 종료합니다.");
break;
} else if(bullet == 0) {
System.out.println("------------------------------");
System.out.println("총알이 모두 소진되었습니다.");
System.out.println("최종 생존자: " + Arrays.toString(players));
System.out.println("게임을 종료합니다.");
break;
} else {
System.out.println("남은 인원이 게임을 재개합니다.");
sc.nextLine();
}
} else {
System.out.println("살았습니다.");
startIdx++;
}
//플레이어가 생존할 때마다 startIdx의 값을 하나씩 올리고 있지만
//마지막 사람까지 생존했을 경우에 다음 차례는 첫 번째 사람으로
//인덱스를 0으로 바꿔서 배열 맨 앞사람이 순서를 가질 수 있도록 처리.
if(startIdx == playerNum) {
startIdx = 0;
}
}
}
}
댓글