[명품자바프로그래밍] 5판 6장 실습문제

hyeseong·2024년 12월 26일
0

명품자바프로그래밍

목록 보기
10/12

명품자바프로그래밍 개정5판 6장 연습문제 실습문제 풀이 p.393-400

1번

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("다른 학생입니다.");
	}

}

2번

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("다른 책");
	}

}

3번

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());
	}
}

4번

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번

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() : 총 토큰 개수 리턴

6번

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까지 리턴

7번

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();

	}

}

8번

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();
    }
}

9번

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();
	}

}

10번

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초(밀리초)로 반환

11번



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();
	}
}

12번


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();
	}

}

개인 풀이이므로 틀린 부분이나 피드백이 있으면 댓글로 남겨주시면 감사하겠습니다!

0개의 댓글