명품자바프로그래밍 개정5판 6장 연습문제 실습문제 풀이 p.393-400
class Student {
private String name;
private int id;
public Student(String name, int id) {
this.name=name;
this.id=id;
}
@Override
public String toString() {
return "학번이 " + id + "인 " + name;
}
@Override
public boolean equals(Object obj) {
Student student = (Student)obj;
if(this.name.equals(student.name) && this.id == student.id)
return true;
else
return false;
}
}
public class StudentApp {
public static void main(String[] args) {
Student a = new Student("황기태", 23);
Student b = new Student("황기태", 77);
System.out.println(a);
if(a.equals(b))
System.out.println("같은 학생입니다.");
else
System.out.println("다른 학생입니다.");
}
}
class Book {
private String author, name, buyer;
public Book(String author, String name, String buyer) {
this.author = author;
this.name = name;
this.buyer = buyer;
}
@Override
public String toString() {
return buyer+"이(가) 구입한 도서: " + author+ "의 " + name;
}
@Override
public boolean equals(Object obj) {
Book b = (Book)obj;
if(author.equals(b.author) && name.equals(b.name)) {
return true;
}
else {
return false;
}
}
}
public class BookApp {
public static void main(String[] args) {
Book a = new Book("황기태", "명품자바", "김하진");
Book b = new Book("황기태", "명품자바", "하여린");
System.out.println(a);
System.out.println(b);
if(a.equals(b))
System.out.println("같은 책");
else
System.out.println("다른 책");
}
}
Calc 클래스
package util;
public class Calc {
private int x,y;
public Calc(int x, int y) { this.x=x; this.y=y; }
public int sum() { return x+y; }
}
MainApp 클래스
package main;
import util.Calc;
public class MainApp {
public static void main(String[] args) {
Calc c = new Calc(10, 20);
System.out.println(c.sum());
}
}
Shape 클래스
package graphic;
public class Shape {
public void draw() { System.out.println("Shpae"); }
}
Circle 클래스
package component;
import graphic.Shape;
public class Circle extends Shape{
public void draw() { System.out.println("Circle"); }
}
GraphicEditord 클래스
package app;
import graphic.Shape;
import component.Circle;
public class GraphicEditor {
public static void main(String[] args) {
Shape shape = new Circle();
shape.draw();
}
}
5-1번
import java.util.Scanner;
public class GradeApp {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(true) {
System.out.print("여러 과목의 학점을 빈 칸으로 분리 입력>>");
String line = scanner.nextLine();
if(line.equals("그만"))
break;
String [] gradeArray = line.split(" ");
boolean isError = false;
String errorInput = new String();
double sum = 0;
for(String s : gradeArray) {
switch(s) {
case "A" : case "a": sum+=100; break;
case "B" : case "b": sum+=90; break;
case "C" : case "c": sum+=80; break;
case "D" : case "d": sum+=70; break;
case "F" : case "f": sum+=0; break;
default:
isError = true;
errorInput = s;
break;
}
}
if(isError == true) {
System.out.println("입력 오류: "+ errorInput);
}
else {
System.out.println("평균은 " + sum/gradeArray.length);
}
}
scanner.close();
}
}
5-2번
import java.util.Scanner;
import java.util.StringTokenizer;
public class GradeApp2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(true) {
System.out.print("여러 과목의 학점을 빈 칸으로 분리 입력>>");
String line = scanner.nextLine();
if(line.equals("그만"))
break;
StringTokenizer st = new StringTokenizer(line, " ");
int count = st.countTokens();
boolean isError = false;
String errorInput = new String();
double sum = 0;
while(st.hasMoreTokens()) {
String s = st.nextToken();
switch(s) {
case "A" : case "a": sum+=100; break;
case "B" : case "b": sum+=90; break;
case "C" : case "c": sum+=80; break;
case "D" : case "d": sum+=70; break;
case "F" : case "f": sum+=0; break;
default:
isError = true;
errorInput = s;
break;
}
}
if(isError == true) {
System.out.println("입력 오류: "+ errorInput);
}
else {
System.out.println("평균은 " + sum/count);
}
}
scanner.close();
}
}
StringTokenizer 주요 메서드
boolean hasMoreTokens()
: 남아있는 토큰이 있으면 true, 없으면 false 리턴
String nextToken()
: 다음 토큰 리턴
int countTokens()
: 총 토큰 개수 리턴
import java.util.Scanner;
public class StringRotate {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("문자열을 입력하세요. 빈 칸이 있어도 되고 영어 한글 모두 됩니다.");
String str = scanner.nextLine();
for(int i=1; i<=str.length(); i++) {
System.out.print(str.substring(i));
System.out.println(str.substring(0,i));
}
scanner.close();
}
}
substring() 함수
String substring(int beginIndex)
: beginIndex 부터 시작하여 리턴
String substring(int beginIndex, int endIndex)
: beginIndex부터 endIndex까지 리턴
import java.util.Calendar;
import java.util.Scanner;
public class CalendarApp {
public static void makeCalendar(int year) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
for(int i=0; i<12; i++) {
System.out.println("\n" + year + "년 " + (i+1)+ "월 ");
System.out.println("일\t월\t화\t수\t목\t금\t토");
calendar.set(Calendar.MONTH, i);
calendar.set(Calendar.DAY_OF_MONTH, 1);
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
for (int j = 0; j < dayOfWeek - 1; j++)
System.out.print("\t");
int lastDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
for (int j = 1; j <= lastDay; j++) {
System.out.print(j + "\t");
if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY)
System.out.println();
calendar.set(Calendar.DAY_OF_MONTH, j + 1);
}
System.out.println();
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(true) {
System.out.print("년도 입력(-1이면 종료)>>");
int year = scanner.nextInt();
if(year == -1) break;
makeCalendar(year);
}
scanner.close();
}
}
import java.util.Calendar;
import java.util.Scanner;
import java.util.StringTokenizer;
public class CalendarApp {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Calendar now = Calendar.getInstance(); // 현재 날짜
// 현재 날짜의 시간을 0:0:0으로 설정
now.set(Calendar.HOUR_OF_DAY, 0);
now.set(Calendar.MINUTE, 0);
now.set(Calendar.SECOND, 0);
now.set(Calendar.MILLISECOND, 0);
// 현재 날짜 출력
System.out.printf("오늘은 %d년 %d월 %d일\n",
now.get(Calendar.YEAR),
now.get(Calendar.MONTH) + 1,
now.get(Calendar.DAY_OF_MONTH));
while(true) {
System.out.print("생일 입력(년 월 일)>>");
String input = scanner.nextLine();
if(input.equals("그만"))
break;
StringTokenizer st = new StringTokenizer(input, " ");
int year = Integer.parseInt(st.nextToken());
int month = Integer.parseInt(st.nextToken());
int day = Integer.parseInt(st.nextToken());
Calendar inputDate = Calendar.getInstance();
inputDate.set(year, month-1, day);
// 입력받은 날짜도 시간을 0:0:0으로 설정
inputDate.set(Calendar.HOUR_OF_DAY, 0);
inputDate.set(Calendar.MINUTE, 0);
inputDate.set(Calendar.SECOND, 0);
inputDate.set(Calendar.MILLISECOND, 0);
long diffDays = (now.getTimeInMillis() - inputDate.getTimeInMillis())
/ (24*60*60*1000);
if(diffDays > 0)
System.out.println("오늘까지 " + diffDays + "일 살아왔습니다.");
else if(diffDays < 0)
System.out.println(Math.abs(diffDays) + "일 더 살아야 생일이 됩니다.");
else
System.out.println("오늘입니다.");
}
scanner.close();
}
}
import java.util.Scanner;
public class RandomWord {
private final static char BASE_CHAR = '-';
private char [][] board = new char[5][5];
public RandomWord() {
clearBoard();
}
private void clearBoard() {
for(int i=0; i<board.length; i++) {
for(int j = 0; j<board[i].length; j++) {
board[i][j] = BASE_CHAR;
}
}
}
private void printBoard() {
for(int i=0; i<board.length; i++) {
for(int j = 0; j<board[i].length; j++) {
System.out.print(board[i][j] + " ");
}
System.out.println();
}
System.out.println();
}
private void put(int row, int col, int dir, String word) {
switch(dir) {
case 0:
for(int i=0; i<word.length(); i++) {
board[row][col] = word.charAt(i);
row--;
}
break;
case 1:
for(int i=0; i<word.length(); i++) {
board[row][col] = word.charAt(i);
row--; col++;
}
break;
case 2:
for(int i=0; i<word.length(); i++) {
board[row][col] = word.charAt(i);
col++;
}
break;
case 3:
for(int i=0; i<word.length(); i++) {
board[row][col] = word.charAt(i);
row++; col++;
}
break;
case 4:
for(int i=0; i<word.length(); i++) {
board[row][col] = word.charAt(i);
row++;
}
break;
case 5:
for(int i=0; i<word.length(); i++) {
board[row][col] = word.charAt(i);
row++; col--;
}
break;
case 6:
for(int i=0; i<word.length(); i++) {
board[row][col] = word.charAt(i);
col--;
}
break;
case 7:
for(int i=0; i<word.length(); i++) {
board[row][col] = word.charAt(i);
row--; col--;
}
break;
}
}
private boolean isPossible(int row, int col, int dir, int length) {
int rowSpan = 0; // 행 방향(아래위)로 저장 가능한 글자 개수
int colSpan = 0; // 열 방향(좌우)으로 저장 가능한 글자 개수
switch(dir) {
case 0:
rowSpan = row + 1;
if(rowSpan < length) return false;
else return true;
case 1:
rowSpan = row + 1;
colSpan = board[row].length - col;
if(rowSpan < length || colSpan < length) return false;
else return true;
case 2:
colSpan = board[row].length - col;
if(colSpan < length) return false;
else return true;
case 3:
rowSpan = board.length - row;
colSpan = board[row].length - col;
if(rowSpan < length || colSpan < length) return false;
else return true;
case 4:
rowSpan = board.length - row;
if(rowSpan < length) return false;
else return true;
case 5:
rowSpan = board.length - row;
colSpan = col + 1;
if(rowSpan < length || colSpan < length) return false;
else return true;
case 6:
colSpan = col + 1;
if(colSpan < length) return false;
else return true;
case 7:
rowSpan = row + 1;
colSpan = col + 1;
if(rowSpan < length || colSpan < length) return false;
else return true;
default:
return false;
}
}
private void place(String word) {
while(true) {
int row = (int)(Math.random()*board.length);
int col = (int)(Math.random()*board[row].length);
int dir [] = new int[8]; // 8개의 방향을 저장하기 위한 배열
//0:위, 1:오른쪽 위, 2: 오른쪽,... 시계 방향, 7:왼쪽 위
int index = (int)(Math.random()*8); // 시작 방향 결정
for(int i=0; i<8; i++) {
dir[index] = i;
index++;
index %= 8;
}
// dir[] 배열에 정해진 순서대로 최대 8방향으로 배치 가능하면 단어 내장
for(int i=0; i<8; i++) {
if(isPossible(row, col, dir[i], word.length())) {
put(row, col, dir[i], word);
return;
}
}
}
}
private void fill() {
for(int i=0; i<board.length; i++) {
for(int j = 0; j<board[i].length; j++) {
if(board[i][j] == BASE_CHAR) {
board[i][j] = (char)(Math.random()*26);
board[i][j] += 'a';
}
}
}
}
public void run() {
Scanner scanner = new Scanner(System.in);
while(true) {
System.out.print("단어>>");
String word = scanner.next();
if(word.equals("그만"))
break;
else if(word.length() > 5 || word.length() > 5) {
System.out.println("단어가 보드 크기보다 깁니다.");
continue;
}
clearBoard();
place(word);
fill(); // 빈 칸에 랜덤글자 채우기
printBoard();
}
scanner.close();
}
public static void main(String[] args) {
RandomWord we = new RandomWord();
we.run();
}
}
import java.util.Scanner;
import java.util.Random;
public class WordQuiz {
Scanner scanner = new Scanner(System.in);
Random r = new Random();
private String[] words = {"happy", "morning", "package", "together"};
public WordQuiz() {
}
private void mixWord(int no) {
char[] arr = words[no].toCharArray();
for (int i = arr.length - 1; i > 0; i--) {
int j = r.nextInt(i + 1);
char temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
for(int i=0; i<arr.length; i++) {
System.out.print(arr[i]);
}
System.out.println();
}
public void run() {
System.out.println("10초 안에 단어를 맞추세요!!");
for(int i=0; i<words.length; i++) {
mixWord(i);
double startTime = System.currentTimeMillis(); // 시작 시간
System.out.print(">>");
String answer = scanner.next();
if(answer.equals("그만")) System.exit(0); // 종료
double endTime = System.currentTimeMillis(); // 종료 시간
double totalTime = (endTime-startTime)/1000; // 소요 시간
if(totalTime>10)
System.out.print("실패!!! 10초 초과. ");
else if(words[i].equals(answer))
System.out.print("성공!!! ");
else
System.out.print("실패!!! " + words[i] + " 입니다. ");
System.out.println(totalTime + "초 경과");
}
}
public static void main(String[] args) {
WordQuiz quiz = new WordQuiz();
quiz.run();
}
}
toCharArray()
: String 문자열을 char형 배열로 바꿔 반환해주는 String 클래스의 메서드
System.currentTimeMillis()
: 1970년 1월 1일 이후 경과된 시간을 1000분의 1초(밀리초)로 반환
Player 클래스
import java.util.Scanner;
public class Player {
private String name;
Scanner scanner = new Scanner(System.in);
public Player(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void getEnterKey() {
scanner.nextLine();
}
public boolean turn() {
System.out.print("[" + name + "]:<Enter>");
getEnterKey();
int num[] = new int [3];
// 난수 생성
for (int i=0; i<num.length; i++) {
num[i] = (int)(Math.random()*3 + 1);
}
// 난수 출력
System.out.print("\t");
for (int i=0; i<num.length; i++) {
System.out.print(num[i]+" ");
}
// 난수 비교
boolean result = true;
for (int i=0; i<num.length; i++) {
if (num[i] != num[0]) {
result = false;
break;
}
}
return result;
}
}
GamblingGame 클래스
import java.util.Scanner;
public class GamblingGame {
private Player [] players;
Scanner scanner = new Scanner(System.in);
public GamblingGame() {
System.out.print("갬블링 게임에 참여할 선수 숫자>>");
int nPlayers = scanner.nextInt();
scanner.nextLine();
players = new Player[nPlayers];
for(int i=0; i<players.length; i++) {
System.out.print((i+1)+"번째 선수 이름>>");
players[i] = new Player(scanner.nextLine());
}
}
public void run() {
int i=0;
while (true) {
if (players[i].turn()) {
System.out.println(players[i].getName()+"님이 이겼습니다!");
break;
}
else {
System.out.println("아쉽군요!");
i++;
i = i%players.length;
}
}
}
public static void main(String[] args) {
GamblingGame game = new GamblingGame();
game.run();
}
}
Player 클래스
import java.util.Scanner;
public class Player {
private String name;
private int number;
private int matchCount;
Scanner scanner = new Scanner(System.in);
public Player(String name) {this.name = name;}
public String getName() {return name;}
public int getNumber() {return number;}
public void setNumber(int number) {this.number = number;}
public int getMatchCount() { return matchCount; }
public void setMatchCount(int count) { this.matchCount = count; }
public void selectNum() {
System.out.print("[" + getName() + "] 정수 선택(1~10)>>");
//int input = scanner.nextInt();
int input = Integer.parseInt(scanner.nextLine());
setNumber(input);
}
}
NumberExpectationGame 클래스
import java.util.*;
public class NumberExpectationGame {
private List<Player> players;
private int[] numbers;
Scanner scanner = new Scanner(System.in);
Random r = new Random();
public NumberExpectationGame() {
System.out.print("게임에 참여할 선수들 이름>>");
String names = scanner.nextLine();
StringTokenizer st = new StringTokenizer(names, " ");
players = new ArrayList<>();
numbers = new int[15];
int i = 0;
while(st.hasMoreTokens()) {
String playerName = st.nextToken();
players.add(new Player(playerName));
i++;
}
}
// 난수 생성 후 출력
public void randomNumbers() {
for(int i=0; i<numbers.length; i++) {
numbers[i] = r.nextInt(10) + 1;
System.out.print(numbers[i] + " ");
}
System.out.println();
}
public void getEnterKey() {
System.out.print("Enter키 입력>>");
scanner.nextLine();
}
// 맞춘 개수 count 후 출력
public void countMatchNumber() {
for(Player p : players) {
int count = 0;
for(int j = 0; j < numbers.length; j++) {
if(numbers[j] == p.getNumber())
count++;
}
p.setMatchCount(count);
System.out.println("[" + p.getName() + "] 맞춘 개수: " + p.getMatchCount());
}
}
public void checkWinner() {
final int maxCount = findMaxCount();
players.removeIf(p -> p.getMatchCount() == maxCount);
if(players.size() == 1) {
System.out.println("최종 패자는 " + players.get(0).getName() + "입니다.");
System.exit(0);
} else {
System.out.print("현재 패자들: ");
for(int i = 0; i < players.size(); i++) {
System.out.print(players.get(i).getName());
if(i < players.size() - 1) {
System.out.print(" ");
}
}
System.out.println();
}
}
private int findMaxCount() {
int max = 0;
for(Player p : players) {
if(p.getMatchCount() > max) {
max = p.getMatchCount();
}
}
return max;
}
public void run() {
for(Player p : players) {
p.selectNum();
}
while(true) {
getEnterKey();
randomNumbers();
countMatchNumber();
checkWinner();
}
}
public static void main(String[] args) {
NumberExpectationGame game = new NumberExpectationGame();
game.run();
}
}
개인 풀이이므로 틀린 부분이나 피드백이 있으면 댓글로 남겨주시면 감사하겠습니다!