티스토리 뷰

학습정리-11-10.txt
0.00MB

 

 

1.아래를 프로그래밍 하시오.
하나의 학생 정보를 나타내는 Student 클래스에는 이름, 학과, 학번, 학점 평균을 저장하는 필드가 있다.


### 문제_01
학생마다 Student 객체를 생성하고 4명의 학생 정보를 `ArrayList<Student> 컬렉션`에 저장한 후에, 
ArrayList<Student>의 모든 학생(4명) 정보를 출력하고 학생 이름을 입력 받아 해당 학생의 학점 평균을 출력하는 프로그램을 작성하라.

### 문제_02
ArayList<Student> 대신, `HashMap<String, Studnet>` **해시맵을 이용하여 다시 작성**하라. 해시맵에서 키는 학생 이름으로 한다.

1번

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;
import java.util.StringTokenizer;

class Student {
	private String name;
	private String dept;
	private int stuNum;
	private double avg;

	public String getDept() {
		return dept;
	}

	public void setDept(String dept) {
		this.dept = dept;
	}

	public int getStuNum() {
		return stuNum;
	}

	public void setStuNum(int stuNum) {
		this.stuNum = stuNum;
	}

	public Student(String name, String dept, int stuNum, double avg) {
		this.name = name;
		this.dept = dept;
		this.stuNum = stuNum;
		this.avg = avg;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "이름: " + getName() + '\n' + "학과: " + getDept() + '\n' + "학번: " + getStuNum() + '\n' + "학점 평균: "
				+ getAvg() + '\n';
	}

	public double getAvg() {
		return avg;
	}

	public void setAvg(double avg) {
		this.avg = avg;
	}

}

class HashStudentTest {

	public static void main(String[] args) {
		final int STUDENT = 4;
		Scanner sc = new Scanner(System.in);

		ArrayList<Student> arrStu = new ArrayList<>();

		System.out.println("학생 이름, 학과, 학번, 학점 평균을 순서대로 입력하세요.");

		for (int i = 0; i < STUDENT; i++) {
			System.out.print((i + 1) + "번 >> ");
			String stuInfo = sc.nextLine();

			StringTokenizer st = new StringTokenizer(stuInfo, ",");

			String name = st.nextToken().trim();
			String dept = st.nextToken().trim();
			int stuNum = Integer.valueOf(st.nextToken().trim());
			double avg = Double.valueOf(st.nextToken().trim());

			arrStu.add(new Student(name, dept, stuNum, avg));

		}

		for (int i = 0; i < arrStu.size(); i++) {
			System.out.println(arrStu.get(i));
		}

		while (true) {
			System.out.print("학생 이름 (종료를 원하시면 '종료'를 입력하세요.) >> ");
			String stuName = sc.next();

			for (int i = 0; i < arrStu.size(); i++) {
				if (stuName.equals(arrStu.get(i).getName()))
					System.out.println(arrStu.get(i).getName() + "의 평균 학점은 " + arrStu.get(i).getAvg() + "입니다.");

			}

			if (stuName.equals("종료")) {
				System.out.println("종료합니다.");
				break;
			}	
		} // while(name)
	}
}

 

2번

import java.util.HashMap;
import java.util.Scanner;
import java.util.Set;
import java.util.StringTokenizer;

class Student {
	private String name;
	private String dept;
	private int stuNum;
	private double avg;

	public String getDept() {
		return dept;
	}

	public void setDept(String dept) {
		this.dept = dept;
	}

	public int getStuNum() {
		return stuNum;
	}

	public void setStuNum(int stuNum) {
		this.stuNum = stuNum;
	}

	public Student(String name, String dept, int stuNum, double avg) {
		this.name = name;
		this.dept = dept;
		this.stuNum = stuNum;
		this.avg = avg;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "이름: " + getName() + '\n' + "학과: " + getDept() + '\n' + "학번: " + getStuNum() + '\n' + "학점 평균: "
				+ getAvg() + '\n';
	}

	public double getAvg() {
		return avg;
	}

	public void setAvg(double avg) {
		this.avg = avg;
	}

}

class HashStudentTest {

	public static void main(String[] args) {
		final int STUDENT = 4;
		Scanner sc = new Scanner(System.in);

		HashMap<String, Student> mStu = new HashMap<>();

		System.out.println("학생 이름, 학과, 학번, 학점 평균을 순서대로 입력하세요.");

		for (int i = 0; i < STUDENT; i++) {
			System.out.print((i + 1) + "번 >> ");
			String stuInfo = sc.nextLine();

			StringTokenizer st = new StringTokenizer(stuInfo, ",");

			String name = st.nextToken().trim();
			String dept = st.nextToken().trim();
			int stuNum = Integer.valueOf(st.nextToken().trim());
			double avg = Double.valueOf(st.nextToken().trim());

			mStu.put(name ,new Student(name, dept, stuNum, avg));

		}
		
		Set<String> ks = mStu.keySet();

		for (String str : ks) {
			System.out.println(mStu.get(str));
		}

		while (true) {
			System.out.print("학생 이름 (종료를 원하시면 '종료'를 입력하세요.) >> ");
			String stuName = sc.next();

			for (String str : ks) {
				if(str.equals(stuName)) {
					System.out.println(str + "의 학점 평균은 " + mStu.get(str).getAvg() + "입니다.");
				}
			}

			if (stuName.equals("종료")) {
				System.out.println("종료합니다.");
				break;
			}	
		} // while(true)
	}
}

 

 

 

 

 


2.. 다음을 프로그래밍 하시오. 
"그만"이 입력될 때까지 나라 이름과 인구를 입력 받아 저장하고, 다시 나라 이름을 입력받아 인구를 출력하는 프로그램을 작성하라. 
다음 해시맵을 이용하라.
=================================================================================
나라 이름과 인구를 입력하세요.(예: Korea 5000)
나라 이름, 인구 >> Korea 5000
나라 이름, 인구 >> USA 1000000
나라 이름, 인구 >> Swiss 2000
나라 이름, 인구 >> France 3000
나라 이름, 인구 >> 그만

인구 검색 >> France
France의 인구는 3000
인구 검색 >> 스위스
스위스 나라는 없습니다.
인구 검색 >> 그만

 

오류........ㅠㅠ

import java.util.HashMap;
import java.util.Scanner;
import java.util.Set;
import java.util.StringTokenizer;

class PopulationTest {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("나라 이름과 인구를 입력하세요.(예: Korea 5000)");
		
		HashMap<String, Integer> mNation = new HashMap<>();
		
		while(true) {
						
			System.out.print("나라 이름, 인구 >> ");
			String text = sc.nextLine();
			
			StringTokenizer st = new StringTokenizer(text);
			
			String country = st.nextToken().trim();
			int	population = Integer.valueOf(st.nextToken().trim());
								
			mNation.put(country, population);
			
			if(country.equals("그만"))
				break;
			
		} //while(true)
		
		System.out.println();
		
		while(true) {
			Set<String> set = mNation.keySet();
			
			System.out.print("인구 검색 >> ");
			String country = sc.next();
			
			if(set.toString().equals(country))
				System.out.println(country + "의 인구는 " + mNation.get(country));
			else
				System.out.println(country + " 나라는 없습니다.");
			
			if(country.equals("그만"))
				break;
			
		} // while(true)
	
		System.out.println("종료되었습니다.");
	}
}

→ 나라 이름, 인구 입력하는 구간에 if (country.equals("그만"))의 위치를 String country 밑으로 옮겨줘서 해결!

그전에는 country와 population 변수 모두 값이 저장되어야 if절이 실행되는 위치라 "그만"만 입력하고 enter를 치면 population에 아무런 값도 저장되지 못해 오류가 발생하는 듯!

또한 인구 검색 부분도 출력이 이상해 다시 작성! 위에 처럼 하게 되면 출력이 나라의 인구 출력, 나라는 없습니다 가 여러번 반복해서 출력되게 된다.....한번만 출력하고 싶으면 아래처럼 수정해야한다. boolean 변수 주고, for문 사용 로직!!

import java.util.HashMap;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;
import java.util.StringTokenizer;

class PopulationTest {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("나라 이름과 인구를 입력하세요.(예: Korea 5000)");

		HashMap<String, Integer> mNation = new HashMap<>();

		while (true) {

			System.out.print("나라 이름, 인구 >> ");
			String text = sc.nextLine();

			StringTokenizer st = new StringTokenizer(text);

			String country = st.nextToken().trim();
			
			if (country.equals("그만"))
				break;
			
			int population = Integer.valueOf(st.nextToken().trim());

			mNation.put(country, population);

			
		} // while(true)

		System.out.println();
		
		while (true) {
			Set<String> set = mNation.keySet();
			boolean boo = false;

			System.out.print("인구 검색 >> ");
			String country = sc.next();
			
			for (Iterator itr = set.iterator(); itr.hasNext();) {
				if(itr.next().equals(country)) {
					boo = true;
					break;
				}
				
			}
			
			if(boo == true) {
				System.out.println(country + "의 인구는 " + mNation.get(country));
			}

			else {
			System.out.println(country + " 나라는 없습니다.");
			}
			
			
			if (country.equals("그만"))
				break;

		} // while(true)

		System.out.println("종료되었습니다.");
	}
}

 

클래스로 뺴주기......containsKey()함수!(키값이 들어 있는지 확인하는 함수....)

import java.util.HashMap;
import java.util.Scanner;

class CountryMap {
	private HashMap<String, Integer> map;

	public CountryMap() {
		map = new HashMap<String, Integer>();
	}

	public HashMap<String, Integer> getMap() {
		System.out.println("나라 이름과 인구를 입력하세요.(예: Korea 5000)");

		Scanner sc = new Scanner(System.in);

		int population = 0;
		String country = " ";

		try {
			while (true) {
				System.out.println("나라 이름, 인구 >> ");
				country = sc.next();

				if (country.equals("그만"))
					break;

				population = sc.nextInt();

				map.put(country, population);

			} // while(true)
		} catch (Exception e) {
			System.out.println("잘못된 입력입니다. 다시 입력하세요.");
			getMap();
		}

		return map;
	}

	public void setMap(HashMap<String, Integer> map) {
		this.map = map;
	}

	public void search() {
		Scanner sc = new Scanner(System.in);

		String key = "";

		try {
			while (true) {
				System.out.println("인구 검색 >> ");
				key = sc.next();

				if (key.equals("그만"))
					break;
				else if (!map.containsKey(key)) { // 해당 문자열이 key 값 중에 없으면)
					System.out.println(key + "나라는 없습니다.");
					continue;
				}

				System.out.println(key + " " + map.get(key));
				// 키 값으로 내용 출력
			}
		} catch (Exception e) {
			System.out.println("잘못된 입력입니다. 다시 입력하세요.");
			search();
		}

	}

}

class CountryTest {

	public static void main(String[] args) {
		CountryMap countryMap = new CountryMap();
		countryMap.getMap();
		countryMap.search();
	}
}

 

 

 

 


3. 스택과 큐에 대하여 설명하시오.

스택 : 먼저 저장된 데이터가 마지막에 빠져나간다.

큐 : 먼저 저장된 데이터가 먼저 빠져나간다.

스택의 대표적인 예가 함수!

일반적으로 함수를 호출할 때 먼저 실행된 함수가 마지막에 삭제된다. 아래의 예시를 참고하자.

class A{
	void a() {	  }
	void b() {  a();  }
	void c() {  b();  }
}
public class Test {
	public static void main(String[] args) {
		A abc = new A();
		abc.c();
	}
}

 

 

 


4. Map 에 대하여 설명하시오.

Key-Value 방식의 데이터 저장을 한다.

Map<K, V> 에서

K가 key 열쇠 역할, V value가 상자 역할

key는 중복이 안된다. → Set으로 관리가 되고 있다.(중복 허용 안함) 그래서 순서도 없다. Map은 컬렉션을 상속하지 않고 있다. (List, Set, Queue와 따로 동떨어져 있다)

Map에는 HashMap과 TreeMap이 있다.둘은 모두 Key만 담고 있는 Set<E>인스턴스를 생성한 뒤 Value값을 출력할 수 있다.차이점은 HasheMap은 입력 순서에 상관없이 출력되고, TreeMap은 Tree의 자료 구조상(이진트리) key값을 기준으로 오름차순 정렬된다.

 

 

 

 



5.아래의 TreeMap의 전체 Value 값을 확인 하기 위한 소스를 짜시오. 
TreeMap<Integer, String> map = new TreeMap<>();
map.put(45, "Brown");
map.put(37, "James");
map.put(23, "Martin");

import java.util.Set;
import java.util.TreeMap;

class TreeMapValueTest {

	public static void main(String[] args) {
		TreeMap<Integer, String> map = new TreeMap<>();
		map.put(45, "Brown");
		map.put(37, "James");
		map.put(23, "Martin");
		
		Set<Integer> set = map.keySet(); // 꼭 key값을 set으로 객체 생성부터
		
		for (Integer n : set) {
			System.out.println("Key: " + n + "\t" + "Value: " + map.get(n));
		}
	}
}
//출력
//Key: 23	Value: Martin
//Key: 37	Value: James
//Key: 45	Value: Brown

 

 

 

 


6.아래의 IntegerComparator를 내림차순 정렬이 되게끔 구현하시오.
public static void main(String[] args) {
        TreeSet<Integer> tr = new TreeSet<>(new IntegerComparator());
        tr.add(30);
        tr.add(10);    
        tr.add(20);        
        System.out.println(tr);
    }
}

import java.util.Comparator;
import java.util.TreeSet;

class IntegerComparator implements Comparator<Integer>{
	@Override
	public int compare(Integer num1, Integer num2) {
		return num2 - num1;
		// num1 - num2는 오름차순
	}
}

class IntegerComparatorTest {

	public static void main(String[] args) {
		TreeSet<Integer> tr = new TreeSet<>(new IntegerComparator());
		tr.add(30);
		tr.add(10);
		tr.add(20);
		System.out.println(tr);
	}
}
//출력
//[30, 20, 10]

앞에 것을 기준으로 빼면 오름차순

뒤에 것을 기준으로 빼면 내림차순

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함