명품자바프로그래밍 개정5판 7장 연습문제 실습문제 풀이 p.448-455
import java.util.Scanner;
import java.util.Vector;
public class IntVector {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Vector<Integer> numbers = new Vector<Integer>();
System.out.print("정수 입력(-1이면 입력 끝)>>");
while(true) {
int num = scanner.nextInt();
if(num==-1) break;
numbers.add(num);
}
int min = numbers.get(0);
for(int i=0; i<numbers.size(); i++) {
if(min>numbers.get(i))
min=numbers.get(i);
}
System.out.println("제일 작은 수는 "+ min);
scanner.close();
}
}
import java.util.Scanner;
import java.util.Vector;
public class SumPositives {
private Vector<Integer> v = new Vector<Integer>();
Scanner scanner = new Scanner(System.in);
public void read() {
System.out.print("0이 입력될 때까지 정수 입력>>");
while(true) {
int num = scanner.nextInt();
if(num==0) return;
v.add(num);
}
}
public void changeToZero() {
for(int i = 0; i<v.size(); i++) {
int value = v.get(i);
if(value < 0) {
v.set(i, 0);
}
}
}
public void showAll() {
for(int i=0; i<v.size(); i++) {
System.out.print(v.get(i) + " ");
}
System.out.println();
}
public int add() {
int sum = 0;
for(int i = 0; i<v.size(); i++) {
sum += v.get(i);
}
return sum;
}
public static void main(String[] args) {
SumPositives sp = new SumPositives();
sp.read();
sp.changeToZero(); // 벡터 v에 저장된 음수들을 모두 0으로 변경
System.out.print("음수를 0으로 바꾸면 ");
sp.showAll(); // 벡터 v의 원소들을 모두 출력
System.out.println("양수들의 합은 " + sp.add()); // 벡터 v의 양수들의 합 출력
}
}
import java.util.HashMap;
import java.util.Scanner;
public class Stocks {
private HashMap<String, Integer> h = new HashMap<String, Integer>();
Scanner scanner = new Scanner(System.in);
public void read() {
System.out.println("주식 종목과 주가를 입력하세요(예:삼송전자 75000)");
while(true) {
System.out.print("종목, 주가>>");
String name = scanner.next();
if(name.equals("그만")) return;
int value = scanner.nextInt();
h.put(name, value);
}
}
public void search() {
System.out.println("주가를 검색합니다.");
while(true) {
System.out.print("종목>>");
String input = scanner.next();
if(input.equals("그만")) return;
find(input);
}
}
public boolean find(String input) {
if(h.containsKey(input)) {
System.out.println(input + "의 주가는 " + h.get(input) + "원");
return true;
}
System.out.println(input + "은 없는 종목입니다.");
return false;
}
public static void main(String[] args) {
Stocks stocks = new Stocks();
stocks.read();
stocks.search();
}
}
4-(1)
import java.util.HashMap;
import java.util.Scanner;
public class ShoppingCost {
private HashMap<String, Integer> h = new HashMap<String, Integer>();
Scanner scanner = new Scanner(System.in);
public ShoppingCost() {
h.put("고추장", 3000);
h.put("만두", 500);
h.put("새우깡", 1500);
h.put("콜라", 600);
h.put("참치캔", 2000);
h.put("치약", 1000);
h.put("연어", 2500);
h.put("삼겹살", 2500);
}
public void printAll() {
System.out.print("[");
int count = 0;
for(String key : h.keySet()) {
System.out.print(key + "," + h.get(key) + "]");
count++;
if(count < h.size()) {
System.out.print("[");
}
}
System.out.println();
}
public void run() {
System.out.println("쇼핑 비용을 계산해드립니다. 구입 가능 물건과 가격은 다음과 같습니다.");
printAll();
while(true) {
System.out.print("물건과 개수를 입력하세요>>");
String s = scanner.nextLine();
calculate(s);
if(s.equals("그만")) break;
}
}
public void calculate(String input) {
if(input.equals("그만")) return;
String[] items = input.split(" ");
int sum = 0;
try {
for(int i = 0; i < items.length; i += 2) {
String item = items[i];
int quantity = Integer.parseInt(items[i + 1]);
if(h.containsKey(item)) {
sum += h.get(item) * quantity;
} else {
System.out.println(item + "은 없는 상품입니다!");
return;
}
}
System.out.println("전체 비용은 " + sum + "원입니다.");
} catch(Exception e) {
System.out.println("입력에 문제가 있습니다!");
}
}
public static void main(String[] args) {
ShoppingCost sc = new ShoppingCost();
sc.run();
}
}
import java.util.HashMap;
import java.util.Scanner;
public class AirlineMileage {
private HashMap<String, Integer> h = new HashMap<String, Integer>();
Scanner scanner = new Scanner(System.in);
public void printAll() {
System.out.print("(");
int count = 0;
for(String key : h.keySet()) {
System.out.print(key + "," + h.get(key) + ")");
count++;
if(count < h.size()) {
System.out.print("(");
}
}
System.out.println();
}
public void run() {
System.out.println("*** 마일리지 관리 프로그램입니다.***");
while(true) {
System.out.print("이름과 마일리지>>");
String name = scanner.next();
if(name.equals("그만")) break;
int mileage = scanner.nextInt();
// 기존 마일리지가 있다면 누적
if(h.containsKey(name)) {
int currentMileage = h.get(name);
h.put(name, currentMileage + mileage);
} else {
h.put(name, mileage);
}
}
printAll();
calculate();
System.out.println("프로그램을 종료합니다.");
}
public void calculate() {
String maxUser = "";
int maxMileage = 0;
for(String name : h.keySet()) {
int mileage = h.get(name);
if(maxMileage < mileage) {
maxMileage = mileage;
maxUser = name;
}
}
if(!maxUser.equals("")) {
System.out.println("가장 마일리지가 높은 고객은 " + maxUser + "입니다.");
}
}
public static void main(String[] args) {
AirlineMileage am = new AirlineMileage();
am.run();
}
}
import java.util.HashMap;
import java.util.Scanner;
public class BankApp {
private HashMap<String, Integer> h = new HashMap<String, Integer>();
Scanner scanner = new Scanner(System.in);
public void deposit() {
System.out.print("계좌명과 액수>>");
String name = scanner.next();
int money = scanner.nextInt();
// 기존 계좌가 있다면 잔액 누적
if(h.containsKey(name)) {
int currentMoney = h.get(name);
h.put(name, currentMoney + money);
} else {
h.put(name, money);
}
}
public void withdraw() {
System.out.print("계좌명과 액수>>");
String name = scanner.next();
int money = scanner.nextInt();
// 계좌가 존재하는지 확인
if(!h.containsKey(name)) {
System.out.println("해당 계좌가 존재하지 않습니다!");
return;
}
int currentMoney = h.get(name);
if(currentMoney >= money) {
h.put(name, currentMoney - money);
} else {
System.out.println("잔액이 부족하여 출금할 수 없음!!");
}
}
public void check() {
System.out.print("계좌명>>");
String checkName = scanner.next();
for(String key : h.keySet()) {
if(key.equals(checkName)) {
System.out.println("(" + key + ":" + h.get(key) + "원)");
break;
}
}
}
public void printAll() {
System.out.print("(");
int count = 0;
for(String key : h.keySet()) {
System.out.print(key + ":" + h.get(key) + "원)");
count++;
if(count < h.size()) {
System.out.print("(");
}
}
System.out.println();
}
public void run() {
System.out.println("*** 명품 은행에 오신 것을 환영합니다. ***");
while(true) {
System.out.print("입금:1, 출금:2, 조회:3, 전체 조회:4, 종료:5>>");
int choice = scanner.nextInt();
switch(choice) {
case 1: deposit(); break;
case 2: withdraw(); break;
case 3: check(); break;
case 4: printAll(); break;
case 5: System.out.println("프로그램을 종료합니다."); return;
default:
System.out.println("다시 입력해주세요!"); break;
}
}
}
public static void main(String[] args) {
BankApp bank = new BankApp();
bank.run();
}
}
Location 클래스
public class Location {
private String city;
private double longitude; // 경도
private double latitude; // 위도
public Location(String city, double longitude, double latitude) {
this.city = city;
this.longitude = longitude;
this.latitude = latitude;
}
public void setCity(String city) {this.city = city;}
public String getCity() {return city;}
public void setLogitude(double longitude) {this.longitude = longitude;}
public double getLongitude() {return longitude;}
public void setLatitude(double latitude) {this.latitude = latitude;}
public double getLatitude() {return latitude;}
}
LocationManager 클래스
import java.util.*;
public class LocationManager {
private Scanner scanner = new Scanner(System.in);
private HashMap<String, Location> locMap = new HashMap<String, Location>();
private void read() {
System.out.println("도시,경도,위도를 입력하세요.");
for (int i=0; i<4; i++) {
System.out.print(">> ");
String text = scanner.nextLine();
StringTokenizer st = new StringTokenizer(text, ",");
String city = st.nextToken().trim();
double logitude = Double.parseDouble(st.nextToken().trim());
double latitude = Double.parseDouble(st.nextToken().trim());
Location loc = new Location(city, logitude, latitude);
locMap.put(city, loc); //해시맵에 저장
}
}
private void printAll() {
Set<String> key = locMap.keySet();
Iterator<String> it = key.iterator();
System.out.println("---------------------------");
while (it.hasNext()) {
String city = it.next();
Location loc = locMap.get(city);
System.out.print(loc.getCity() + "\t");
System.out.print(loc.getLongitude() + "\t");
System.out.println(loc.getLatitude());
}
System.out.println("---------------------------");
}
private void processQuery() {
while(true) {
System.out.print("도시 이름 >> ");
String city = scanner.nextLine();
if(city.equals("그만"))
return; // 종료
Location loc = locMap.get(city);
if(loc == null) {
System.out.println(city + "는 없습니다.");
}
else {
System.out.print(loc.getCity() + "\t");
System.out.print(loc.getLongitude() + "\t");
System.out.println(loc.getLatitude());
}
}
}
public void run() {
read();
printAll();
processQuery();
}
public static void main (String[] args) {
LocationManager man = new LocationManager();
man.run();
}
}
Student 클래스
public class Student {
private String name;
private String major;
private int studentId; // 학번
private double grade; // 학점
public Student(String name, String major, int studentId, double grade) {
this.name=name;
this.major=major;
this.studentId=studentId;
this.grade=grade;
}
public void setName(String name) {this.name = name;}
public String getName() {return name;}
public void setmajor(String major) {this.major = major;}
public String getmajor() {return major;}
public void setStudentId(int studentId) {this.studentId = studentId;}
public int getStudentId() {return studentId;}
public void setgrade(double grade) {this.grade = grade;}
public double getgrade() {return grade;}
}
StudentManager 클래스
import java.util.*;
public class StudentManager {
private Scanner scanner = new Scanner(System.in);
private Vector<Student> students = new Vector<Student>();
private void read() {
System.out.println("4명 이름, 전공, 학번, 학점 입력");
for (int i=0; i<4; i++) {
System.out.print(">> ");
String text = scanner.nextLine();
StringTokenizer st = new StringTokenizer(text, ",");
String name = st.nextToken().trim();
String major = st.nextToken().trim();
int studentId = Integer.parseInt(st.nextToken().trim());
double grade = Double.parseDouble(st.nextToken().trim());
Student std = new Student(name, major, studentId, grade);
students.add(std);
}
}
private void printAll() {
System.out.println("---------------------------");
for(Student std : students) {
System.out.print("이름:" + std.getName() + "\t");
System.out.print("전공:" + std.getMajor() + "\t");
System.out.print("학번:" + std.getStudentId() + "\t");
System.out.println("학점평균:" + std.getGrade());
}
System.out.println("---------------------------");
}
private void printScholar(){
System.out.print("장학생: ");
for(Student std : students){
if(std.getGrade() > 4.0)
System.out.print(std.getName() + " ");
}
System.out.println();
System.out.println("---------------------------");
}
private void processQuery() {
while(true) {
boolean isFound = false;
System.out.print("학생 이름 >> ");
String name = scanner.nextLine();
if(name.equals("그만")) return; // 종료
for(Student std : students) {
if(name.equals(std.getName())) {
System.out.print(std.getName() + ", ");
System.out.print(std.getMajor() + ", ");
System.out.print(std.getStudentId() + ", ");
System.out.println(std.getGrade());
isFound = true;
break;
}
}
if(!isFound) System.out.println(name+" 학생이 없습니다.");
}
}
public void run() {
read();
printAll();
printScholar();
processQuery();
}
public static void main (String[] args) {
StudentManager app = new StudentManager();
app.run();
}
}
import java.util.Scanner;
import java.util.Vector;
abstract class Shape {
private Shape next;
public Shape() { next = null;}
public void setNext(Shape obj) {next = obj;} // 링크 연결
public Shape getNext() {return next;}
public abstract void draw(); // 추상 메소드
}
class Circle extends Shape {
@Override
public void draw() {
System.out.println("Circle");
}
}
class Rect extends Shape {
@Override
public void draw() {
System.out.println("Rect");
}
}
class Line extends Shape {
@Override
public void draw() {
System.out.println("Line");
}
}
public class GraphicEditor {
private String editorName;
private Scanner scanner = new Scanner(System.in);
private Vector<Shape> v = new Vector<Shape>();
public GraphicEditor(String editorName) {
this.editorName = editorName;
}
public void run() {
System.out.println("그래픽 에디터 " + editorName + "를 실행합니다.");
int menu = 0;
while (menu != 4) {
int shape, index;
System.out.print("삽입(1), 삭제(2), 모두 보기(3), 종료(4)>>");
menu = scanner.nextInt();
switch (menu) {
case 1: // 삽입
System.out.print("Line(1), Rect(2), Circle(3)>>");
shape = scanner.nextInt();
if (shape < 1 || shape > 3) {
System.out.println("잘못 선택하셨습니다.");
break;
}
insert(shape);
break;
case 2: // 삭제
System.out.print("삭제할 도형의 위치>>");
index = scanner.nextInt();
if (!delete(index)) {
System.out.println("삭제할 수 없습니다.");
}
break;
case 3: // 모두 보기
view();
break;
case 4: // 끝내기
break;
default:
System.out.println("잘못 입력하셨습니다.");
}
}
System.out.println(editorName + "를 종료합니다.");
}
private void view() {
for(int i=0; i<v.size(); i++)
v.get(i).draw();
}
private boolean delete(int index) {
if (v.size() == 0 || index >= v.size())
return false;
v.remove(index);
return true;
}
private void insert(int choice) {
Shape shape=null;
switch (choice) {
case 1: // Line
shape = new Line();
break;
case 2: // Rect
shape = new Rect();
break;
case 3: // Circle
shape = new Circle();
}
v.add(shape);
}
public static void main(String [] args) {
GraphicEditor ge = new GraphicEditor("Beauty Graphic Editor");
ge.run();
}
}
import java.util.*;
public class RemoveDuplicateWords {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(true) {
System.out.print("문자열을 입력하세요>>");
String input = scanner.nextLine();
if(input.equals("그만")) break;
String[] words = input.split(" ");
ArrayList<String> uniqueWords = new ArrayList<>();
// 중복되지 않은 단어만 ArrayList에 추가
for(String word : words) {
if(!uniqueWords.contains(word)) {
uniqueWords.add(word);
}
}
// 결과 출력
for(String word : uniqueWords) {
System.out.print(word + " ");
}
System.out.println();
}
scanner.close();
}
}
import java.util.HashMap;
import java.util.Scanner;
import java.util.*;
public class WalkingStepManager {
private HashMap<String, ArrayList<Integer>> map = new HashMap<String, ArrayList<Integer>>();
private Scanner scanner = new Scanner(System.in);
public WalkingStepManager() { }
private void read() {
while(true) {
System.out.print("이름과 걸음수>>");
String line = scanner.nextLine();
if(line.equals("그만"))
break;
String [] tokens = line.split(" ");
String name = tokens[0];
ArrayList<Integer> list = map.get(name);
if(list == null) {
list = new ArrayList<Integer>();
map.put(name, list);
}
for(int i=0; i<tokens.length - 1; i++)
list.add(Integer.parseInt(tokens[i+1]));
}
}
private void decideBest() {
Set<String> keys = map.keySet();
Iterator<String> it = keys.iterator();
String bestName = "";
int bestWalkSum = 0;
while(it.hasNext()) {
String name = it.next();
ArrayList<Integer> list = map.get(name);
int sum = 0;
for(int walk : list)
sum += walk;
if(bestWalkSum < sum) {
bestWalkSum = sum;
bestName = name;
}
}
System.out.println("걸음수가 가장 많은 사람은 " + bestName + " " + bestWalkSum + "보");
}
private void search() {
while(true) {
System.out.print("검색할 이름>>");
String name = scanner.next();
if(name.equals("그만"))
break;
ArrayList<Integer> list = map.get(name);
if(list == null) {
System.out.println(name + "은 없는 학생입니다.");
continue;
}
int sum = 0;
for(int score : list) {
System.out.print(score + " ");
sum += score;
}
System.out.println("평균 " + sum/list.size());
}
}
public void run() {
read();
decideBest();
search();
}
public static void main(String[] args) {
WalkingStepManager man = new WalkingStepManager();
man.run();
}
}
import java.util.*;
public class VirtualMachine {
private List<List<String>> program; // 프로그램 저장
private Map<String, Integer> variables; // 변수 저장
private int programCounter; // 현재 실행 중인 명령어 위치
public VirtualMachine() {
this.program = new ArrayList<>();
this.variables = new HashMap<>();
this.programCounter = 0;
}
// 프로그램 라인 추가
public void addProgramLine(String line) {
List<String> tokens = new ArrayList<>();
StringTokenizer st = new StringTokenizer(line);
while (st.hasMoreTokens()) {
tokens.add(st.nextToken());
}
if (!tokens.isEmpty()) {
program.add(tokens);
}
}
// 명령어 실행 메서드들
private void executeMove(String var, String value) {
int val;
if (value.matches("-?\\d+")) {
val = Integer.parseInt(value);
} else {
val = variables.getOrDefault(value, 0);
}
variables.put(var, val);
}
private void executeAdd(String var, String value) {
int val;
if (value.matches("-?\\d+")) {
val = Integer.parseInt(value);
} else {
val = variables.getOrDefault(value, 0);
}
variables.put(var, variables.getOrDefault(var, 0) + val);
// 디버깅용 로그
//System.out.println("Adding " + val + " to " + var + ". New value: " + variables.get(var));
}
private void executeSub(String var, String value) {
int val;
if (value.matches("-?\\d+")) {
val = Integer.parseInt(value);
} else {
val = variables.getOrDefault(value, 0);
}
variables.put(var, variables.getOrDefault(var, 0) - val);
}
private void executeJumpNotZero(String var, String lineNum) {
if (variables.getOrDefault(var, 0) != 0) {
// lineNum은 1부터 시작하는 line number를 가리키므로, 실제 program list index로 변환
programCounter = Integer.parseInt(lineNum) - 1;
}
}
private void executePrint(String var) {
System.out.printf("[prt %s]에 의해 출력된 %s변수 값:%d%n",
var, var, variables.getOrDefault(var, 0));
}
// 프로그램 실행
public void execute() {
programCounter = 0;
variables.clear();
while (programCounter < program.size()) {
List<String> instruction = program.get(programCounter);
if (instruction.isEmpty()) {
programCounter++;
continue;
}
String cmd = instruction.get(0);
switch (cmd) {
case "mov":
executeMove(instruction.get(1), instruction.get(2));
break;
case "add":
executeAdd(instruction.get(1), instruction.get(2));
break;
case "sub":
executeSub(instruction.get(1), instruction.get(2));
break;
case "jn0":
executeJumpNotZero(instruction.get(1), instruction.get(2));
break;
case "prt":
executePrint(instruction.get(1));
break;
case "exi":
printFinalState();
return;
}
programCounter++;
}
printFinalState();
}
// 최종 변수 상태 출력
private void printFinalState() {
System.out.println("프로그램 실행 종료. 변수들의 최종 값을 출력합니다.");
StringJoiner sj = new StringJoiner(" ");
List<String> sortedVars = new ArrayList<>(variables.keySet());
Collections.sort(sortedVars);
for (String key : sortedVars) {
sj.add(key + ":" + variables.get(key));
}
System.out.println(sj.toString());
}
// 프로그램 초기화
public void reset() {
program.clear();
variables.clear();
programCounter = 0;
}
public static void main(String[] args) {
VirtualMachine vm = new VirtualMachine();
Scanner scanner = new Scanner(System.in);
int lineNumber = 0;
System.out.println("나의 가상 컴퓨터가 작동합니다. 프로그램을 입력해주세요. go를 입력하면 작동합니다.");
while (true) {
System.out.print(lineNumber + ">> ");
String line = scanner.nextLine().trim();
if (line.equals("go")) {
vm.execute();
vm.reset();
lineNumber = 0;
continue;
}
if (!line.isEmpty()) {
vm.addProgramLine(line);
lineNumber++;
}
}
}
}
개인 풀이이므로 틀린 부분이나 피드백이 있으면 댓글로 남겨주시면 감사하겠습니다!