IT 면접족보/자바 면접족보

자바 수업 정리 -컬렉션 클래스- TreeSet<E>,Queue<E>&Stack,Map<K, V>,정렬,찾기(23 일차)

낙산암 2020. 12. 24. 17:49

1. 프로그래밍

나라 이름과 인구를 입력하세요.(예: Korea 5000)
나라 이름, 인구 >> Korea 5000
나라 이름, 인구 >> USA 1000000
나라 이름, 인구 >> Swiss 2000
나라 이름, 인구 >> France 3000
나라 이름, 인구 >> 그만

인구 검색 >> France
France의 인구는 3000
인구 검색 >> 스위스
스위스 나라는 없습니다.
인구 검색 >> 그만
import java.util.HashMap;
import java.util.Scanner;

public class CountryHashMap {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		HashMap<String, Integer> map = new HashMap<>();
		System.out.println("나라 이름과 인구를 입력하세요.(예: Korea 5000)");
		
		int population = 0;
		String country = " ";
		while(true) {
			System.out.print("나라 이름, 인구 >> ");
			country = sc.next();
			if(country.equals("그만")) //입력 "그만" 하면 입력 종료
				break;
			
			population = sc.nextInt();
			map.put(country, population);
		}
		System.out.println(); //입력과 검색과 구분위해 한줄 공백
		
		// 키 입력받아서 검색해서 정보 출력하기 그만할때까지 
		// 없으면 없습니다 출력 
		String key = " ";
		while(true) {
			System.out.print("인구 검색 >> ");
			key = sc.next();
			
			if(key.equals("그만")) //입력 "그만" 하면 검색 종료 
				break;
			else if(!map.containsKey(key)) { //map의 key에 key가 있지 않으면 
				System.out.println(key + " 나라는 없습니다.");
				continue;
			}
			System.out.println(key +" "+ map.get(key)); //키값으로 내용 출력 
		}
		sc.close();
	}
}

/*
나라 이름과 인구를 입력하세요.(예: Korea 5000)
나라 이름, 인구 >> korea 5000
나라 이름, 인구 >> swiss 2000
나라 이름, 인구 >> france 3000
나라 이름, 인구 >> usa 100000
나라 이름, 인구 >> 그만

인구 검색 >> france
france 3000
인구 검색 >> korea
korea 5000
인구 검색 >> 스위스
스위스 나라는 없습니다.
인구 검색 >> 그만
*/

 

2.하나의 학생 정보를 나타내는 Student 클래스에는 이름, 학과, 학번, 학점 평균을 저장하는 필드가 있다.

문제_01

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

 

학생 이름, 학과, 학번, 학점평균 입력하세요.
>> 황기태, 모바일, 1, 4.1
>> 이재문, 안드로이드, 2, 3.9
>> 김남윤, 웹공학, 3, 3.5
>> 최찬미, 빅데이터, 4, 4.25
----------------------------------
이름: 황기태
학과: 모바일
학번: 1
학점평균: 4.1
----------------------------------
이름: 이재문
학과: 안드로이드
학번: 2
학점평균: 3.9
----------------------------------
이름: 김남윤
학과: 웹공학
학번: 3
학점평균: 3.5
----------------------------------
이름: 최찬미
학과: 빅데이터
학번: 4
학점평균: 4.25
----------------------------------
학생 이름 >> 최찬미
최찬미, 빅데이터, 4, 4.25
학생 이름 >> 이재문
이재문, 안드로이드, 2, 3.9
학생 이름 >> 그만
class Student {
private String name, major, sNumber;
private double grade;
public Student(String name, String major, String sNumber, double grade) {
this.name = name;
this.major = major;
this.sNumber = sNumber;
this.grade = grade;
}
public String getName() {
return name;
}
public String getMajor() {
return major;
}
public String getsNumber() {
return sNumber;
}
public double getGrade() {
return grade;
}
}
public class StudentInfo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
ArrayList<Student> info = new ArrayList<Student>();
System.out.println("학생 이름, 학과, 학번, 학점 평균을 입력하세요.");
for(int i = 0; i < 4; i++) {
System.out.print(">> ");
String text = sc.nextLine();
StringTokenizer st = new StringTokenizer(text, ",");
String name = st.nextToken().trim();
String major = st.nextToken().trim();
String sNumber = st.nextToken().trim();
double grade = Double.parseDouble(st.nextToken().trim());
Student s = new Student(name, major, sNumber, grade);
info.add(s);
}
Iterator<Student> it = info.iterator();
while (it.hasNext()) {
Student student = it.next();
System.out.println("---------------------------");
System.out.println("이름:" + student.getName());
System.out.println("학과:" + student.getMajor());
System.out.println("학번:" + student.getsNumber());
System.out.println("학점평균:" + student.getGrade());
System.out.println("---------------------------");
}
while(true) {
System.out.print("학생 이름 >> ");
String name = sc.nextLine();
if(name.equals("그만")) break;
for(int i = 0; i < info.size(); i++) {
Student s = info.get(i);
if(s.getName().equals(name)) {
System.out.print(s.getName() + ", ");
System.out.print(s.getMajor() + ", ");
System.out.print(s.getsNumber() + ", ");
System.out.println(s.getGrade());
break;
}
}
}
sc.close();
}
}

3. 프로그래밍 series_02

문제_02

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

 

class Student2 {
private String name, major, sNumber;
private double grade;
public Student2(String name, String major, String sNumber, double grade) {
this.name = name;
this.major = major;
this.sNumber = sNumber;
this.grade = grade;
}
public String getName() {
return name;
}
public String getMajor() {
return major;
}
public String getsNumber() {
return sNumber;
}
public double getGrade() {
return grade;
}
}
public class StudentInfo2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
HashMap<String, Student> info = new HashMap<String, Student>();
System.out.println("학생 이름, 학과, 학번, 학점 평균을 입력하세요.");
for(int i = 0; i < 4; i++) {
System.out.print(">> ");
String text = sc.nextLine();
StringTokenizer st = new StringTokenizer(text, ",");
String name = st.nextToken().trim();
String major = st.nextToken().trim();
String sNumber = st.nextToken().trim();
double grade = Double.parseDouble(st.nextToken().trim());
Student s = new Student(name, major, sNumber, grade);
info.put(name, s);
}
Set<String> key = info.keySet(); //해시맵 info에 있는 모든 키 Set 컬렉션으로 리턴
Iterator<String> it = key.iterator(); //Set을 순차검색하는 이터레이터 리턴
while (it.hasNext()) {
String name = it.next();
Student student = info.get(name); //이름을 키로 하여 객체를 얻는다.
System.out.println("---------------------------");
System.out.println("이름:" + student.getName());
System.out.println("학과:" + student.getMajor());
System.out.println("학번:" + student.getsNumber());
System.out.println("학점평균:" + student.getGrade());
System.out.println("---------------------------");
}
while(true) {
System.out.print("학생 이름 >> ");
String name = sc.nextLine();
if(name.equals("그만")) break;
Student student = info.get(name); // 해시맵에서 이름을 키로 검색
if(student == null) { // 이름이 해시맵에 없다면
System.out.println(name + " 학생 없습니다.");
}
else { // 해시맵에서 검색된 Student 객체
System.out.print(student.getName() + ", ");
System.out.print(student.getMajor() + ", ");
System.out.print(student.getsNumber() + ", ");
System.out.println(student.getGrade());
}
}
sc.close();
}
}

4. 프로그래밍

도시 이름, 위도, 경도 정보를 가진 Location 클래스를 작성하고, 도시 이름을 '키'로 하는 HashMap<String, Location> 컬렉션을 만들고, 사용자로부터 입력 받아 4개의 도시를 저장하라. 그리고 도시 이름으로 검색하는 프로그램을 작성하라.

 

도시, 경도, 위도를 입력하세요.

>> 서울, 37, 126
>> LA, 34, -118
>> 파리, 2, 48
>> 시드니, 151, -33
----------------------------------
서울 37 126
LA 34 -118
파리 2 48
시드니 151 -33
----------------------------------
도시 이름 >> 피리
피리는 없습니다.
도시 이름 >> 파리
파리 2 48
도시 이름 >> 그만
class Location {
private String name;
private int longitude, latitude; //경도, 위도
public Location(String name, int longitude, int latitude) {
this.name = name;
this.longitude = longitude;
this.latitude = latitude;
}
public String getName() {
return name;
}
public int getLongitute() {
return longitude;
}
public int getLatitude() {
return latitude;
}
}
public class SearchCity {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
HashMap<String, Location> info = new HashMap<String, Location>();
System.out.println("도시, 경도, 위도를 입력하세요.");
for(int i = 0; i < 4; i++) {
System.out.print(">> ");
String text = sc.nextLine();
StringTokenizer st = new StringTokenizer(text, ",");
String name = st.nextToken().trim();
int longitude = Integer.parseInt(st.nextToken().trim());
int latitude = Integer.parseInt(st.nextToken().trim());
Location location = new Location(name, longitude, latitude);
info.put(name, location);
}
Set<String> key = info.keySet(); //해시맵 info에 있는 모든 키 Set 컬렉션으로 리턴
Iterator<String> it = key.iterator(); //Set을 순차검색하는 이터레이터 리턴
System.out.println("---------------------------");
while (it.hasNext()) {
String name = it.next();
Location location = info.get(name); //이름을 키로 하여 객체를 얻는다.
System.out.print(location.getName() + " ");
System.out.print(location.getLongitute() + " ");
System.out.println(location.getLatitude() + " ");
}
System.out.println("---------------------------");
while(true) {
System.out.print("도시 이름 >> ");
String name = sc.nextLine();
if(name.equals("그만")) break;
Location location = info.get(name); // 해시맵에서 이름을 키로 검색
if(location == null) { // 이름이 해시맵에 없다면
System.out.println(name + "는 없습니다.");
}
else { // 해시맵에서 검색된 Student 객체
System.out.print(location.getName() + " ");
System.out.print(location.getLongitute() + " ");
System.out.println(location.getLatitude());
}
}
sc.close();
}
}

5. 프로그래밍

이름과 학점(4.5만점)을 5개 입력 받아 해시맵에 저장하고, 장학생 선발 기준을 입력 받아 장학생 명단을 출력 하라.

public class Scholarship {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
HashMap<String, Double> student = new HashMap<String, Double>();
System.out.println("미래장학금관리시스템입니다.");
for(int i = 0; i < 5; i++) {
System.out.print("이름과 학점>> ");
String name = sc.next();
double grade = sc.nextDouble();
student.put(name, grade);
}
System.out.print("장학생 선발 학점 기준 입력>> ");
double standard = sc.nextDouble();
System.out.print("장학생 명단: ");
Set<String> keys = student.keySet();
Iterator<String> it = keys.iterator();
while(it.hasNext()) {
String key = it.next();
double value = student.get(key);
if(value >= standard)
System.out.print(key + " ");
}
sc.close();
}
}

6. 큐와 스택에 대하여 설명하시오.(필수)

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

  • HashMap, TreeMap 등등이 있다.

  • 기본적으로 Key-Value 로 들어감! **map.put(key, value);**

  • Map은 Collection 아니다. set의 성질도, list의 성질도 개념들이 합쳐져야 하기 때문!

  • Key: key를 통해서 다른 요소(value)를 구분 짓는다. (현실의 키 개념과 같다고 생각!) 앞에 키는 중복이 되면 안된다. (c#의 dictionary 의 개념)

  • 같은 키를 중복 입력하면 뒤의 것으로 키 값이 바뀐다.

    map.put(23, "Marthin"); → **map.put(23, "Lee");**

  • 입력 map.put(45, "Brown"); 출력 map.get(37); 삭제 map.remove(37);

  • 예제 소스 코드

HashMap<K, V>

  • HashMap<K, V> 클래스는 Iterable<T> 인터페이스를 구현하지 않아서 for-each ,Iterator로 순차적 접근을 할 수 없다.

  • 그래서 Key는 Set으로 관리! 키값을 기준으로 for-each, Iterator 사용함

    **public Set<Integer> ks = map.keySet();**

    → set 호출 메소드 / Key만 담고 있는 컬렉션 인스턴스 생성

  • 예제 소스 코드

TreeMap<K, V>

  • Tree 자료구조 특성상 반복자가 정렬된 순서대로 key들에 접근함

    (반복자의 접근 순서는 컬렉션 인스턴스에 따라 달라질 수 있다.)

8. 아래의 TreeMap의 Value를 확인 하기 위한 소스를 짜시오.(필수)

TreeMap<Integer, String> map = new TreeMap<>();
map.put(45, "Brown");
map.put(37, "James");
map.put(23, "Martin");
public class TreeMapValue {

	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> ks = map.keySet();

		//key 값 출력 
		for (Integer n : ks)
			System.out.print(n.toString() + '\t');
		System.out.println();

		//1. for-each
		for (Integer n : ks)
			System.out.print(map.get(n).toString() + '\t');
		System.out.println();
		
		//2. Iterator
		for (Iterator<Integer> itr = ks.iterator(); itr.hasNext();)
			System.out.print(map.get(itr.next()) + '\t');
		System.out.println();
	}
}

9. 아래의 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);	
    }
}
class IntegerComparator implements Comparator<Integer>{ //타입은 결정해서 들어가야함
	
	@Override
	public int compare(Integer n1, Integer n2) {
		return n2.intValue() - n1.intValue(); //맨처음에 .intValue()를 생각 못했었다.
	}
}

public class ExIntegerComparator {

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

10. Objects.hash의 용도와 사용

해시코드가 중복되는 것을 피하기 위해서, 속도를 빠르게 하기 위해서 사용 (이퀄즈로 하면 너무 오래 걸리니까 )

자기가 가진 객체 값 전부를 넘기면  넘긴걸 모두 검사해서 알아서 해시코드를 돌려준다.

(내가 짠 알고리즘보다 갖다 쓰는게 훨씬 더 중복 확률 줄이기 편리? 하다. 내가 짜기 어려울 때도 사용할 수 있다.)

 

public static int hash(Object...values)
// java.util.Objects 에 정의된 메소드 , 전달된 전달된 인자 기반의 해쉬 값 반환


@Override
public int hashCode() {
	return Objects.hash(model, color); 
}
// 전달인자 model, color 기반 해쉬 값 반한
// 전달된 인자를 모두 반영한 해쉬 값을 반환