Problem 1

 

우선 해당 데이터들을 저장할 제네릭 클래스를 생성해야 한다.

 

문제에서 제공되었듯 2개의 데이터를 매개변수로 하는 제네릭 클래스의 객체로 생성하여 처리한다.

또한, 접근자를 생성하여 데이터에 접근할 수 있도록 해야한다.

 

class SimplePair<T> {	// 제네릭 클래스 생성
	public T t1, t2;
	
	public SimplePair(T t1, T t2) {	// 생성자 설정
		this.t1 = t1;
		this.t2 = t2;
	}
	
	public T getFirst() {	// 접근자 생성
		return t1;
	}
	
	public T getSecond() {	// 접근잣 생성
		return t2;
	}
}

public class SimplePairTest {
	public static void main(String[] args) {
		SimplePair<String> pair = new SimplePair<String>("apple", "tomato");	// 제네릭 클래스 객체 생성
		System.out.println(pair.getFirst());	// 접근자를 활용하여 해당 정보에 접근한다.
		System.out.println(pair.getSecond());
	}
}

 

위 코드와 같이 제네릭 클래스를 생성하고, 객체를 생성하여 접근자를 활용하여 데이터의 정보에 접근하는 코드를 작성하였다.

 

 

 

실행결과

 

 

 

Problem 2

 

set은 자료를 저장할 때 중복을 허용하지 않는 특성을 지니고 있다.

그러한 set을 구현하기 위해 여러 set의 구현체 중 Hashset을 사용하고자 한다.

 

또한 중복을 허용하지 않기에 특정 데이터가 담긴 컬렉션에서 다른 요소들을 모두 더하면 합집합이, 컬렉션에 저장된 데이터와 동일한 것만 남기고 모두 삭제하면 차집합을 구할 수 있다.

 

set에서는 addAll메소드와 retainAll메소드를 활용하면 쉽게 코드를 구현할 수 있다.

import java.util.HashSet;
import java.util.Set;

public class HashSetTest {

	public static void main(String[] args) {
		Set<String> s1 = new HashSet<String>();	// 데이터를 저장할 두개의 set 객체 생성
		Set<String> s2 = new HashSet<String>();
		
		// 데이터 추가
		s1.add("A");
		s1.add("B");
		s1.add("C");
		
		s2.add("A");
		s2.add("D");
		
		// s1 객체의 데이터를 저장할 union 객체 생성
		Set<String> union = new HashSet<String>(s1);
		union.addAll(s2);	// 두 객체의 데이터를 모두 더해 union 객체에 저장 
		System.out.println(union);
		
		// s1 객체의 데이터를 저장할 intersection 객체 생성
		Set<String> intersection = new HashSet<String>(s1);
		intersection.retainAll(s2);	// 두 객체의 데이터 중 중복된 데이터를 제외한 값들을 모두 제거
		System.out.println(intersection);
	}
}

 

 

 

실행결과

 

S1 에는 {"A", "B", "C"} , S2에는 {"A", "D"} 가 저장되어 있다.

 

정상적으로 합집합인 A B C D 그리고 교집합인 A가 출력됨을 확인할 수 있다.

 

 

 

Problem 3

 

map은 key와 value를 한쌍으로 저장하는 인터페이스이다.

여기서 key는 value에 접근하기 위한 역할을 하는 데이터이다.

 

map은 HashMap을 사용하여 구현한다.

 

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

public class MapTest {

	public static void main(String[] args) {
		
		// Map 객체와 Scanner 객체를 생성
		Map<String, String> countryCapitalMap = new HashMap<>();	
		Scanner scanner = new Scanner(System.in);
		
		// Map 객체에 Key와 Value의 쌍을 저장.
		countryCapitalMap.put("USA", "Washington");
		countryCapitalMap.put("Japan", "Tokyo");
		countryCapitalMap.put("China", "Beijing");
		countryCapitalMap.put("UK", "London");
		countryCapitalMap.put("Korea", "Seoul");
		
		System.out.print("국가의 이름을 입력하세요 : ");
		String country = scanner.nextLine();
		System.out.print(country + "의 수도 : ");
		// key를 사용해서 value의 데이터 값을 반환
		System.out.println(countryCapitalMap.get(country));
	}

}

 

 

 

실행결과

영국의 수도를 반환하는 결과

 

 

 

Problem 4

 

ArrayList가 데이터의 추가와 제거가 편하다는 장점이 있지만 단점이 없는 것은 아니다.

 

여러 데이터가 저장되어 있다고 가정할 때 첫번째 데이터를 추가 혹은 삭제한다면 맨 앞 요소를 수정하고 이후 데이터들의 인덱스를 하나씩 이동시켜 다시 저장해야 한다.

 

이와 대비되는 LinkedList의 경우에는 앞 요소를 변동한 후 맨 앞 요소를 헤더로 재선언 하면 되기에 연산 소요시간이 ArrayList보다 짧다.

 

해당 코드를 완성하고 맨 앞에 랜덤 값을 10만번 추가하여 걸리는 시행시간을 측정해보겠다.

 

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;

public class ListPerformanceCompariso {
	private static final int ELEMENTS_COUNT = 100000;	// 배열의 크기
	private static final int OPERATIONS_COUNT = 10000;	// 연산 횟수
	
	public static void main(String[] args) {
		// ArrayList 및 linkedList 객체 생성
		List<Integer> arrayList = new ArrayList<>(ELEMENTS_COUNT);
		List<Integer> linkedList = new LinkedList<>();
		Random random = new Random();
		
		// ArrayList 맨 앞 요소에 랜덤 값을 10만번 추가
		long startTime = System.nanoTime();
		
		for(int i = 0; i < OPERATIONS_COUNT; i++) {
			arrayList.add(0, random.nextInt());
		}
		
		long endTime = System.nanoTime();
		// 시작 시간과 끝 시간을 측정하여 결과를 출력
		System.out.println("ArrayList add: " + (endTime - startTime) / 1e6 + " ms");
		
		// LinkedList 맨 앞 요소에 랜덤 값을 10만번 추가
		long startTime2 = System.nanoTime();
		
		for(int i = 0; i < OPERATIONS_COUNT; i++) {
			linkedList.add(0, random.nextInt());
		}
		
		long endTime2 = System.nanoTime();
		// 시작 시간과 끝 시간을 측정하여 결과를 출력
		System.out.println("LinkedList add: " + (endTime2 - startTime2) / 1e6 + " ms");
	}
}

 

 

 

실행결과

 

예상했던 결과와 같이 ArrayList가 LinkedList보다 맨 앞에 요소를 추가할 시 걸리는 시간이 더 길다는 사실을 확인할 수 있다.