본문 바로가기
국비지원/JAVA

[JAVA] 8. 배열의 활용 (입력/수정/삭제)

by cosmog 2022. 9. 29.
반응형
배열의 활용 - 입력

➰ '그만'이라는 값을 받을때까지 계속 입력을 받고 그만을 받으면 배열을 출력해준다.

  • 지금까지 배운 배열의 한계점 = 크기가 고정이다.
package day08;

import java.util.Scanner;

public class ArrayInsert {

	public static void main(String[] args) {

		//배열의 한계점 - 크기가 고정
		//입력받은 문자열을 배열에 순서대로 저장.
		Scanner scan = new Scanner(System.in);
		String[] arr = new String[100];

		int count = 0; //인덱스를 나태내는 변수 

		//"그만" 문자가 들어오기 전까지 입력
		while(true) {
			//next 공백을 기준으로 인식
			//nextLine 엔터를 기준으로 인식 
			//	- 문제: nextInt와 같은 애들이랑 사용을 못함.
			System.out.print(">");
			String menu = scan.nextLine();

			if(menu.equals("그만")) {
				break;
			}
			arr[count] = menu; // 저장
			count ++; // 인덱스 증가
		}
		//전체 배열을 출력해보면 값이 들어가지 않은 칸들은 null이 출력되기 때문에..
		//System.out.println(Arrays.toString(arr));
		//for문으로 값을 입력한 곳 까지만 출력해준다.
		String str = "[";
		for(int i = 0; i< count; i++) {
			str += arr[i];

			if(i == count-1) {//마지막 문자열
				str += "]";
				break;
			}
			str += ", ";
		}
		System.out.println(str);

		scan.close();
	}

}
배열의 활용 - 수정

➰ 배열값의 수정

import java.util.Scanner;

public class ArrayUpdate {
	
	public static void main(String[] args) {
		
		//배열값의 수정
		//탐색 -> 변경 -> 결과출력
		
		Scanner scan = new Scanner(System.in);
		
		String[] arr = {"어피치", "라이언", "제이지", "네오", "무지", "튜브"};
		
		System.out.print("찾을 이름>");
		String name = scan.next();
		
		boolean flag = false; // 
		for(int i = 0; i < arr.length; i++) {
			if(name.equals(arr[i])) { //같은 값이 있다면

				System.out.print("바꿔줄 이름>");
				String n = scan.next();
				arr[i] = n; //수정
				flag = true;
				
			}
		}
		
		if(flag) {
			System.out.println("별명이 수정되었습니다.");
		}else {
			System.out.println("별명이 존재하지 않습니다.");
		}
		
		scan.close();
	}

}
배열의 활용 - 삭제

➰ 배열의 삭제

  • 배열에서 삭제의 개념은 없다. 이유 = 고정배열이기 때문이다.
  • 삭제를 한것이 아니라 기본값(초기화)값으로 치환하는 것과 같다.
  • 삭제되는것 처럼 보여주게 할 수는 있다.
import java.util.Scanner;

public class ArrayDelete {
	
	public static void main(String[] args) {
		
		//배열에서 삭제 개념은 없습니다.
		
		/* int 배열 delete 작업 */
		/*
		int[] arr = {1,2,3,4,5,6,7,8,9,10};
		// 만약 5의 값을 삭제한다 라는 작업을 한다면 0으로 바꾸고 0을 출력을 안한다는가...
		// 뒤쪽에 있는 값들을 앞쪽으로 당겨오는 작업을 해준다.
		
		
		//4번째 인덱스에 있는 값을 삭제 하는 작업 예시
		for(int i = 4; i < arr.length-1 ; i++) {
			arr[i] = arr[i+1];
		}
		
		//[1,2,3,4,6,7,8,9,10,10]으로 변경된다. 
		System.out.println(Arrays.toString(arr));
		*/
		
		/* String배열 delete 작업 */
		Scanner scan = new Scanner(System.in);
		
		String[] arr = {"어피치", "라이언", "제이지", "네오", "무지", "튜브"};
		
		System.out.print("삭제할 이름>");
		String name = scan.next();
		
		int count = arr.length; //삭제가 일어났을 때 하나씩 감소.
		
		for(int i = 0; i < count; i++) {
			
			if(name.equals(arr[i])) {//이름값이 같다면 삭제 작업
				for(int j = i; j < count-1; j++) {
					arr[j] = arr[j+1]; // 찾은 위치에서 뒤 원소를 당김.
				}
				count --;
			}
		}
		
		//아래와 같이 출력하여 삭제된것 처럼 보여지게 할 수 있다. 사실은 제일 마지막 값은 중복으로 남아있음.
		String str = "[";
		for(int i = 0; i < count; i++) {
			str += arr[i];
			if(i == count - 1) {
				str+="]";
				break;
			}
			str += ", ";
		}
		
		System.out.println(str);
		scan.close();
	}

}

➰ Quiz - 입력받은 수만큼의 배열에 좌석을 배정하고 예약하는 프로그램

  • 내가 짠거
import java.util.Scanner;

public class Quiz19 {

	public static void main(String[] args) {

		/*
		 * 1. 사람수(정수)를 입력을 받습니다.
		 * 2. 입력받은 사람수 만큼 랜덤한 배열을 생성해서 중복되지 않게 랜덤값을 저장.
		 * 
		 * 램덤값의 크기는 1 <= x <=사람수
		 * 
		 * 3. 중복되지 않는 배열이 생성 되었다면, ○문자를 이용해서 배열의 크기를 출력.
		 * 4. 스캐너를 통해서 랜덤으로 배정된 좌석을 선택할 수 있습니다.
		 * 5. 제대로 선택된 좌석이면 자리번호를 공개하고 출력.
		 * 6. 제대로 선택되지 않은 좌석이면 다시 선택을 출력.
		 */

		Scanner scan = new Scanner(System.in);
		//입력한 숫자만큼 배열을 생성
		System.out.print("배정할 좌석의 크기를 지정하세요>");
		int num = scan.nextInt();
		int[] random_arr = new int[num];

		//중복된 숫자 없이 랜덤값 입력
		for(int i = 0; i < random_arr.length; i++) { // 배열을 for문으로 돌면서
			random_arr[i] = (int)(Math.random()*num)+1; // 랜덤한 값을 생성

			//중복제거
			for(int j = 0; j < i; j++) { // 현재 입력된 배열의 크기만큼 돌면서 같은 값이 있는지 확인.
				if(random_arr[i] == random_arr[j]) { // 같다면
					i--; // i를 -- 시켜 중복값이 입력된 배열에 다른 랜덤값을 덮어쓰도록 함.
					break;
				}
			}
		}
		//System.out.println(Arrays.toString(random_arr));
		
		//좌석 현황 ○로 초기화 작업
		String[] select_arr = new String[num];
		for(int i = 0; i < select_arr.length; i++) {
			select_arr[i] = "○";
		}
		
		while(true) {
			System.out.println("---------------좌석 선택 프로그램------------------");
			
			//좌석 번호 출력
			for(int i = 1; i <= num; i++) {
				System.out.print(i+" ");
			}
			System.out.println();
			
			// 남은 좌석 현황 출력
			for(int i = 0; i < select_arr.length; i++) {
				System.out.print(select_arr[i] + " ");
			}
			System.out.println();
			
			//좌석 선택
			System.out.print("좌석 선택>");
			int select = scan.nextInt();
			
			if(select == 0) {
				System.out.println("프로그램 종료");
				break;
			}
			
			if(select_arr[select-1].equals("●")) {
				System.out.println("이미 예약된 좌석입니다.");
			}else {
				select_arr[select-1] = "●";
				System.out.println("자리번호를 공개합니다:" + random_arr[select-1]);
			}
		}

		scan.close();
	}

}
  • 강사님이 짠거
import java.util.Arrays;
import java.util.Scanner;

public class Quiz19_ {

	public static void main(String[] args) {

		Scanner scan = new Scanner(System.in);

		System.out.print("좌석>");
		int size = scan.nextInt();

		int[] arr = new int[size];

		//재미있는생각으로...> 1-받을수까지 그냥 배열을 섞으면 중복없이 가능.
		int index = 0; // 현재 위치변수
		start:while(true) {
			int seat = (int)(Math.random()*size)+1; //1~size까지의 랜덤수

			for(int i = 0; i < index; i++) {
				if(arr[i] == seat) continue start;
			}

			arr[index] = seat;
			index++;

			if(index == size) break; 
		}
		System.out.println(Arrays.toString(arr));

		int count = 0;
		//좌석 출력
		while(true) {

			for(int i = 0; i < arr.length; i++) {
				System.out.printf("%-3d", i+1); // %-3d = 3자리 공간을 잡고 왼쪽부터 채움
			}
			System.out.println();

			for(int i = 0; i < arr.length; i++) {
				if(arr[i] == 0) {
					System.out.printf("%-3s", "●");
				}else {
					System.out.printf("%-3s", "○");
				}
			}
			System.out.println();

			System.out.println("좌석 선택>");
			int seat = scan.nextInt();

			if(arr[seat-1] == 0) {
				System.out.println("제대로 선택하십시오.");
			}else {		
				System.out.println("선택좌석:" + arr[seat-1]);
				arr[seat-1] = 0;
				count++;
			}
			
			if(count == size) {
				System.out.println("종료합니다.");
				break;
			}

		}

		scan.close();
	}

}

💡 수가 많아지만 O와 숫자 간격이 맞지 않는데 printf를 사용하여 맞춰 줄수 있다 %-3d와 %-3s를 사용하여 간격을 맞춰주었다.

반응형