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

hyeseong·2025년 1월 2일
0

명품자바프로그래밍

목록 보기
11/12

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

1번

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

}

2번

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의 양수들의 합 출력
	}

}

3번

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번


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

}

5번

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

6번

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

7번


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

}

8번

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

}

9번

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

10번

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

11번

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

12번

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++;
            }
        }
    }
}

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

0개의 댓글