자바 1000제
1주
강남
입문
x 1
### 주제
+ 실전 프로그래밍 연습
### 목표
+ 프로그래밍을 통한 실전적 문제 해결능력 향상
+ 객체지향적 분석 및 설계 능력 향상
### 커리큘럼
+ 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 초 후 고도를 구하는 프로그램을 제공되는 코드를 활용하여 작성해주세요. (등가속운동을 하는 물체의 이동거리 공식을 이용할 것)

## 뼈대 코드
```
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) 평창 동계 올림픽의 메달순위 결과는 아래와 같습니다.

## 문제
앞으로 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)
## 설계: 클래스 다이어그램

## 제공 코드
```
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) 으로 함.
## 설계

## 뼈대코드
```
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: 연봉 구하기**에서 제시된 연봉을 받는다.
## 설계

## 뼈대코드
```
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) 평창 동계 올림픽의 메달순위 결과는 아래와 같습니다.

## 문제
앞으로 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;
}
...
}
```