List와 Set

WebDev/본과정 / / 2021. 5. 13. 18:47

1. ArrayList 와 LinkedList 의 장단점은?

  ArrayList LinkedList
장점 데이터마다 인덱스를 가지고 있어 탐색할 때 성능상의 이점을 가질 수 있다. 데이터를 추가/삭제 불필요한 복사가 없어 리스트의 내용이 변화가 많은 상황일 때 유리하다.
단점 대량의 자료를 추가/삭제함에 있어 그만큼 복사의 횟수가 많아지므로 성능저하를 일으킬 수 있다. 데이터를 탐색할때 처음부터 순회해야 하기 때문에 성능상의 문제가 있다.

 

 

2. Scanner 클래스로 -1이 입력될 때까지 양의 정수를 입력받아 저장하고 검색하여 가장 큰 수를 출력하는 프로그램을 작성하라

> 정수(-1이 입력될 때까지)>> 10 6 22 6 88 77 -1

> 가장 큰 수는 88​

 

2-1. 메인 클래스

import java.util.ArrayList;
import java.util.Collections;
import java.util.InputMismatchException;
import java.util.Scanner;

public class MaxNumMain {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		ArrayList<Integer> list = new ArrayList<>();
		
		System.out.println("정수를 입력하시고 그만 입력하고자 한다면 끝에 -1을 기입하세요.");
		System.out.println("ex. 10 6 22 6 88 77 -1");
		System.out.println("------------------------------------------------");
		
		try {
			while (true) {
				int var = scanner.nextInt();
				list.add(var);
				
				if (list.contains(-1)) {
					break;
				} else {
					continue;
				}
			}

			System.out.println("가장 큰 수는 " + Collections.max(list));
		} catch (InputMismatchException e) {
			System.out.println("올바르지 않은 입력 값 입니다. 다시 입력해주세요!");
		}
		
		scanner.close();
	}
}

 

 

3. 로또 프로그램을 작성하시오.(Set 으로)

import java.util.Random;
import java.util.Set;
import java.util.HashSet;
//import java.util.Iterator; // Iterator 사용시 import

public class LottoMain {

	public static void main(String[] args) {
		Random random = new Random();
		Set<Integer> set = new HashSet<>();
		
		for (int i = 1; i <= 6; i++) // 로또 번호 6개 랜덤으로 받기
			set.add(random.nextInt(45) + 1);
		
        // 받은 로또번호 출력하기
		System.out.println("Your Lotto Number");
		System.out.println(set);
		/*
		for (Iterator<Integer> itr = set.iterator(); itr.hasNext();) 
			System.out.print(itr.next() + " ");
		System.out.println();
		*/
	}
}

 

 

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

: 집합을 의미하며 요소의(Elements) 순서가 없는(Unordered) 특징을 가진다. 또한 데이터의 요소에서 중복을 허용하지 않는 특성을 가진다.

 

 

5. 도시 이름, 위도, 경도 정보를 가진 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

도시 이름 >> 그만​

 

5-1. 메인클래스

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

public class LocationMain {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		Location[] location = new Location[4];
		HashMap<String, Location> map 
			= new HashMap<String, Location>();
		
		System.out.println("도시, 경도, 위도를 입력하세요.");
		System.out.println("ex) 서울, 37, 126");
		
		try {
			for(int i=0; i<location.length; i++) {
				System.out.print(">> ");
				String text = sc.nextLine();
				StringTokenizer st = new StringTokenizer(text, ",");
				String city = st.nextToken().trim();
				int longitude = Integer.parseInt(st.nextToken().trim());
				int latitude = Integer.parseInt(st.nextToken().trim());
				location[i] = new Location(city, longitude, latitude);
				map.put(city, location[i]);
			}
			Set<String> key = map.keySet();
			Iterator<String> it = key.iterator();
			System.out.println("----------------------------------");
			
			while(it.hasNext()) {
				String city = it.next();
				Location s = map.get(city);
				System.out.println(s.getCity() + " "
						+ s.getLongitude() + " "
						+ s.getLatitude());
			}
			System.out.println("----------------------------------");
			
			while(true) {
				System.out.print("도시 이름 >> ");
				String city = sc.next();
				
				if(city.equals("그만"))
					break;
				
				Location s = map.get(city);
				
				if(s == null)
					System.out.println(city + "는 없습니다.");
				else
					System.out.println(s.getCity() + " "
							+ s.getLongitude() + " "
							+ s.getLatitude());
			}
		} catch (NoSuchElementException e) {
			System.out.println("잘못된 입력 값 입니다.");
			System.out.println("쉼표 및 띄어쓰기를 누락하지 않으셨는지 다시 확인 후 입력해주세요.");
		}
		
		sc.close();
	}
}

 

5-2. Location 클래스

public class Location {
	private String city; // 도시이름
	private int longitude; // 경도
	private int latitude; // 위도
	
	public Location(String city, int longitude, int latitude) {
		this.city = city;
		this.longitude = longitude;
		this.latitude = latitude;
	}
	
	public String getCity() {
		return city;
	}

	public void setCity(String city) {
		this.city = city;
	}

	public int getLongitude() {
		return longitude;
	}

	public void setLongitude(int longitude) {
		this.longitude = longitude;
	}

	public int getLatitude() {
		return latitude;
	}

	public void setLatitude(int latitude) {
		this.latitude = latitude;
	}
}

 

 

6. Scanner 클래스를 사용하여 6개 학점(‘A’, ‘B’, ‘C’, ‘D’, ‘F’)을 문자로 입력받아 ArrayList에 저장하고, ArrayList를 검색하여 학점을 점수(A=4.0, B=3.0, C=2.0, D=1.0, F=0)로 변환하여 평균을 출력하는 프로그램을 작성하라.

6개의 학점을 빈 칸으로 분리 입력(A/B/C/D/F) >> A C A B F D

2.3333333333333335​

 

6-1. 메인 클래스

import java.util.ArrayList;
import java.util.Scanner;

public class ListAvgMain {

	public static void main(String[] args) {	
		Scanner scanner = new Scanner(System.in);
		ArrayList<Double> list = new ArrayList<>();
		
		System.out.println("6개의 학점을 띄어써서 입력해주세요.");
		System.out.println("ex) 수 우 수 미 수 가");
		System.out.print(">> ");
		String str = scanner.nextLine();
		String[] temp = str.split(" ");
		
		for (int i = 0; i < temp.length; i++) {
			if (temp[i].equals("수")) {
				list.add(4.0);
			} else if (temp[i].equals("우")) {
				list.add(3.0);
			} else if (temp[i].equals("미")) {
				list.add(2.0);
			} else if (temp[i].equals("양")) {
				list.add(1.0);
			} else if (temp[i].equals("가")) {
				list.add(0.0);
			}
		}
		
		double sum = list.stream().mapToDouble(Double::doubleValue).sum();
		System.out.println("당신의 평균은 " + ((double)Math.round((sum / 6)*100)/100) + " 입니다.");
		
		scanner.close();
	}
}

 

 

7. 출력이 아래와 같이 나오도록 하시오

HashSet<Num> set = new HashSet<>();
set.add(new Num(7799));
set.add(new Num(9955));
set.add(new Num(7799));
System.out.println("인스턴스 수: " + set.size());

for(Num n : set)
	System.out.print(n.toString() + '\t');

System.out.println();
> 인스턴스 수: 2
> 7799
> 9955​

 

7-1. 메인 클래스(예제 보강)

import java.util.HashSet;

public class Set02 {

	public static void main(String[] args) {
		HashSet<Num> set = new HashSet<>();
		set.add(new Num(7799));
		set.add(new Num(9955));
		set.add(new Num(7799));
		
		System.out.println("인스턴스 수: " + set.size());
		
		for (Num n : set) {
			System.out.println(n.toString() + '\t');
		}
		System.out.println();
	}
}

 

7-2. Num 클래스

public class Num {
	private int num;
	
	public Num(int n) {
		num = n;
	}
	
	@Override
	// hashCode() 메소드와 equals() 메소드와 병행이 되어야 중복이 없는 특성의 set 컬렉션을 출력할 수 있다.
	public int hashCode() {
		return num % 3; // num의 값이 같으면 부류도 같다.
	}
	
	@Override
	public boolean equals(Object obj) { // num의 값이 같으면 true 반환
		if (num == ((Num)obj).num) {
			return true;
		} else {
			return false;
		}
	}
	
	@Override
	public String toString() {
		return String.valueOf(num);
	}
}

 

 

8. Set 호출되는 원리와 순서를 설명하시오.

: 4.에서 Set 데이터의 중복이 허용되지 않는 특성을 가진다라고 언급을 하였다. 그렇다면 이러한 점을 가지는 알고리즘을 살펴볼때 다음과 같다.

위 그림과 같이 equals를 거쳐 hashCode 메소드를 통해 둘 모두 결과가 같을 경우 중복 판정이 되는데

  • equals의 경우 두 인스턴스의 내용을 비교하여 같은 경우 true(1), 다른 경우 false(0)를 출력한다.
  • hashCode의 경우 두 객체가 같은 객체인지 확인하여 native 키워드를 통해 메모리에서 가진 해쉬의 주소값을 출력한다.

따라서 Set은 동일 인스턴스에 대한 기준을 위과 같이 따르며 그 결과 순서가 없는 특성 또한 가질 수 있게 된다.

 

 

9. 아래와 같이 출력되도록 하시오.

HashSet<Person> hSet = new HashSet<Person>();
hSet.add(new Person("LEE", 10));
hSet.add(new Person("LEE", 10));
hSet.add(new Person("PARK", 35));
hSet.add(new Person("PARK", 35));

System.out.println("저장된 데이터 수: " + hSet.size());
System.out.println(hSet);
저장된 데이터 수: 2
[LEE(10세), PARK(35세)]​

 

9-1. 메인 클래스

import java.util.HashSet;

public class PersonMain {

	public static void main(String[] args) {
		HashSet<Person> hSet = new HashSet<Person>();
		hSet.add(new Person("LEE", 10));
		hSet.add(new Person("LEE", 10));
		hSet.add(new Person("PARK", 35));
		hSet.add(new Person("PARK", 35));
		System.out.println("저장된 데이터 수: " + hSet.size());
		System.out.println(hSet);
	}
}

 

9-2. Person 클래스

public class Person {
	private String name;
	private int age;
	
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	@Override
	public int hashCode() {
		return age;
	}
	
	@Override
	public boolean equals(Object obj) {
		if ((name == ((Person)obj).name)
			|| (age == ((Person)obj).age)) {
			return true;
		} else {
			return false;
		}
	}
	
	@Override
	public String toString() {
		return name + "(" + age + "세)";
	}
}