자바 문제풀이
8주
신림
초급
x 2
### 주제
+ 자바 프로그래밍 문제풀이반
### 목표
+ 실질적인 프로그래밍 능력 향상
### 커리큘럼
+ 연습문제 01
+ 연습문제 02
+ ...
### 대상
+ 자바에 대한 기초 개념을 숙지한 자.
+ 실질적 프로그래밍 능력 향상을 원하는 자.
### 시간 및 장소
+ 협의
### 비용
+ 협의
### 연락처
+ 카톡: chaesam
+ 메일: [email protected]
### 문제
정수 N (0~1,000)을 표현하는 각 자리의 숫자들의 합을 구하는 프로그램을 작성하세요.
[예] 932 정수의 각 자리 숫자들의 합계는 9+3+2=14 입니다.
### 입력 예
```
474
```
### 출력 예
```
15
```
### 힌트
`%`연산자와 `/`연산자를 활용하세요.
```
932 % 10 = 2
932 / 10 = 93
```
### 문제
A, E, I, O, U를 모음이라고 가정했을때, 입력으로 들어온 문자열이 몇개의 모음과 자음으로 구성되어 있는지 출력하는 프로그램을 작성하세요.
### 입력 예
```
2
Programming is fun
Hello World
```
### 출력 예
```
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;
}
}
```
### 문제
요일별 직원들의 작업시간이 아래와 같이 정리되어있다. 매 행에는 직원의 일주일 작업시간이 열로 구분되어 있다. 예를 들어, 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 "직원별 일한시간"
### 문제
블랙잭 게임이 동작 할 수 있도록 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;
}
...
}
```
### 문제
로또 번호 생성기를 만들어 주세요
### 요구사항
+ 중복 숫자가 없도록 할 것.
+ 싫어하는 숫자를 제외하고 번호를 생성할 것.
### 입력 예
```
제거할 숫자들: 13 42 7 33 28
```
### 출력 예
```
생성 번호: 31 6 19 3 23 36
```
## 북 카페
객체 지향 프로그래밍(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원
```
## 격투 게임
평소 알피지 게임을 좋아하던 박컴돌(21) 학생. 어느날 무자비한 PK를 당하고 만다. 아무리 싸워도 이길 수 없음을 깨닫고, 결국 게임을 접고야 만다.
> "아오 빡쳐.. 내가 게임을 만들면, 아무도 날 못이기겠지..?"
### 문제
격투 게임을 만들어 주세요.

### 요구사항
+ 영웅은 다음과 같은 속성을 갖는다.
- 이름
- 체력 (모든 영웅의 기본체력은 100으로 동일)
+ 영웅은 펀치를 통해 상대 영웅에게 피해를 입힐 수 있다.
- 펀치는 랜덤하게 발동된다.
+ 게임은 두 영웅의 생성과 동시에 시작되며 하나가 죽을 때까지 진행된다.
- 반복문을 사용하세요
### 설계

### 기본 코드
```java
import java.util.Random;
public class Hero {
private String name;
private int hp = 100;
// 생성자
public Hero(String name) {
this.name = name;
}
// 펀치
public void punch(Hero enermy) {
enermy.hp -= 10;
System.out.printf("[%s]의 펀치\n", this.name);
System.out.printf("\t%s: %d/100\n", enermy.name, enermy.hp);
}
// 테스트 코드
public static void main(String[] args) throws InterruptedException {
// 두 영웅 객체를 생성
???
// 두 영웅 모두 체력이 남아있다면, 계속 싸움을 진행
while (arthas.hp > 0 && leona.hp > 0) {
// 1/2 확률로 공격자 선정
???
// 대상을 공격
???
// 딜레이 1초
Thread.sleep(1000);
}
}
}
```
## 중간 과제
다음주 수업 첫 시간에 코딩 테스트가 있습니다. 준비해주세요.
+ 03: 한 주에 얼마나 일하나?
+ 05: 로또 머신
### 1. 아래 내용을 복습해주세요
아래의 내용들을 복습하고 동영상 강의에 나오는 예제/실습 코드를 모두 직접 코딩해 주세요.
+ 반복문
+ 배열
+ 클래스와 객체
+ 객체의 생성과 사용
### 2. 아래의 소스코드가 수행되는 과정을 그림으로 표현해주세요.
```
public class Employee {
// 필드
String name;
int[] hours;
// 생성자
Employee(String name, int[] hours) {
this.name = name;
this.hours = hours;
}
// 직원이 일한 시간을 계산
int totalHours() {
int sum = 0;
for (int h : hours)
sum += h;
return sum;
}
public static void main(String[] args) {
// 직원의 이름을 배열로!
String[] names = { "E0", "E1", "E2", "E3", "E4", "E5", "E6", "E7" };
// 직원들이 일한 시간을 배열로!
int[][] hours = {
{ 2, 4, 3, 4, 5, 8, 8 },
{ 7, 3, 4, 3, 3, 4, 4 },
{ 3, 3, 4, 3, 3, 2, 2 },
{ 9, 3, 4, 7, 3, 4, 1 },
{ 3, 5, 4, 3, 6, 3, 8 },
{ 3, 4, 4, 6, 3, 4, 4 },
{ 3, 7, 4, 8, 3, 8, 4 },
{ 6, 3, 5, 9, 2, 7, 9 }
};
// 직원을 가리킬 수 있는 8칸짜리 배열을 생성!
Employee[] employees = new Employee[names.length];
// 위에서 만든 배열에다가 실제 객체를 생성 후 연결!
for (int i = 0; i < names.length; i++) {
employees[i] = new Employee("Tom", hours[i]);
}
// 각각의 객체의 일한 시간을 출력!
for (int i = 0; i < employees.length; i++) {
Employee e = employees[i];
System.out.println(e.totalHours());
}
// 시간에 따라서 객체를 정렬한다!
for (int i = 0; i < employees.length; i++) {
for (int j = i; j < employees.length; j++) {
if (employees[i].totalHours() < employees[j].totalHours()) {
Employee tmp = employees[i];
employees[i] = employees[j];
employees[j] = tmp;
}
}
}
// 최종 출력!
for (Employee e : employees) {
System.out.printf("%s: %d\n", e.name, e.totalHours());
}
}
}
```
### 3. 아래의 소스코드에서 로또번호가 중복 되지 않는 원리를 설명해주세요
```
public class Lotto {
public static void main(String[] args) {
boolean[] isPicked = new boolean[46];
int[] 로또 = new int[6];
for (int j = 0; j < 5; j++) {
int count = 0;
System.out.print(j + 1 + "번째 로또 숫자는 : ");
for (int i = 0; i < 로또.length; i++) {
// 중복되지 않은 수가 나올때 까지 무한히 반복!
while (true) {
로또[i] = generateNumber();
if (isPicked[로또[i]] == false) {
isPicked[로또[i]] = true; // 뽑았다고 기록!
break;
}
}
System.out.print(로또[i]);
count++;
if (count == 로또.length) {
break;
}
System.out.print(", ");
}
System.out.print(" 입니다.\n");
}
}
private static int generateNumber() {
return (int) ((Math.random() * 45) + 1);
}
}
```
# 주사위 만들기
주사위는 면의 개수에 따라서 반환 하는 값이 다릅니다. 일반적인 주사위라고 함은 6개의 면을 가진 주사위로써, 1부터 6사이의 임의의 정수 값을 얻을 수 있습니다.
## 문제
아래의 과정을 따라 최후의 주사위를 출력하는 프로그램을 작성해 주세요
## Step 1
주사위가 이름과 면의 개수 정보를 갖도록 필드를 만들고, 1부터 n사이의 임의의 정수를 반환 하는 메소드 갖도록 클래스를 작성하세요
```
// 주사위 클래스!
public class Dice {
String name;
int n;
// 생성자
Dice(String name, int n) {
this.name = name;
this.n = n;
}
// 주사위를 던짐! 1 ~ n까지의 값을 반환!
int roll() {
return (int) (Math.random() * n) + 1;
}
// main
public static void main(String[] args) {
Dice d10 = new Dice(10);
System.out.println(d10.roll());
}
}
```
## Step 2
**Step 1**에서 만든 클래스를 토대로 1면체 부터 12면체 주사위를 생성하되, 순서대로 12간지의 이름을 붙여 생성해주세요.
```
Dice[] dices = new Dice[12];
dices[0] = new Dice("쥐", 1);
dices[1] = new Dice("소", 2);
dices[2] = new Dice("호랑이", 3);
...
dices[11] = new Dice("돼지", 12);
```
## Step 3
toString() 메소드를 작성하여 아래 형식과 같이 주사위 정보를 출력 할 수 있도록 해주세요.
```
// System.out.println(dices[11].toString());
[돼지] 12면체 주사위 (1 ~ 12)
```
## Step 4
Step 2에서 만든 주사위들을 모두 던져 짝수가 나온 주사위들만 남겨주세요.
```
// 필드값 추가
Dice {
...
boolean isAlive;
}
// main
if (dices[0].roll % 2 == 0)
dices[0].isAlive = true;
else
dices[0].isAlive = false;
```
## Step 5
Step 4의 과정을 주사위가 하나도 남지 않을 때까지 반복 한뒤, 가장 마지막까지 살아남은 주사위의 이름을 출력해주세요.
```
// 출력 예
[호랑이] 3면체 주사위 (1 ~ 3)
[돼지] 12면체 주사위 (1 ~ 12)
```
# 소개팅 매칭
요즘 유행인 소개팅 어플은 외모를 점수화 하여 비슷한 점수대의 회원들 끼리 매칭을 시켜준다고 합니다.
## 문제
아래 과정을 통해 연결가능한 소개팅 매칭 쌍을 찾아주세요.
## 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
```