열심히 끝까지

[코딩 문제] - 6/23 강사님 문제 본문

디바이스 융합 자바(Java)기반 풀스택 개발자 양성과정(과제)

[코딩 문제] - 6/23 강사님 문제

노유림 2022. 6. 23. 19:38

-------------강사님 문제
ArrayList al 생성
al에 데이터 넣어주세요!
1~9까지 랜덤으로 값 생성
생성된 값 중에서 홀수인 것만 al에 저장
al의 요소의 개수가 5개가 되면 종료
종료되면 저장된 값 출력하고
저장된 값들의 총합 출력
나누기 2 까지 해주세요~

package class01;
import java.util.ArrayList;
import java.util.Random;
public class Test02 {
	public static void main(String[] args) {
		Random rand = new Random(); // 랜덤으로 숫자 생성
		ArrayList al = new ArrayList();
		int i = 0; // al의 배열 인덱스 지정
		int sum = 0;
		while(al.size() < 5) { // al.size가 5가 넘으면 종료
			int a = rand.nextInt(9) + 1; // 1~9까지의 랜덤 숫자
			if(a%2==1) { // a가 홀수면
				al.add(i, a); // i번째 항에 a 저장
				i++; // i를 늘려 다음에 저장
			}
		}
		System.out.println(al);
		for(int a = 0; a < al.size(); a++) {
			sum += (int)al.get(a);
		}
		System.out.println("sum : " + sum);
		System.out.println("sum/2 : " + sum*1.0/2);
	}
}

---------------강사님 해결코드

package class01;
import java.util.ArrayList;
import java.util.Random;
public class Test021 {
	public static void main(String[] args) {
		ArrayList al = new ArrayList();
		Random random = new Random();
		while(al.size() < 5) {
			int num = random.nextInt(9)+1;
			if(num%2==1) {
				al.add(num);
			}
		}
		System.out.println(al);
		int sum = 0;
		for(int i = 0; i < al.size(); i++) {
			sum += (int)al.get(i);
			// 메서드를 쓸 때는 자료형을 잘 봐야한다!
			// object에 맘대로 int를 넣은거다! 
			// input이 object이기에 output도 object다
			// 객체를 연산자? 불가능하다! 그렇기에 강제 형변환을 사용한다!
		}
		System.out.println("sum = " + sum);
		double res = sum*1.0/2;
		System.out.println("sum/2 = " + res);
	}
}

※ 여기서 주의깊게 볼 것
   > for가 아니라 while
   > 자료형 ArrayList는 int가 아닌 object로 받는다.(형변환 필요)

 

 

-----------강사님 문제
Drink //음료클래스
  name //이름
  price //가격
  cnt // 재고

void use() // 사용자가 사용(구매 완료)
     boolean check() -> 구매가 가능할 지 안될지
Drink("콜라", 900, 10);
Drink("사이다",  800); // 이렇게 되면 사이다 재고 0
syso(Drink 객체);
  -> 콜라 900[10] 라고 출력

main()
  좋아하는 음료 객체 3개 저장한 ArrayList data 만들 것
  1. 메뉴 출력(누르면)(자판기 개념)
  2. 입력 ex ) 1. 콜라, 2. 사이다 3. 웰치스 -> 꺼내서 제공
             => 필요하다고 생각되는 유효성 검사 진행 (2개)
  3. 종료

--------작성

package class04;
import java.util.ArrayList;
import java.util.Scanner;
class Drink{
	String name; // 음료 이름
	int price; // 음료 가격
	int cnt; // 음료 재고
	void use() { // 사용자가 사용(구매)
		check();
		if(!this.check()) {
			System.out.println("재고가 없습니다.");
			System.out.println();
			return;
		}
		this.cnt--; // 재고 감소
		System.out.println(this.name + "구매가 완료되었습니다. 남은 재고 : " + this.cnt);
		System.out.println();
	}
	Drink(String name, int price){ // 이름, 가격, 디폴트(0)
		this(name, price, 0);
	}
	Drink(String name, int price, int cnt){ // 이름, 가격, 재고 기입
		this.name = name;
		this.price = price;
		this.cnt = cnt;
	}
	boolean check() { // 만약 cnt == 0 return false
		if(this.cnt == 0) {
			return false;
		}
		return true;
	}
	@Override
	public String toString() {
		String msg = this.name +" ";
		msg += this.price +"[";
		msg += this.cnt + "]";
		return msg;
	}
}
public class Test031 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		ArrayList<Drink> data = new ArrayList<Drink>(); // 음료 객체 저장하는 ArrayList data
		data.add(new Drink("콜라", 900, 8));
		data.add(new Drink("스프라이트", 900));
		data.add(new Drink("실론티", 800, 4));
		while(true) {
			System.out.println("1. 메뉴 출력");
			System.out.println("2. 입력");
			System.out.println("3. 종료");
			System.out.println();
			System.out.print("번호 입력 : ");
			int in = sc.nextInt(); // 입력
			if(in < 1 || 3 < in) { // 유효성 검사
				System.out.println("잘못된 입력입니다.");
				continue;
			}
			else if(in == 1) { // 메뉴 출력
				for(int i = 0; i < data.size(); i++) { // data의 크기만큼 출력
					System.out.println(i+1 + ". " + data.get(i)); // 정보 출력
				}
				System.out.println();
			}
			else if(in == 2) {
				System.out.print("음료 선택 : ");
				int select = sc.nextInt(); // 구매할 음료 선택 숫자
				if(select < 1 || data.size() < select) { // 1보다 작거나 데이터 크기값보다 크면 
					// 유효성 검사
					System.out.println("1부터 " + data.size() + "의 숫자를 입력하세요.");
					continue;
				}
				else { // 입력받은 숫자의 -1(인덱스 값)을 해 다음 음료 출력
					data.get(select-1).use();
				}
			}
			else {
				break;
			}
		}	
	}
}

---------강사님 방법

package class01;
import java.util.ArrayList;
import java.util.Scanner;
class Drink{
	String name;
	int price;
	int cnt;
	void use(){
		if(!this.check()) {
			System.out.println(this.name + "재고없음!");
			return;
		}
		this.cnt--;
		System.out.println(this.name + "구매완료");
	}
	boolean check() {
		if(this.cnt>0) {
			return true;
		}
		return false;
	}
	Drink(String name, int price){
		this(name, price, 0);
	}
	Drink(String name, int price, int cnt){
		this.name = name;
		this.price = price;
		this.cnt = cnt;
	}
	@Override
	public String toString() {
		return this.name + " " + this.price + "원 [" + this.cnt + "]";
	}
}
public class Test04 {
	public static void main(String[] args) {
		ArrayList<Drink> data = new ArrayList<Drink>();
		data.add(new Drink("콜라", 900, 10));
		data.add(new Drink("사이다", 800));
		data.add(new Drink("웰치스", 1200, 2));
		System.out.println(data);
		Scanner sc = new Scanner(System.in);
		while(true) {
			System.out.println("1. 메뉴출력 2. 메뉴입력 3. 종료");
			System.out.print("입력 : ");
			int act = sc.nextInt();
			if(act==1) {
				for(int i = 0; i < data.size(); i++) {
					System.out.println((i+1)+"번 메뉴 : " + data.get(i));
				}
			}
			else if(act==2) {
				int menu;
				while(true) {
					System.out.print("메뉴입력 : ");
					menu = sc.nextInt();
					if(0<menu && menu<=data.size()) {
						break;
					}
					System.out.println("없는 메뉴 번호입니다! 확인 후 입력해주세요1");
				}
				data.get(menu-1).use();
			}
			else if(act==3) {
				System.out.println("프로그램 종료...");
				break;
			}
			else {
				System.out.println("잘못된 act 입력입니다!");
			}
		}
	}
}

--------강사님 방법 - String 입력

package class01;
import java.util.ArrayList;
import java.util.Scanner;
class Drink{
	String name;
	int price;
	int cnt;
	void use(){
		if(!this.check()) {
			System.out.println(this.name + "재고없음!");
			return;
		}
		this.cnt--;
		System.out.println(this.name + "구매완료");
	}
	boolean check() {
		if(this.cnt>0) {
			return true;
		}
		return false;
	}
	Drink(String name, int price){
		this(name, price, 0);
	}
	Drink(String name, int price, int cnt){
		this.name = name;
		this.price = price;
		this.cnt = cnt;
	}
	@Override
	public String toString() {
		return this.name + " " + this.price + "원 [" + this.cnt + "]";
	}
	@Override
	public boolean equals(Object obj) {
		if(this.name.equals(obj)) {
			return true;
		}
		return false;
	}
}
public class Test04 {
	public static void main(String[] args) {
		ArrayList<Drink> data = new ArrayList<Drink>();
		data.add(new Drink("콜라", 900, 10));
		data.add(new Drink("사이다", 800));
		data.add(new Drink("웰치스", 1200, 2));
		System.out.println(data);
		Scanner sc = new Scanner(System.in);
		while(true) {
			System.out.println("1. 메뉴출력 2. 메뉴입력 3. 종료");
			System.out.print("입력 : ");
			int act = sc.nextInt();
			if(act==1) {
				for(int i = 0; i < data.size(); i++) {
					System.out.println((i+1)+"번 메뉴 : " + data.get(i));
				}
			}
			else if(act==2) {
				System.out.print("메뉴입력 : ");
				String name = sc.next();
				boolean flag = true; // 제품이 없는 상태 T | 있는 상태 F
				for(int i = 0; i < data.size(); i++) {
					if(data.get(i).equals(name)) {
						data.get(i).use();
						flag = false;
					}
				}
				if(flag) {
					System.out.println(name + "는(은) 없습니다.");
				}
			}
			else if(act==3) {
				System.out.println("프로그램 종료...");
				break;
			}
			else {
				System.out.println("잘못된 act 입력입니다!");
			}
		}
	}
}

act==2 의 다른 방법(클래스의 .equals() 오버라이딩 안쓰는 것)

for(int i = 0; i < data.size(); i++) {
	if(name.equals(data.get(i).name)) {
		data.get(i).use();
	}
}

  

---간단한 문제
1~10까지 랜덤 숫자 생성
7개 생성 중복 안되게

package class06;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
public class Test051 {
	public static void main(String[] args) {
		Random random = new Random();
		Set<Integer> s = new HashSet<Integer>();
		int i = 0;
		while(s.size() < 7) {
			int num = random.nextInt(10)+1;
			s.add(num);
			i++;
		}
		System.out.println(s);
		System.out.println("반복한 횟수 : " + i);
	}
}

---------강사님 풀이

package class06;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
public class Test06 {
	public static void main(String[] args) {
		Random r = new Random();
		Set<Integer> set = new HashSet<Integer>();
		while(set.size()<7) {
			int num = r.nextInt(10)+1;
			set.add(num);
		}
		System.out.println(set);
	}
}

 

------강사님 문제

Student
  name 
  score
  Student("홍길동"); 
            -> 홍길동
            -> 0~100 랜덤
  => 홍길동 90점

main()
학생부 => Map을 활용할 예정!
1001번부터 순서대로 번호 부여
1001 
1003
1004 번호 유지
1) 추가 C   무한하게 제공
     추가할 학생의 이름을 입력하세요
2) 출력 R 
3) 삭제 D
     같은 이름의 학생이 존재할 수 있다
     삭제할 학생의 번호를 입력하세요!
4) 종료

package class07;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.Scanner;
class Student{ // 학생 클래스
	Random rand = new Random();
	String name; // 학생 이름
	int score; // 학생 점수
	Student(String name){
		this.name = name;
		this.score = rand.nextInt(100)+1; // 학생 점수를 랜덤으로 받기 1 ~ 100 점
	}
	@Override
	public String toString() { // 오버라이딩으로 msg 값 돌려주기
		String msg = this.name + " ";
		msg += this.score + "점";
		return msg;
	}
}
public class Test09 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		Map<Integer, Student> map = new HashMap<Integer, Student>();
		int num = 1001;
		while(true) {
			System.out.println("===학생부===");
			System.out.println("1) 추가");
			System.out.println("2) 출력");
			System.out.println("3) 삭제");
			System.out.println("4) 종료");
			System.out.print("이용할 서비스 번호 입력 : ");
			int button = sc.nextInt();
			if(button == 1) { // 버튼으로 1이 눌리면 학생 추가
				System.out.println("===학생 추가===");
				System.out.print("추가할 학생의 이름을 입력하세요 : ");
				String name = sc.next();
				map.put(num, new Student(name)); // map에 학생 이름과 번호 저장
				System.out.println(num + "에 입력완료!");
				num++; // 한명씩 저장될 수록 번호 늘리기
			}
			else if(button == 2) { // 2가 눌리면 학생부 출력
				if(map.isEmpty()) { // 만약 최초 번호인 인덱스에 저장된 값이 없는 경우
					System.out.println("등록된 학생이 없습니다.");
					continue;
				}
				System.out.println("===학생부 출력===");
				System.out.println(map); // 학생부 번호와 학생이름, 점수 출력
				System.out.print("찾고싶은 학생 번호 입력! : ");
				int find = sc.nextInt();
				System.out.println(map.get(find));
			}
			else if(button == 3) { // 3이 눌리면 학생 삭제
				if(map.isEmpty()) { // 만약 최초 번호인 인덱스에 저장된 값이 없는 경우
					System.out.println("삭제할 학생이 없습니다.");
					continue;
				}
				System.out.println("===학생 삭제===");
				int delete;
				while(true) {
					System.out.println(map);
					System.out.print("삭제할 학생의 번호를 입력하세요. : ");
					delete = sc.nextInt();
					if(map.get(delete) == null) { // 1001번보다 작거나 num의 숫자보다 큰 경우
						System.out.println("존재하지 않는 번호입니다.");
						continue;
					}
					break;
				}
				map.remove(delete);// 삭제하는 방법
				System.out.println("삭제했습니다.");
				System.out.println("===삭제 후 학생부===");
				System.out.println(map);
			}
			else if(button == 4) { // 4를 입력하면 프로그램 종료
				System.out.print("===학생부 프로그램을 종료합니다.===");
				break;
			}
			else { // 다른 번호를 입력하면 다시 입력
				System.out.println("잘못된 입력입니다. 다시 입력하세요");
				continue;
			}
		} // while문 종료
	}
}

--------강사님 코딩

package class01;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.Scanner;
class Student{
	private String name;
	private int score;
	// 죽어도 멤버변수에 접근해야한다? 그때 getter setter!!
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getScore() {
		return score;
	}
	public void setScore(int score) {
		this.score = score;
	}
	Student(String name){
		this.name = name;
		Random random = new Random();
		this.score = random.nextInt(101); // 0~100
		System.out.println(this.name + "학생 " + this.score + "점으로 등록되었습니다.");
	}
	@Override
	public String toString() {
		return name + "학생 " + score + "점"; 
	}
}
public class Test01 {
	public static void main(String[] args) {
		Map<Integer, Student> data = new HashMap<Integer, Student>();
		final int PK_START = 1001; // 의미를 갖는 수
		// final 키워드 PK_START 값을 변경하지 못하게 막는다 == "상수화"
		final int PK_MAX = 2000;
		int PK = PK_START; // 1001번 보다 더 완벽하게 하는 방법
		// PK는 무조건 프로그램이 부여 
		// 사람이 만드는 PK = ID -> 중복확인
		// 유일하게 만들어야 하기 때문에 중복확인이 들어간다!
		Scanner sc = new Scanner(System.in);
		while(true) {
			System.out.println();
			System.out.println("1.등록 2.출력 3.삭제 4.종료");
			System.out.print("입력) ");
			int act = sc.nextInt();
			if(act==1) {
				// 추가할 학생의 이름을 입력하세요
				// 사용자가 학생이름 입력
				// 학생 객체를 생성
				// 생성한 객체 map에 저장
				System.out.print("학생 이름 입력 ) ");
				String name = sc.next();
				data.put(PK,  new Student(name));
				// data.get(PK).score = 100; // << 이 것이 가능해진다...ㅠㅠ
				// 지금처럼 멤버변수로 직접 접근하는 것을 막아둔다! class에 멤버변수에 private 건다!
				// 멤버변수를 hiding(private) 했는데 main에 줄이 그어진다? 그러면 문제가 있다는 뜻!
				PK++;
			}
			else if(act==2) {
				if(data.size()==0) {
					System.out.println("저장된 데이터가 없습니다!");
					continue;
				}
				for(int i = PK_START; i < PK; i++) { // 초기값 1001을 쓰면 
					Student stu = data.get(i);
					if(stu==null) { // 없으면 아래로 내려가게 반환!
						continue;
					}
					System.out.println(i + "번 : " + data.get(i));
					// 없는 값을 반환하려고 하면 null값이 반환된다
					// data.get(i)
				}
			}
			else if(act==3) {
				if(data.size()==0) {
					System.out.println("저장된 데이터가 없습니다!");
					continue;
				}
				System.out.print("삭제할 번호 입력) ");
				int key = sc.nextInt();
				/*
				if(data.containsKey(key)) { 
					// 만약 이 메서드가 있었다는 것을 알았다면...
					// 임시변수 필요 없고 간략한 코딩 가능
					// 어떤 메서드가 있는지 
					System.out.println("번호를 다시 확인하시고 입력해주세요!");
					continue;
				}
				*/
				if(key<PK_START || PK_MAX < key) { // 
					System.out.println("번호를 다시 확인하시고 입력해주세요!");
					continue;
				}
				Student stu = data.remove(key); // 삭제한 값을 잠깐(일시적) 저장 후 출력
				System.out.println("로깅기법 확인 : " + stu); // 데이터 삭제(key값 받아서 삭제)
				// remove값은 학생... 없으면 null값 출력
				// 출력 문구로 확인 로깅..
				// 로그 기법(로그를 찍어낼 수 있어야 한다!) 궁금한 값을 찍어서 보는 것(콘솔 확인)
				// ★ 로그를 보여주면서
				// >> 에러 원인 분석, 에러원인 찾고, 해결방안 설명하기
				// 로그를 띄우면서 이미 null을 삭제했기 때문에 다음 턴에서 못본다
				if(stu == null) { // key값에 대한 학생이 없다면
					System.out.println("존재하지 않는 학생번호입니다.");
					continue;
				}
				System.out.println(stu + "삭제완료!");
				// 1. 삭제 실패했을 때 멘트 해결!
				// 2. 삭제성공 이후에 null 출력 해결!
			}
			else if(act==4) {
				System.out.println("프로그램 종료...");
				break;
			}
			else {
				System.out.println("다시 입력해주세요.");
			}
		}
	}
}