본문 바로가기
Programming Language/Java

[국비] Java 내용정리 Day07

by tpleehan 2021. 11. 3.

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;
			}			
		}		
	}
}​

'Programming Language > Java' 카테고리의 다른 글

[국비] Java 내용정리 Day09  (0) 2021.11.06
[국비] Java 내용정리 Day08  (0) 2021.11.05
[국비] Java 내용정리 Day06  (0) 2021.11.01
[국비] Java 내용정리 Day05  (0) 2021.10.29
[국비] Java 내용정리 Day04  (0) 2021.10.29

댓글