### 주제 + 실전 프로그래밍 연습 ### 목표 + 프로그래밍을 통한 실전적 문제 해결능력 향상 + 객체지향적 분석 및 설계 능력 향상 ### 커리큘럼 + 01: 헬로 월드 + 02: 자기 소개 하기 + ... ### 대상 + 자바 입문 단계를 넘어 초급 단계 진입을 희망하는 학생 또는 신입 개발자 ### 시간 및 장소 + 협의 ### 연락처 + 카톡: chaesam + 이멜: [email protected]
# 헬로월드 ## 문제 콘솔창에 "Hello world!" 문자열을 출력해주세요. ## 출력 예 ``` Hello world! ``` ### Step 1: 클래스 생성 이클립스를 실행하고 클래스를 작성합니다. ``` // 클래스 생성 public class Hello { } ``` ### Step 2: main 메소드 추가 프로그램의 시작점이 되는 main 메소드를 클래스 내부에 추가합니다. ``` // 클래스 생성 public class Hello { // 메인 메소드 추가 public static void main(String[] args) { } } ``` ### Step 3: 문자열 출력 println() 메소드를 사용하여 문자열을 출력 합니다. ``` // 클래스 생성 public class Hello { // 메인 메소드 추가 public static void main(String[] args) { // 문자열 출력 System.out.println("Hello world!"); } } ```
# 자기소개 하기 ## 문제 간단한 자기소개를 3줄에 걸쳐서 출력해주세요 ## 출력 예 ``` 안녕하세요 반갑습니다. 저는 열혈 청년 홍길동 입니다. 잘 부탁드리겠습니다! ``` ### Step 1: 클래스 생성 ``` // 클래스 생성 public class SelfIntroduction { } ``` ### Step 2: 메인 메소드 추가 클래스 내부에 메인 메소드를 추가 합니다. ``` // 클래스 생성 public class SelfIntroduction { // 메인 메소드 추가 public static void main(String[] args) { } } ``` ### Step 3: 문자열 출력 println() 메소드를 3번 사용하여 자기소개를 작성합니다. ``` // 클래스 생성 public class SelfIntroduction { // 메인 메소드 추가 public static void main(String[] args) { System.out.println("안녕하세요 반갑습니다."); System.out.println("저는 열혈 청년 홍길동 입니다."); System.out.println("잘 부탁 드립니다~"); } } ```
# 프로필 만들기 ## 문제 기본적인 타입과 변수 연산자를 사용하여 아래와 같은 프로필을 출력해주세요. ## 출력 예 ``` 이름: 홍길동 학번: 2018122104 신장: 1.78m 남자인가요? true ``` ### Step 1: 클래스 및 메인 메소드 생성 ``` // 클래스 public class Profile { // main public static void main(String[] args) { } } ``` ### Step 2: 변수 생성 및 값 대입 ``` // 클래스 public class Profile { // main public static void main(String[] args) { // 변수 생성 및 값 대입 String name = "홍길동"; int studentNumber = 2018122104; double tall = 1.78; boolean isMale = true; } } ``` ### Step 3: 문자열 출력 ``` // 클래스 public class Profile { // main public static void main(String[] args) { // 변수 생성 및 값 대입 String name = "홍길동"; int studentNumber = 2018122104; double tall = 1.78; boolean isMale = true; // 문자열 출력 System.out.println("이름: " + name); System.out.println("학번: " + studentNumber); System.out.println("신장: " + tall + "m"); System.out.println("남자인가요?" + isMale); } } ```
# 쇼핑 리스트 출력하기 ## 문제 printf() 메소드를 사용하여, 쇼핑 리스트를 깔끔하게 출력해봅시다. ## 참고자료 + 구글링: https://goo.gl/DXijnp ## 출력 예 ``` 품명: 한우 꽃등심 가격: 112500 품명: 참치 선물팩 가격: 25500 품명: 맥스봉 한팩 가격: 500 ``` ### Step 1: 클래스 및 메인 메소드 생성 ``` public class ShoppingList { public static void main(String[] args) { } } ``` ### Step 2: 변수 생성 및 출력 ``` public class ShoppingList { public static void main(String[] args) { // 변수 생성 String item1 = "한우 꽃등심"; int price1 = 112500; String item2 = "참치 선물팩"; int price2 = 25500; String item3 = "맥스봉 한팩"; int price3 = 500; // 형식에 따른 출력! System.out.printf("품명: %-10s 가격: %8d\n", item1, price1); System.out.printf("품명: %-10s 가격: %8d\n", item2, price2); System.out.printf("품명: %-10s 가격: %8d\n", item3, price3); } } ```
# 밥값 계산하기 ## 문제 돈까스 16인분, 칼국수 8인분, 왕만두 1인분을 시켰을때, 계산서를 출력 예와 같이 작성해 주세요. 가격표는 아래와 같습니다. + 돈까스: 8000원 + 칼국수: 6000원 + 왕만두: 5000원 ## 출력 예 ``` 돈가스 x 16 = 128000 칼국수 x 8 = 80000 왕만두 x 1 = 5000 =================== 총합: 213000 ``` ## 참고자료 + 구글링: https://goo.gl/DXijnp ### Step 1: 클래스 및 메인 메소드 생성 ``` public class BobGap { public static void main(String[] args) { } } ``` ### Step 2: 변수 생성 및 값 대입 ``` public class BobGap { public static void main(String[] args) { int donPrice = 8000; // 돈가스 가격 int kalPrice = 10000; // 칼국수 int kingPrice = 5000; // 왕만두 int donNumber = 16; // 돈가스 수량 int kalNumber = 8; // 칼국수 int kingNumber = 1; // 왕만두 } } ``` ### Step 3: printf() 메소드를 활용한 출력 ``` public class BobGap { public static void main(String[] args) { int donPrice = 8000; int kalPrice = 10000; int kingPrice = 5000; int donNumber = 16; int kalNumber = 8; int kingNumber = 1; // 결과 출력 System.out.printf("%s x %2d = %6d\n", "돈가스", donNumber, donPrice * donNumber); System.out.printf("%s x %2d = %6d\n", "칼국수", kalNumber, kalPrice * kalNumber); System.out.printf("%s x %2d = %6d\n", "왕만두", kingNumber, kingPrice * kingNumber); System.out.println("==================="); int sum = donPrice * donNumber + kalPrice * kalNumber + kingPrice * kingNumber; System.out.printf("%s: %d\n", "총합", sum); } } ```
# 급여 계산기 ## 문제 시급과 일한 시간을 입력받아 총 급여를 계산하는 프로그램을 만들어주세요 ## 입력 예 ``` // 시급, 일한시간 순 입력 8000 160 ``` ## 출력 예 ``` 1280000 ``` ## 참고자료 + 구글링: https://goo.gl/yxM6wX ### Step 1: 클래스와 메인 메소드 생성 ``` // 클래스 public class Alba { // 메인 메소드 public static void main(String[] args) { } } ``` ### Step 2: 키보드로부터 입력을 받기 위해 스캐너 변수 생성 ``` import java.util.Scanner; // 스캐너를 사용하기 위해 반드시 import 해야함. // 클래스 public class Alba { // 메인 메소드 public static void main(String[] args) { // 키보드로부터 입력받기 위한 변수 생성 Scanner input = new Scanner(System.in); } } ``` ### Step 3: 키보드로부터 시급과 일한 시간을 입력받아 급여를 계산 후 출력 ``` import java.util.Scanner; // 스캐너를 사용하기 위해 반드시 import 해야함. // 클래스 public class Alba { // 메인 메소드 public static void main(String[] args) { // 키보드로부터 입력받기 위한 변수 생성 Scanner input = new Scanner(System.in); // 키보드로부터 정수값을 입력받아 시급에 대입 int basePay = input.nextInt(); // 키보드로부터 정수값을 입력받아 일한 시간에 대입 int workingHours = input.nextInt(); // 급여 = 시급 * 일한시간 int pay = basePay * workingHours; // 출력 System.out.println(pay); } } ```
# 환전하기 ## 문제 N유로 M달러를 입력받아 원화로 환전한 결과를 출력해주세요. 환전 결과는 아래의 환율에 따라 결정되며, 소수점 이하의 자리수는 버립니다. + 1 유로 = 1320.48026 원 + 1 달러 = 1063.82979 원 ## 입력 예 ``` // 유로, 달러 순 입력 58 32 ``` ## 출력 예 ``` 58유로 + 32달러 = 109268 원 ``` ## 참고자료 + 구글링: https://goo.gl/DXijnp ### Step 1: 클래스 및 메인메소드 생성 ``` public class HwanJun { public static void main(String[] args) { } } ``` ### Step 2: 키보드로부터 두 값을 입력 받음 ``` import java.util.Scanner; // 키보드로부터 입력을 받기위해 반드시 추가 public class HwanJun { public static void main(String[] args) { // 키보드로부터 입력을 받음 Scanner input = new Scanner(System.in); int euro = input.nextInt(); int dollar = input.nextInt(); } } ``` ### Step 3: 환율 정보를 토대로 결과 계산 및 출력 ``` import java.util.Scanner; public class HwanJun { public static void main(String[] args) { // 키보드로부터 입력을 받음 Scanner input = new Scanner(System.in); int euro = input.nextInt(); int dollar = input.nextInt(); // 환율 변수 생성 double eurRate = 1320.48026; double dallarRate = 1063.82979; // 환전 하기 및 출력 int won = (int)(euro * eurRate + dollar * dallarRate); System.out.println("58유로 + 32달러 = "+ won +" 원"); } } ```
# 각 자리수의 합 ## 문제 세자리의 정수 N (100~999)을 표현하는 각 자리의 숫자들의 합을 구하는 프로그램을 작성하세요. + [예] 932 정수의 각 자리 숫자들의 합계는 14 ( = 9 + 3 + 2) ## 입력 예 ``` 474 ``` ## 출력 예 ``` 15 ``` ## 힌트 `%`연산자와 `/`연산자를 활용하세요. ``` 932 % 10 = 2 932 / 10 = 93 ```
# 자유낙하 물체의 고도 구하기 ## 문제 1000 미터 높이에서 가만히 떨어뜨린 자유낙하하는 물체의 t 초 후 고도를 구하는 프로그램을 제공되는 코드를 활용하여 작성해주세요. (등가속운동을 하는 물체의 이동거리 공식을 이용할 것) ![Imgur](https://i.imgur.com/j3i1UeD.png) ## 뼈대 코드 ``` import java.util.Scanner; public class GravityCalculator { public static void main(String[] arguments) { // 키보드로부터 입력받기 위한 변수 Scanner input = new Scanner(System.in); // 중력 가속도 double gravity = -9.81; // 떨어지는 시간 double fallingTime = input.nextDouble(); // 초기 높이 double initialPosition = 1000.0; // x(t) = 0.5at^2 + v0t + x0 double finalPosition = 0.0; /* 이부분을 수정하여 프로그램을 완성하세요 */ System.out.printf("%.2f 초 후, 물체의 고도는 %.2f m\n", fallingTime, finalPosition); } } ``` ## 입력 예 ``` // t 의 값 입력 5 ``` ## 출력 예 ``` // t 초후 물체의 고도 출력 5.00 초 후, 물체의 고도는 877.38 m ```
# 메소드의 실행흐름 ## 문제 아래 소스코드의 실행과정과 최종 결과에 대해 설명해주세요 ## 소스코드 ``` public class Square { public static void printSquare(int x) { System.out.println(x * x); } public static void main(String[] args) { int value = 2; System.out.println(value); printSquare(value); printSquare(3); printSquare(value * 2); } } ``` ## 실행결과 ``` 2 4 9 16 ```
# 잘못된 파라미터 ## 문제 다음 소스코드의 에러원인을 찾아주세요. ## 소스코드 ``` public class Square2 { public static void printSquare(int x) { System.out.println(x * x); } public static void main(String[] args) { printSquare("hello"); // Compile Error printSquare(5.5); // Compile Error } } ``` ## 힌트 + 타입 불일치
# 잘못된 파라미터? ## 문제 아래 소스코드는 컴파일 가능한가요? 가능하다면 그 이유와 결과값을 알려주세요. ## 소스코드 ``` public class Square3 { public static void printSquare(double x) { System.out.println(x * x); } public static void main(String[] args) { printSquare(3); } } ``` ## 힌트 + 자동 형변환
# 버스카드 나이인식 ## 문제 뼈대 코드를 토대로 조건문을 사용하여 나이를 입력하면 성인, 청소년, 어린이, 유아를 구분하는 프로그램을 만들어 주세요. 기준은 아래와 같습니다. + 성인: 만 18세 이상 + 청소년: 만 13세 이상 + 어린이: 만 6세 이상 + 유아: 만 5세 이하 ## 뼈대 코드 ``` import java.util.Scanner; public class BusCard { public static String getRole(int age) { /* 이곳을 작성해주세요 */ return ""; } public static void main(String[] args) { Scanner input = new Scanner(System.in); int age = input.nextInt(); String role = getRole(age); System.out.println(role); } } ``` ## 입력 예 ``` 17 ``` ## 출력 예 ``` 청소년 ```
# 비만도 측정 대학생이 되어 열심히 다이어트중인 나몸짱(20) 학생. 열심히 운동도 하고 식단 조절도 하고있는데.. 과연 잘 하고 있는 걸까? ## 문제 입력받은 키(m)와 몸무게(kg)를 토대로 BMI 지수를 계산하여 비만도를 측정 프로그램을 만들어 주세요. ## 요구사항 + 비만도는 아래의 네 가지 단계로 구분 할 것. + 저체중(18.5미만), 정상(18.5이상 ~ 25미만), 과체중(25이상~30미만), 비만(30이상) ## BMI 지수란? 체질량 지수(體質量指數, Body Mass Index, BMI)는 인간의 비만도를 나타내는 지수로, 체중과 키의 관계로 계산된다. 키가 t 미터, 체중이 w 킬로그램일 때, BMI는 다음과 같다. - 위키피디아 - + BMI = w / t^2 ## 뼈대코드 ``` import java.util.Scanner; class BMICalculator { public static double calculateBMI(double weight, double tall) { // 해당 메소드를 구현하세요. return 0; } public static void printBMIClassification(double bmi) { // 해당 메소드를 구현하세요. } public static void main(String[] args) { Scanner input = new Scanner(System.in); double weight = input.nextDouble(); double tall = input.nextDouble(); // BMI 지수 계산 double bmi = calculateBMI(weight, tall); // BMI 지수를 입력하여 비만도 결과 출력 printBMIClassification(bmi); } } ``` ## 입력 예 ``` // 몸무게(kg) 키(m) 순 입력 74.5 1.76 ``` ## 출력 예 ``` BMI: 24.05 정상 입니다. ```
# 임금 계산하기 당신은 Java 기업의 사장이 되었습니다. 어느덧 월급날이 다가오는데.. ## 문제 회사의 직원들에게 지급할 임금을 계산하는 프로그램을 작성해주세요. ## 요구사항 + 직원의 임금은 주급으로 정산하며, (근무시간) X (기본시급)을 기준으로 한다. + 주당 근무시간이 40시간을 초과시, 초과급여는 (초과시간) X (기본시급) X (1.5)으로 한다. + 기본시급은 최저 $8.00이며, 이보다 작을 경우 에러를 출력한다. + 주당 근무시간이 60시간을 초과하는 경우 에러를 출력한다. ## 뼈대코드 ``` class JavaCorporation { public static void printPay(double basePay, int hours) { // 메소드를 구현하세요.. } public static void main(String[] args) { printPay(7.50, 35); printPay(8.20, 47); printPay(10.00, 73); } } ``` ## 출력 예 ``` ERROR: 최저시급 불이행 $ 414.1 ERROR: 제한 근무시간 초과. ```
# 구구단 출력하기 ## 문제 중첩된 반복문을 사용하여 구구단을 출력해 봅시다. ##출력 예 ``` 2단 2 x 1 = 2 2 x 2 = 4 2 x 3 = 6 ... 9단 9 x 1 = 9 ... 9 x 9 = 81 ``` ## 힌트 + 유투브 https://youtu.be/q0AlojDjf9Q
# 삼각형 별 찍기 ## 문제 중첩된 반복문을 사용하여 아래와 같은 삼각형 별을 출력해주세요 ## 출력 예 ``` * * * * * * * * * * * * * * * ``` ## Step 1: 원하는 출력의 형태를 분석합니다. ``` // i 행: (i + 1)개의 별을 출력 * // 0행: 0 + 1 * * // 1행: 1 + 1 * * * // 2행: 2 + 1 * * * * // 3행: 3 + 1 * * * * * // 4행: 4 + 1 ``` ## Step 2: 각 행을 나타내기위해 for문을 생성합니다. ``` // i: 각 행을 나타내기 위한 변수 for (int i = 0; i < 5; i++) { ... } ``` ## Step 3: 각 행마다 출력할 별의 개수에 대한 반복문을 생성합니다. ``` // i: 각 행을 나타내기 위한 변수 for (int i = 0; i < 5; i++) { // j: 각 행의 별을 출력하기 위한 변수 for (int j = i; j < i + 1; i++) { ... } System.out.println(); } ```
# 삼각형 별 찍기 II ## 문제 중첩된 반복문을 사용하여 아래와 같은 삼각형 별을 출력해주세요 ## 출력 예 ``` * * * * * * * * * * * * * * * ``` ## Step 1: 출력 결과를 분석합니다. ``` // 규칙1: 별 = 5 - 공백 // 규칙2: 별 = i 행 + 1 * // 0행: 공백(4), 별(1) * * // 1행: 공백(3), 별(2) * * * // 2행: 공백(2), 별(3) * * * * // 3행: 공백(1), 별(4) * * * * * // 4행: 공백(0), 별(5) ``` ## Step 2: 행과 열에 대한 2중 반복문을 작성합니다. ``` // i: 행 for (int i = 0; i < 5; i++) { // j: 열 for (int j = 0; j < 5; j++) { ... } } ``` ## Step 3: Step 1에서 구한 `규칙1`과 `규칙2`에 대한 조건식을 만듭니다. ``` // i: 행 for (int i = 0; i < 5; i++) { // j: 열 for (int j = 0; j < 5; j++) { if (5 - j == i + 1) System.out.print("* "); else System.out.print(" "); } System.out.println(); } ```
# 배열의 합 구하기 ## 문제 제시된 뼈대 코드에서 배열 `arr`의 모든 요소의 합을 구하도록 `sum`메소드를 완성시켜 주세요 ## 뼈대코드 ``` public class ArraySum { public static int sum(int[] numbers) { int sum = 0; /* 해당 메소드를 구현하세요 */ return sum; } public static void main(String[] args) { int[] arr = new int[10]; for (int i = 0; i < arr.length; i++) { arr[i] = i * i; } System.out.printf("총합: %d\n", sum(arr)); } } ``` ## 출력 예 ``` 총합: 285 ```
# 모음과 자음의 개수 ## 문제 A, E, I, O, U를 모음이라고 가정했을때, 입력으로 들어온 문자열이 몇개의 모음과 자음으로 구성되어 있는지 출력하는 프로그램을 작성하세요. ## 입력 예 ``` 2 // 입력할 문자열의 개수 Programming is fun // 입력한 문자열 1 Hello World // 입력한 문자열 2 ``` ## 출력 예 ``` Programming is fun: 5 11 Hello World: 3 7 ``` ## 힌트 `Scanner` 클래스를 사용하여 키보드로부터 입력을 받아주세요. ``` Scanner input = new Scanner(System.in); int n = input.nextInt(); // 정수값 입력 String str = input.next(); // 문자열 입력 ``` `for`문과 `switch` 구문을 사용하여 모음과 자음의 개수를 세어주세요 ``` for (int i = 0; i < str.length(); i++) { switch (str.charAt(i)) { case 'a': case 'e': ... break; default: ... break; } } ``` `next()` 메소드와 `nextLine()` 메소드의 차이를 파악하여 적절한 메소드를 사용해주세요
# 로또 번호 생성기 ## 문제 로또 번호 생성기를 만들어 주세요 ## 요구사항 + 중복 숫자가 없도록 할 것. + 싫어하는 숫자 5개를 입력받고 이를 제외하여 번호를 생성할 것. + 최종적으로 생성된 번호들을 정렬하여 출력 할 것. ## 입력 예 ``` 제거할 숫자들: 13 42 7 33 28 ``` ## 출력 예 ``` 생성 번호: 3 6 19 23 31 36 ``` ## Step 1: 번호 생성을 위한 메소드를 생성합니다. ``` public static int generateNumber() { return (int)(Math.random() * 45) + 1; } ``` ## Step 2: main 메소드를 생성하고 반복문을 사용하여 6개의 번호를 생성해봅니다. ``` int[] pickNumbers = new int[6]; for (int i = 0; i < pickNumbers.length; i++) { pickNumbers[i] = generateNumber(); } ``` ## Step 3: 생성된 결과를 출력해봅니다. ``` for (int n : pickNumbers) System.out.printf("%d ", n); ``` ## Step 4: 출력전 결과를 정렬시켜봅니다. ``` // 자바에서 제공하는 배열을 정렬 메소드 Arrays.sort(numbers); ``` ## Step 5: 중복된 숫자를 없애기위해 뽑은 번호를 체크합니다. ``` boolean[] isPicked = new boolean[46]; int[] numbers = new int[6]; for (int i = 0; i < numbers.length; i++) { // 임시번호 생성 int tempNum = generateNumber(); // 중복된 수가 아니라면 if (isPicked[tempNum] == false) { // 뽑았다고 체크 isPicked[tempNum] = true; numbers[i] = tempNum; } } Arrays.sort(numbers); for (int n : numbers) System.out.printf("%d ", n); ``` ## Step 6: 중복 수가 나오면 계속 다시 뽑음 ``` for (int i = 0; i < numbers.length; i++) { // 무한 반복! while (true) { // 임시번호 생성 int tempNum = generateNumber(); // 중복된 수가 아니라면 if (isPicked[tempNum] == false) { // 뽑았다고 체크 isPicked[tempNum] = true; numbers[i] = tempNum; // 가장 가까운 반복문 탈출! break; } } } ```
# 고득점자 찾기 자바 프로그래밍 시험에서 B+ 학점을 넘기면 장학금을 탈 수 있게 된 Kate(21) 학생. 과연 장학금의 행방은 어디로!? ## 문제 최고 득점자를 출력하는 프로그램을 작성하시오. ## 출력 예 ``` 1등: Daniel(98) ``` ## 성적표 + Elena 65 + Suzie 74 + John 23 + Emily 75 + Neda 68 + Kate 96 + Alex 88 + Daniel 98 + Hamilton 54 ## 뼈대코드 ``` public class TopScoreStudent { public static int topIndex(int[] scores) { /* 가장 높은 성적의 인덱스를 반환하는 함수를 구현하세요. */ return 0; } public static void main(String[] args) { String[] names = {/* 1. 이름을 배열로 만드세요. */}; int[] scores = {/* 2. 점수를 배열로 만드세요. */}; int i = topIndex(scores); System.out.printf("1등: %s(%d)\n", names[i], scores[i]); } } ``` ## 힌트 + 유투브 https://youtu.be/q0AlojDjf9Q
# 자동차 클래스 구현하기 ## 문제 아래의 요구사항을 만족시키는 Car 클래스를 구현하시오 ## 요구사항 + Car 클래스는 다음과 같은 정보를 갖는다. - 이름 - 배기량 - 크기 + Car 클래스는 다음과 같은 기능을 할 수 있다. - 가속하기 - 기어변경 - 경적울리기
# 교수 클래스 구현하기 ## 문제 아래의 요구사항을 만족시키는 Professor 클래스를 구현하시오 ## 요구사항 + Professor 클래스는 다음과 같은 정보를 갖는다. - 이름 - 소속 - 학점 잘주는 정도 + Professor 클래스는 다음과 같은 기능을 할 수 있다. - 출석부르기 - 과제내주기 - 학점주기
# 고양이 클래스 구현하기 ## 문제 아래의 요구사항을 만족시키는 Cat 클래스를 구현하시오 ## 요구사항 + Cat 클래스는 다음과 같은 정보를 갖는다. - 이름 - 색깔 - 호기심 + Cat 클래스는 다음과 같은 기능을 할 수 있다. - 좁은곳 파고들기 - 털 곤두 세우기 - 미야옹 울기
# 주사위 서바이벌 주사위는 면의 개수에 따라서 반환 하는 값이 다릅니다. 일반적인 주사위라고 함은 6개의 면을 가진 주사위로써, 1부터 6사이의 임의의 정수 값을 얻을 수 있습니다. ## 문제 짝수가 나온 주사위가 살아남는, 주사위 서바이벌 게임이 시작되었습니다. 참가 주사위는 각각 12간지의 이름을 갖는 정 2면체 부터 13면체 입니다. 주사위를 던져 살아남은 주사위를 남기고, 살아남은 주사위 끼리 다시 이를 반복하여 최종 생존 주사위를 찾아주세요. ## Step 1 주사위가 이름과 면의 개수, 그리고 던져진 주사위의 눈 정보를 갖도록 필드를 만들고, 1부터 planeNum사이의 임의의 정수를 반환 하는 메소드 갖도록 클래스를 작성하세요 ``` // 주사위 클래스! public class Dice { String name; int planeNum; int resultNum; // 생성자 Dice(String name, int planeNum) { this.name = name; this.planeNum = planeNum; } // 주사위를 던짐! 1 ~ planeNum 까지의 값을 반환! int roll() { return resultNum = (int) (Math.random() * planeNum) + 1; } // main public static void main(String[] args) { Dice d10 = new Dice("호랑이", 10); System.out.println(d10.roll()); System.out.println(d10.isAlive()); } } ``` ## Step 2 **Step 1**에서 만든 클래스를 토대로 1면체 부터 12면체 주사위를 생성하되, 순서대로 12간지의 이름을 붙여 생성해주세요. ``` Dice[] dices = new Dice[12]; dices[0] = new Dice("쥐", 2); dices[1] = new Dice("소", 3); dices[2] = new Dice("호랑이", 4); ... dices[11] = new Dice("돼지", 13); ``` ## Step 3 toString() 메소드를 작성하여 아래 형식과 같이 주사위 정보를 출력 할 수 있도록 해주세요. ``` // 메소드 정의 public String toString() { return "Dice [name=" + name + ", planeNum=" + planeNum + ", resultNum=" + resultNum + "]"; } // 메소드 호출 for (Dice d : dices) System.out.println(d.toString()); // 예상 출력 Dice [name=쥐, planeNum=2, resultNum=0] Dice [name=소, planeNum=3, resultNum=0] ... Dice [name=돼지, planeNum=13, resultNum=0] ``` ## Step 4 주사위를 모두 던진 후, 그 결과 값을 확인해 보세요. ``` // 12개 주사위 정보 출력 for (Dice d : dices) { d.roll(); System.out.println(d.toString()); } ``` ## Step 5 주사위들을 모두 던져 짝수가 나온 주사위들만 출력해 보세요. ``` for (Dice d : dices) { d.roll(); if (d.resultNum % 2 == 0) System.out.println(d.toString()); } ``` ## Step 6 isAlive() 메소드를 정의해주세요 ``` // 메소드 정의 boolean isAlive() { return resultNum % 2 == 0; } // 메소드 호출 for (Dice d : dices) { d.roll(); if (d.isAlive()) System.out.println(d.toString()); } ``` ## Step 7 ArrayList를 생성하여 모든 주사위를 담아주세요 ``` ArrayList<Dice> survivor = new ArrayList<>(); for (Dice d: dices) survivor.add(d); ``` ## Step 8 ArrayList에 담긴 모든 주사위를 각각 한번씩 던져 생존 주사위는 남기고, 죽은 주사위는 제거해 주세요. ``` for (int i = 0; i < survivor.size(); i++) { Dice d = survivor.get(i); d.roll(); if (d.isAlive()) System.out.println(d.toString()); else survivor.remove(i--); } ``` ## Step 9 더 이상 생존 주사위가 없을 때까지, Step 8 과정을 반복해주세요.
# 소개팅 매칭 요즘 유행인 소개팅 어플은 외모를 점수화 하여 비슷한 점수대의 회원들 끼리 매칭을 시켜준다고 합니다. ## 문제 아래 과정을 통해 연결가능한 소개팅 매칭 쌍을 찾아주세요. ## Step 1 소개팅 회원들의 정보를 담을 수 있는 클래스를 만들어 주세요. 필요한 정보는 아래와 같습니다. + 이름 + 성별 + 평점 ``` // 소스코드 예 User { String name; boolean isMale; double point; } ``` ## Step 2 이름과 성별을 입력하여 회원객체를 10명 생성해주세요. 회원 평점은 랜덤하게 0.0부터 5.0 사이의 값을 갖도록 만들어주세요 ``` User { // 필드.. // 생성자 User(String name, boolean isMale) { this.name = name; this.isMale = isMale; this.point = Math.random() * 5; } // main public static void main(String[] args) { User[] users = new User[10]; users[0] = new User("소희", false); users[1] = new User("영수", true); ... users[9] = new User("설민", true); } ``` ## Step 3 toString 메소드를 오버라이드 하여 객체의 정보를 아래 형식과 같이 출력가능하게 해주세요 소스코드 예 ``` public String toString() { return String.format("%s(%s: %.1f)\n", name, isMale, point); } ``` 출력 예 ``` // System.out.println(user[0].toString()); // 이름(성별: 평점) 소희(여: 4.5) ``` ## Step 4 회원들의 가능한 매칭 쌍을 출력 시켜주세요. 매칭 기준은 아래와 같습니다. + 성별이 다를 것. + 평점차이가 0.8점 이상 차이나지 않을 것. ``` // 소스코드 예 for (int i = 0; i < users.length; i++) { for (int j = i + 1; j < users.length; j++) { User source = users[i]; User target = users[j]; if (source.isMale != target.isMale) { if (Math.abs(source.point - target.point) < 0.8) System.out.println(source.toString() + " - " + target.toString()) } } } ``` ``` // 출력 예 소희(여: 4.5) - 영수(남: 4.8) 소희(여: 4.5) - 민성(남: 4.1) ... 설민(남:2.4) - 민아(여: 2.6) ```
# 평창 동계 올림픽 현재(2018.02.19) 평창 동계 올림픽의 메달순위 결과는 아래와 같습니다. ![Imgur](https://i.imgur.com/SesdQof.png) ## 문제 앞으로 20경기가 남아있고, 각 메달을 획득 할 확률이 같다고 할 때, 최종 결과를 출력하는 프로그램을 작성해주세요. ## Step 1 출전국가에 대한 정보를 클래스로 만들어 주세요. (출전국가는 이름, 각 메달수를 갖음) ``` Country { String name; int gold; int silver; int bronze; } ``` ## Step 2 현재 메달 순위에 등록된 각 나라별 정보를 생성자를 통해 배열로 만들어 주세요. ``` Country { // 필드 ... // 생성자 Country(String name, int gold, int silver, int bronze) { this.name = name; this.gold = gold; ... } // main public static void main(String[] args) { Country[] countries = new Country[10]; countries[0] = new Country("노르웨이", 10, 9, 8); ... countries[9] = new Country("일본", 2, 5, 3); } } ``` ## Step 3 Step 2에서 만든 각나라별 정보들이 잘 등록 되었는지 확인할 수 있게 toString() 메소드를 작성해주세요 ``` // System.out.println(countries[0].toString()); 노르웨이 10 / 9 / 8 Total: 27 ``` ## Step 4 앞으로 남은 20경기의 각 메달을 10개국 중 임의의 한 나라에 수여 하도록 코드를 작성해주세요. ``` for (int i = 0; i < 20; i ++) { int randomIndex = (int) (Math.random * 10); countries[randomIndex].gold++; int randomIndex = (int) (Math.random * 10); countries[randomIndex].silver++; int randomIndex = (int) (Math.random * 10); countries[randomIndex].bronze++; } ``` ## Step 5 금, 은, 동 메달에 따라 출전국가를 정렬하고, 최종 순위를 출력 해주세요. ``` // 출력 예 1. 노르웨이 13 / 10 / 10 Total: 33 2. ... ... 10. 일본 3 / 6 / 3 Total: 12 ```
# 대여 가능한 책 ## 문제 대여가 가능한 책의 목록을 출력하는 프로그램을 작성해주세요. ## Step 1 이름, 가격, 대여중 여부를 확인 할 수 있게 Book 클래스를 만들어 주세요. ``` Book { String title; int price; boolean borrowed; } ``` ## Step 2 적절한 생성자를 작성하고 이를 통해 10권의 샘플 책을 배열에 하나씩 만들어 주세요. ``` // 생성자 Book(String name, int price, boolean borrowed) { ... } ``` ``` // main Book[] books = new Book[10]; books[0] = new Book("나루토", 3500, false); ... books[9] = new Book("맥심", 14000, false); ``` ## Step 3 샘플 책들이 잘 만들어 졌는지 확인 할 수 있게 toString() 메소드를 작성해 주세요. ``` // System.out.println(books[0].toString()); [나루토] 3500원, 대여중? false ``` ## Step 4 Book 클래스에 대여시작(rented)메소드와 반납완료(returned) 메소드를 작성해주세요. ``` System.out.println(books[0].toString()); // [나루토] 3500원, 대여중? false books[0].rented(); System.out.println(books[0].toString()); // [나루토] 3500원, 대여중? true books[0].returned(); System.out.println(books[0].toString()); // [나루토] 3500원, 대여중? false ``` ## Step 5 샘플 책 10권중 임의의 5권을 선택하여 빌려주고, 나머지 대여 가능한 책의 목록을 출력해주세요. ``` // 출력 예 [나루토] 3500원, 대여중? false [슬램덩크] 4000원, 대여중? false [소년탐정 김전일] 3500원, 대여중? false [멘즈헬스] 1500원, 대여중? false [맥심] 14000원, 대여중? false ```
# 격투 게임 ## 문제 아래 요구사항을 만족시키는 Hero 클래스를 작성하고, 이를 통해 격투 게임을 만들어 주세요. ## 요구사항 + Hero 객체는 다음과 같은 정보를 갖는다. - 이름 - 체력 + Hero 객체는 다른 Hero 객체에게 펀치공격으로 피해를 줄 수 있다. + 격투 게임은 두 Hero 객체간의 펀치 교환으로 진행되며, 둘 중 하나의 체력이 다 소진 될 때 까지 격투를 계속 한다. ## 출력 예 ``` [아서스] HP: 100 [레오나] HP: 100 [아서스] HP: 100 의 펀치! [레오나] HP: 90 [아서스] HP: 100 의 펀치! [레오나] HP: 80 [아서스] HP: 100 의 펀치! [레오나] HP: 70 [아서스] HP: 100 의 펀치! [레오나] HP: 60 [아서스] HP: 100 의 펀치! [레오나] HP: 50 [레오나] HP: 50 의 펀치! [아서스] HP: 90 [아서스] HP: 90 의 펀치! [레오나] HP: 40 [아서스] HP: 90 의 펀치! [레오나] HP: 30 [레오나] HP: 30 의 펀치! [아서스] HP: 80 [아서스] HP: 80 의 펀치! [레오나] HP: 20 [아서스] HP: 80 의 펀치! [레오나] HP: 10 [아서스] HP: 80 의 펀치! [레오나] HP: 0 ``` ### Step 1: 클래스 설계 및 구현 Hero 객체를 만들기 위해 필요한 필드값을 설정해주세요 ``` public class Hero { String name; int hp; } ``` ### Step 2: 생성자 작성 적절한 생성자를 만들어 객체의 정보(필드)를 초기화 할 수 있게 해주세요 ``` // 생성자 추가 public Hero(String name, int hp) { this.name = name; this.hp = hp; } // 생성자를 통한 객체 생성 Hero a = new Hero("아서스", 100); Hero b = new Hero("레오나", 100); ``` ### Step 3: toString() 메소드 추가 객체의 상태를 확인하기 위해 toString() 메소드를 작성해주세요 ``` // toString() 메소드 작성 public String toString() { return String.format("[%s] HP: %d", name, hp); } // 생성자 마지막 부분에 toString() 메소드를 호출하게 하여 객체 생성됨을 확인 public Hero(String name, int hp) { this.name = name; this.hp = hp; System.out.println(this.toString()); } ``` ### Step 4: punch() 메소드 추가 상대방 객체를 공격하여 에너지를 감소시킬 수 있도록 구현해주세요. 그리고 펀치 메소드 수행 후 공격객체의 정보와 피격된 객체의 상태 또한 출력하게 해주세요. ``` // 펀치 메소드 정의 public void punch(Hero enemy) { enemy.hp -= 10; System.out.println(this.toString() + " 의 펀치!"); System.out.println(" " + enemy.toString()); } // 펀치 메소드 실행 a.punch(b); ``` ### Step 5: 임의의 공격자 선택 후 펀치 Random 클래스를 활용하여 임의의 공격자를 선택할 수 있게 해주세요 ``` // 두 객체 생성 Hero a = new Hero("아서스", 100); Hero b = new Hero("레오나", 100); // 랜덤 객체 생성 Random rand = new Random(); // 임의의 참/거짓 값을 생성하여 공격자와 수비자를 정함 Hero attacker = rand.nextBoolean() ? a : b; Hero defender = (attacker == a) ? b : a; // 공격자가 수비자에게 펀치를 날림 attacker.punch(defender); ``` ``` // 펀치 동작 후 출력 예 [아서스] HP: 100 의 펀치! [레오나] HP: 90 ``` ### Step 6: 한 쪽이 쓰러질 때 까지 반복 ``` while (a.hp > 0 && b.hp > 0) { Hero attacker = rand.nextBoolean() ? a : b; Hero defender = (attacker == a) ? b : a; attacker.punch(defender); } ```
# 계좌 만들기 ##문제 아래의 요구사항을 만족시키는 계좌를 만들어주세요. ## 요구사항 + 계좌는 비공개 필드값으로 아래의 정보를 갖는다. - id - password - ownerName - balance + 계좌의 공개 메소드는 아래와 같다. - deposit(int) - withdraw(int, String) - checkBalance(String) + 계좌의 비공개 메소드는 아래와 같다. - isCorrectPassword(String) ## 설계: 클래스 다이어그램 ![Imgur](https://i.imgur.com/E5ud0Ba.png) ## 제공 코드 ``` public class Account { // 필드를 작성해 주세요 // 생성자를 만들어 주세요 // 메소드를 구현해 주세요 public static void main(String[] args) { // 계좌 생성 Account account = new Account(1, "password!@#", "Park"); // 10만원 입금 account.deposit(100000); // 잔액 확인 System.out.println(account.checkBalance("password!@#")); // 2만원 출금 account.withdraw(20000, "password!@#"); // 잔액 확인 System.out.println(account.checkBalance("password!@#")); } } ``` ## 출력 예 ``` 100000 80000 ```
# 연봉 구하기 어느덧 졸업을 하고 직장인이 된 박컴공(28)씨. 이제는 어엿한 개발 3년차가 되었다. 개발자들의 연봉은 개발 년차에 따라 정해 지는데.. ## 문제 개발자의 연봉을 구하는 프로그램을 작성해주세요. ## 요구사항 + 개발자(Developer)는 이름과 경력(년차) 정보를 갖는다. + 개발자는 경력에 따라 초급(3년 미만)/중급(7년 미만)/고급(7년이상)의 단계로 나뉜다. + 연봉은 아래의 공식을 따른다 - 연봉 = 단계별 기준연봉 + (100 * 경력) - 단계별 기준연봉은 초급(2800) / 중급(3500) / 고급(4500) 으로 함. ## 설계 ![Imgur](https://i.imgur.com/yfTSWC1.png) ## 뼈대코드 ``` public class Developer { // 1: 필드를 구현하세요. // 2: 생성자를 구현하세요. // 3: 메소드를 구현하세요. public static void main(String[] args) { Developer tom = new Developer("Tom", 2); Developer john = new Developer("John", 5); Developer sally = new Developer("Sally", 9); System.out.println(tom.salary()); System.out.println(john.salary()); System.out.println(sally.salary()); } } ``` ## 출력 목표 ``` 3000 4000 5400 ```
# 기업 연봉 지출 구하기 연봉계산 프로그램개발에 성공한 박컴공(28)사원. 이번에는 회사의 회계 관련 IT 개발을 맡게 되었다.. ## 문제 회사에 소속된 모든 개발자들의 연봉지출이 얼마나 되는지 계산하는 프로그램을 작성해주세요 ## 요구사항 + 회사는 여러명의 개발자를 갖는다. + 각 개발자들은 **32: 연봉 구하기**에서 제시된 연봉을 받는다. ## 설계 ![Imgur](https://i.imgur.com/9Bsk0j3.png) ## 뼈대코드 ``` public class JavaCorperation { // 1: 필드를 구현하세요. // 2: 생성자를 구현하세요. // 3: 메소드를 구현하세요. public static void main(String[] args) { JavaCorperation corp = new JavaCorperation("Oracle"); Developer john = new Developer("John", 4); Developer paul = new Developer("Paul", 5); Developer james = new Developer("James", 2); Developer elena = new Developer("Elena", 10); Developer kate = new Developer("Kate", 1); Developer[] members = { john, paul, james, elena, kate }; for (Developer d : members) corp.addDeveloper(d); System.out.println(corp.salaryExpenses()); } } ``` ## 출력 목표 ``` 19300 ```
# 소개팅 매칭 요즘 유행인 소개팅 어플은 외모를 점수화 하여 비슷한 점수대의 회원들 끼리 매칭을 시켜준다고 합니다. ## 문제 아래 과정을 통해 연결가능한 소개팅 매칭 쌍을 찾아주세요. ## Step 1 소개팅 회원들의 정보를 담을 수 있는 클래스를 만들어 주세요. 필요한 정보는 아래와 같습니다. + 이름 + 성별 + 평점 ``` // 소스코드 예 User { String name; boolean isMale; double point; } ``` ## Step 2 이름과 성별을 입력하여 회원객체를 10명 생성해주세요. 회원 평점은 랜덤하게 0.0부터 5.0 사이의 값을 갖도록 만들어주세요 ``` User { // 필드.. // 생성자 User(String name, boolean isMale) { this.name = name; this.isMale = isMale; this.point = Math.random() * 5; } // main public static void main(String[] args) { User[] users = new User[10]; users[0] = new User("소희", false); users[1] = new User("영수", true); ... users[9] = new User("설민", true); } ``` ## Step 3 toString 메소드를 오버라이드 하여 객체의 정보를 아래 형식과 같이 출력가능하게 해주세요 소스코드 예 ``` public String toString() { return String.format("%s(%s: %.1f)\n", name, isMale, point); } ``` 출력 예 ``` // System.out.println(user[0].toString()); // 이름(성별: 평점) 소희(여: 4.5) ``` ## Step 4 회원들의 가능한 매칭 쌍을 출력 시켜주세요. 매칭 기준은 아래와 같습니다. + 성별이 다를 것. + 평점차이가 0.8점 이상 차이나지 않을 것. ``` // 소스코드 예 for (int i = 0; i < users.length; i++) { for (int j = i + 1; j < users.length; j++) { User source = users[i]; User target = users[j]; if (source.isMale != target.isMale) { if (Math.abs(source.point - target.point) < 0.8) System.out.println(source.toString() + " - " + target.toString()) } } } ``` ``` // 출력 예 소희(여: 4.5) - 영수(남: 4.8) 소희(여: 4.5) - 민성(남: 4.1) ... 설민(남:2.4) - 민아(여: 2.6) ```
# 평창 동계 올림픽 현재(2018.02.19) 평창 동계 올림픽의 메달순위 결과는 아래와 같습니다. ![Imgur](https://i.imgur.com/SesdQof.png) ## 문제 앞으로 20경기가 남아있고, 각 메달을 획득 할 확률이 같다고 할 때, 최종 결과를 출력하는 프로그램을 작성해주세요. ## Step 1 출전국가에 대한 정보를 클래스로 만들어 주세요. (출전국가는 이름, 각 메달수를 갖음) ``` Country { String name; int gold; int silver; int bronze; } ``` ## Step 2 현재 메달 순위에 등록된 각 나라별 정보를 생성자를 통해 배열로 만들어 주세요. ``` Country { // 필드 ... // 생성자 Country(String name, int gold, int silver, int bronze) { this.name = name; this.gold = gold; ... } // main public static void main(String[] args) { Country[] countries = new Country[10]; countries[0] = new Country("노르웨이", 10, 9, 8); ... countries[9] = new Country("일본", 2, 5, 3); } } ``` ## Step 3 Step 2에서 만든 각나라별 정보들이 잘 등록 되었는지 확인할 수 있게 toString() 메소드를 작성해주세요 ``` // System.out.println(countries[0].toString()); 노르웨이 10 / 9 / 8 Total: 27 ``` ## Step 4 앞으로 남은 20경기의 각 메달을 10개국 중 임의의 한 나라에 수여 하도록 코드를 작성해주세요. ``` for (int i = 0; i < 20; i ++) { int randomIndex = (int) (Math.random * 10); countries[randomIndex].gold++; int randomIndex = (int) (Math.random * 10); countries[randomIndex].silver++; int randomIndex = (int) (Math.random * 10); countries[randomIndex].bronze++; } ``` ## Step 5 금, 은, 동 메달에 따라 출전국가를 정렬하고, 최종 순위를 출력 해주세요. ``` // 출력 예 1. 노르웨이 13 / 10 / 10 Total: 33 2. ... ... 10. 일본 3 / 6 / 3 Total: 12 ```
# 대여 가능한 책 ## 문제 대여가 가능한 책의 목록을 출력하는 프로그램을 작성해주세요. ## Step 1 이름, 가격, 대여중 여부를 확인 할 수 있게 Book 클래스를 만들어 주세요. ``` Book { String title; int price; boolean borrowed; } ``` ## Step 2 적절한 생성자를 작성하고 이를 통해 10권의 샘플 책을 배열에 하나씩 만들어 주세요. ``` // 생성자 Book(String name, int price, boolean borrowed) { ... } ``` ``` // main Book[] books = new Book[10]; books[0] = new Book("나루토", 3500, false); ... books[9] = new Book("맥심", 14000, false); ``` ## Step 3 샘플 책들이 잘 만들어 졌는지 확인 할 수 있게 toString() 메소드를 작성해 주세요. ``` // System.out.println(books[0].toString()); [나루토] 3500원, 대여중? false ``` ## Step 4 Book 클래스에 대여시작(rented)메소드와 반납완료(returned) 메소드를 작성해주세요. ``` System.out.println(books[0].toString()); // [나루토] 3500원, 대여중? false books[0].rented(); System.out.println(books[0].toString()); // [나루토] 3500원, 대여중? true books[0].returned(); System.out.println(books[0].toString()); // [나루토] 3500원, 대여중? false ``` ## Step 5 샘플 책 10권중 임의의 5권을 선택하여 빌려주고, 나머지 대여 가능한 책의 목록을 출력해주세요. ``` // 출력 예 [나루토] 3500원, 대여중? false [슬램덩크] 4000원, 대여중? false [소년탐정 김전일] 3500원, 대여중? false [멘즈헬스] 1500원, 대여중? false [맥심] 14000원, 대여중? false ```
# 한주에 얼마나 일하나? ## 문제 요일별 직원들의 작업시간이 아래와 같이 정리되어있다. 매 행에는 직원의 일주일 작업시간이 열로 구분되어 있다. 예를 들어, 8명의 직원의 작업시간은 다음 그림처럼 저장된다. 여러분은 각 직원의 작업시간을 입력 받아서 한 주 동안 가장 많이 일한 직원부터 내림차순으로 출력하는 프로그램을 작성해야 한다. ![working hours][1] ## 요구사항 다음과 같은 형식의 클래스를 만들어서 문제를 풀어주세요. ``` class Employee { String name; int[] hours; Employee(String name, int[] hours) { this.name = name; this.hours = hours; } int totalHours() { ... } } ``` ## 입력 예 ``` 8 Employee0 2 4 3 4 5 8 8 Employee1 7 3 4 3 3 4 4 Employee2 3 3 4 3 3 2 2 Employee3 9 3 4 7 3 4 1 Employee4 3 5 4 3 6 3 8 Employee5 3 4 4 6 3 4 4 Employee6 3 7 4 8 3 8 4 Employee7 6 3 5 9 2 7 9 ``` ### 출력 예 ``` Employee7 41 Employee6 37 Employee0 34 Employee4 32 Employee3 31 Employee1 28 Employee5 28 Employee2 20 ``` [1]: https://withcs.net/img/java2015/weekly_hours_for_each_employee.png "직원별 일한시간"
# 북 카페 객체 지향 프로그래밍(OOP) 수업을 마치고 집으로 돌아온 나컴공(21) 학생.'도대체 객체 지향이 뭐지?' 라는 의문에 휩싸이지만, 오늘도 어김없이 북 카페로 공부를 하러 간다. 그렇게 3시간이 흘렀을까? 마침내 깨달음에 이른 나컴공 학생! > 객체지향 프로그래밍은, > 실제 사물의 구성형태를 그대로 프로그램에 녹여내는 것이였어! ## 문제 1. 북 카페를 이루고있는 구성요소를 클래스로 설계하세요. 2. 설계를 토대로 소스코드를 작성하세요. 3. 작성된 소스코드가 요구사항을 충족하도록 프로그램을 만들어 주세요. ## 구성요소 + 북 카페 + 책 + 음료 ## 요구사항 북 카페는 아래의 정보를 갖는다. + 이름 + 주소 + 여러권의 책 + 다양한 음료 북 카페는 아래의 동작을 수행 할 수 있다. + 새로운 책을 등록하거나, 등록된 책을 삭제 + 새로운 음료를 추가하거나, 기존 음료를 삭제 + 카페의 정보를 요약하여 출력 책은 아래의 정보를 갖는다. + 제목 책은 아래의 동작을 수행 할 수 있다. + 책 제목을 문자열로 반환 음료는 아래의 정보를 갖는다. + 이름 + 가격 음료는 아래의 동작을 수행 할 수 있다. + 음료 정보를 문자열로 반환 ## 기본코드 **Book.java** ``` public class Book { // 필드 String title; // 생성자 Book(String title) { this.title = title; } // 책 정보를 문자열로 반환 String getTitle() { return title; } } ``` **Drink.java** ``` public class Drink { // 필드 String name; int price; // 생성자 public Drink(String name, int price) { /* 생성자를 완성시켜 주세요 */ } // 필요 메소드를 추가해주세요 } ``` **BookCafe.java** ``` public class BookCafe { // 필드 String name; String address; Book[] books; Drink[] drinks; int booksCnt; int drinksCnt; static int MAX = 10; // 생성자 BookCafe(String cafeName, String cafeAddress) { name = cafeName; address = cafeAddress; books = new Book[MAX]; booksCnt = 0; drinks = new Drink[MAX]; drinksCnt = 0; } // 새 책을 등록 void addBook(Book book) { books[booksCnt] = book; booksCnt = booksCnt + 1; } // 기존 책을 삭제 void removeBook(String title) { // 반복문을 통해 책을 찾음! for (int i = 0; i < MAX; i++) { Book target = books[i]; // 대상 책이 존재하고, if (target != null) { // 그 책의 이름이 삭제할 이름과 같다면, if (target.getTitle() == title) { books[i] = null; // 책을 삭제 } } } } // 새 음료를 추가 void addDrink(Drink drink) { /* 메소드를 구현하세요 */ } // 기존 음료 삭제 void removeDrink(String name) { /* 메소드를 구현하세요 */ } // 카페 정보를 출력 void showCafeInfo() { System.out.println("이름: " + name); System.out.println("주소: " + address); System.out.println("보유 서적:"); for (int i = 0; i < MAX; i++) { Book target = books[i]; // 대상이 되는 책이 있다면, if (target != null) { System.out.println("\t" + target.getTitle()); } } System.out.println("판매 음료:"); System.out.println("\t" + "/* 음료 목록이 출력되도록 코드를 작성해주세요 */"); /* 음료 목록이 출력되도록 코드를 작성해주세요 */ } public static void main(String[] args) { // 북카페 생성! BookCafe itCafe = new BookCafe("IT 카페", "신림역 3번출구"); // 신규 책 등록 Book java = new Book("예제로 배우는 Java"); itCafe.addBook(java); Book html = new Book("HTML 웹페이지 만들기"); itCafe.addBook(html); Book slamDunk = new Book("슬램덩크"); itCafe.addBook(slamDunk); Book dataStructure = new Book("자료구조"); itCafe.addBook(dataStructure); // 신규 음료 등록 Drink americano = new Drink("아메리카노", 2000); itCafe.addDrink(americano); Drink latte = new Drink("라떼", 2500); itCafe.addDrink(latte); Drink lemonAde = new Drink("레몬에이드", 3000); itCafe.addDrink(lemonAde); Drink beer = new Drink("캔맥주", 3000); itCafe.addDrink(beer); // 카페 정보 출력 System.out.println("== 카페 정보 =="); itCafe.showCafeInfo(); // 책 삭제 System.out.println("\n== 책 삭제 =="); itCafe.removeBook("슬램덩크"); // 카페 정보 출력 System.out.println("\n== 카페 정보 =="); itCafe.showCafeInfo(); // 캔맥주 삭제 System.out.println("\n== 캔맥주 삭제 =="); itCafe.removeDrink("캔맥주"); // 카페 정보 출력 System.out.println("\n== 카페 정보 =="); itCafe.showCafeInfo(); } } ``` ## 기본코드 실행결과 ``` == 카페 정보 == 이름: IT 카페 주소: 신림역 3번출구 보유 서적: 예제로 배우는 Java HTML 웹페이지 만들기 슬램덩크 자료구조 판매 음료: /* 음료 목록이 출력되도록 코드를 작성해주세요 */ == 책 삭제 == == 카페 정보 == 이름: IT 카페 주소: 신림역 3번출구 보유 서적: 예제로 배우는 Java HTML 웹페이지 만들기 자료구조 판매 음료: /* 음료 목록이 출력되도록 코드를 작성해주세요 */ == 캔맥주 삭제 == == 카페 정보 == 이름: IT 카페 주소: 신림역 3번출구 보유 서적: 예제로 배우는 Java HTML 웹페이지 만들기 자료구조 판매 음료: /* 음료 목록이 출력되도록 코드를 작성해주세요 */ ``` ## 최종코드 실행목표 ``` == 카페 정보 == 이름: IT 카페 주소: 신림역 3번출구 보유 서적: 예제로 배우는 Java HTML 웹페이지 만들기 슬램덩크 자료구조 판매 음료: 아메리카노 - 2000원 라떼 - 2500원 레몬에이드 - 3000원 캔맥주 - 3500원 == 책 삭제 == == 카페 정보 == 이름: IT 카페 주소: 신림역 3번출구 보유 서적: 예제로 배우는 Java HTML 웹페이지 만들기 자료구조 판매 음료: 아메리카노 - 2000원 라떼 - 2500원 레몬에이드 - 3000원 캔맥주 - 3500원 == 캔맥주 삭제 == == 카페 정보 == 이름: IT 카페 주소: 신림역 3번출구 보유 서적: 예제로 배우는 Java HTML 웹페이지 만들기 자료구조 판매 음료: 아메리카노 - 2000원 라떼 - 2500원 레몬에이드 - 3000원 ```
# 블랙잭 게임 ## 문제 블랙잭 게임이 동작 할 수 있도록 Player.java 소스코드를 작성해주세요. ## 블랙잭 규칙 + 참가자는 딜러와 게이머 2명으로 제한 + 카드는 각 무늬(다이아, 클로버, 하트, 스페이스) 별로 13장(A, 2~10, J,Q,K)씩 총 52장 + 숫자 카드는 그대로 점수에 사용 + 문자 카드 점수는 아래와 같이 적용 - A: 1점 - J,Q,K: 10점 + 게임 시작시, 참가자는 2장을 받고 시작 + 게이머는 언제든지 카드를 뽑을 수 있음 + 딜러의 점수가 - 16점 이하인 경우 반드시 1장을 뽑고 - 17점 이상인 경우 더이상 카드를 뽑지 않는다 + 참가자 모두 추가 뽑기 없는경우 카드를 오픈하며, 오픈시 총점이 21점에 가까운 측이 승리 + 단, 21점을 초과한 사람은 패배 ## 핵심 객체 + 카드 뭉치 - 52개의 서로 다른 카드를 갖음 - 카드를 1장을 뽑아준다 + 카드 - 다이아, 클로버, 하트, 스페이드 중 하나의 무늬를 갖음 - A, 2~10, J, Q, K 중 하나를 갖음 + 규칙 - 점수를 측정한다 - 승패를 판단한다 + 딜러 - 게임 시작시 2장의 카드를 받음 - 추가로 카드를 받음(16점 이하인경우) - 뽑은 카드를 갖음 - 카드를 오픈 + 게이머 - 게임 시작시 2장의 카드를 받음 - 추가로 카드를 받음 - 뽑은 카드를 갖음 - 카드를 오픈 ## 소스코드 구성 + BlackJack.java + Rule.java + Player.java + Deck.java + Card.java ## BlackJack.java ```java import java.util.Scanner; public class BlackJack { public static void main(String[] args) { System.out.println("== 블랙잭 =="); Scanner input = new Scanner(System.in); Player dealer = new Player(); // 딜러 생성 Player gamer = new Player(); // 게이머 생성 Deck deck = new Deck(); // 덱 생성 init(deck, dealer, gamer); // 첫 카드 돌림 while (!(dealer.isStay() && gamer.isStay())) { // 게임 진행 playing(input, deck, dealer, gamer); } Rule.judge(dealer, gamer); // 최종결과 판단 } public static void init(Deck deck, Player dealer, Player gamer) { System.out.println("게이머가 2장의 카드를 받습니다."); gamer.hit(deck.pick()); gamer.hit(deck.pick()); System.out.println("딜러가 2장의 카드를 받습니다."); dealer.hit(deck.pick()); dealer.hit(deck.pick()); System.out.println("게이머의 카드는 다음과 같습니다."); gamer.showCards(); System.out.println("딜러의 카드는 다음과 같습니다."); dealer.showCards(); } public static void playing(Scanner input, Deck deck, Player dealer, Player gamer) { System.out.println("카드를 더 받으려면 1 아니면 0을 입력: "); int choice = input.nextInt(); if (choice == 1) gamer.hit(deck.pick()); else gamer.stay(); if (Rule.getScore(dealer.getCards()) < 17) dealer.hit(deck.pick()); else dealer.stay(); System.out.println("게이머의 카드는 다음과 같습니다."); gamer.showCards(); System.out.println("딜러의 카드는 다음과 같습니다."); dealer.showCards(); } } ``` ## Deck.java ``` import java.util.LinkedList; import java.util.List; public class Deck { private List<Card> cards; Deck() { this.cards = generateCards(); } private List<Card> generateCards() { LinkedList<Card> cards = new LinkedList<>(); for (Pattern p : Pattern.values()) { for (int i = 1; i <= 13; i++) { Card c = new Card(p, i); cards.add(c); } } return cards; } public Card pick() { int randomIndex = (int) (Math.random() * cards.size()); return cards.remove(randomIndex); } } ``` ### Card.java ``` public class Card { private Pattern pattern; private String denomination; private int point; Card(Pattern pattern, int index) { this.pattern = pattern; this.denomination = getDenomination(index); this.point = getPoint(index); } private int getPoint(int index) { switch (index) { case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: return index; case 11: case 12: case 13: return 10; default: return 0; } } private String getDenomination(int index) { switch (index) { case 1: return "A"; case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: return "" + index; case 11: return "J"; case 12: return "Q"; case 13: return "K"; default: return "ERROR: wrong denomination in Card"; } } @Override public String toString() { return "Card [pattern=" + pattern + ", denomination=" + denomination + ", point=" + point + "]"; } public int getPoint() { return this.point; } } enum Pattern { DIAMOND, CLUB, HEART, SPADE; } ``` ## Rule.java ``` import java.util.List; public class Rule { public static int getScore(List<Card> cards) { int score = 0; for (Card c : cards) { score += c.getPoint(); } return score; } public static void judge(Player dealer, Player gamer) { int dealerScore = getScore(dealer.getCards()); int gamerScore = getScore(gamer.getCards()); if (dealerScore > 21) { if (gamerScore > 21) System.out.println("무승부!"); else System.out.println("게이머 승!"); } else { if (gamerScore > 21) System.out.println("딜러 승!"); else if (gamerScore > dealerScore) System.out.println("게이머 승!"); else if (gamerScore == dealerScore) System.out.println("무승부!"); else System.out.println("딜러 승!"); } System.out.printf("\t딜러(%d) : 게이머(%d)\n", dealerScore, gamerScore); } } ``` ## Player.java ``` public class Player { enum Status { STAY, HIT } private List<Card> cards; private Status status; Player() { this.cards = new LinkedList<Card>(); this.status = Status.HIT; } ... } ```