오답노트/Java

ArrayList 연습문제

개발..너... 2022. 4. 28. 22:48

 ▶문제1

 

다음은 정수집합 1, 2, 3, 4와 3, 4, 5, 6의 교집합, 차집합, 합집합을 구하는 코드이다. 코드를 완성하여 실행결과와 같은 결과를 출력하시오. ([Hint] ArrayList클래스의 addAll( ), removeAll( ), retainALL( )을 사용하라.)

 

 

import java.util.*;



class Exercise11_1 {

	public static void main(String[] args) {

		ArrayList list1 = new ArrayList();

		ArrayList list2 = new ArrayList();

		ArrayList kyo = new ArrayList(); // 교집합

		ArrayList cha = new ArrayList(); // 차집합

		ArrayList hap = new ArrayList(); // 합집합



		list1.add(1);

		list1.add(2);

		list1.add(3);

		list1.add(4);

		list2.add(3);

		list2.add(4);

		list2.add(5);

		list2.add(6);

		

		/*

		 * (1) 알맞은 코드를 넣어 완성하시오 .

		 */

		

		System.out.println("list1=" + list1);

		System.out.println("list2=" + list2);

		System.out.println("kyo=" + kyo);

		System.out.println("cha=" + cha);

		System.out.println("hap=" + hap);

	}

}



[실행결과]

list1=[1, 2, 3, 4]

list2=[3, 4, 5, 6]

kyo=[3, 4]

cha=[1, 2]

hap=[1, 2, 3, 4, 5, 6]

 

[답]

 

kyo.addAll(list1);
kyo.retainAll(list2);


cha.addAll(list1);
cha.removeAll(list2);

hap.addAll(cha);
hap.addAll(list2);

 

[풀이]

 

*Arraylist 집합 메서드*

retain : 교집합

remove : 차집합

containsAll : 부분집합 ex) arrayList1.containsAll(arrayList2) , arraylist2는 arrayList1의 부분집합인가?

addAll : 합집합 +)

 

addAll과 add의 차이https://gayoung78.tistory.com/60

 

[Java] add()와 addAll()의 차이

1. ArrayList란? - 단순 배열은 객체 생성시 사이즈를 지정하지만, ArrayList는 사이즈의 제한이 없다 (동적 데이터 구조) - 배열과 같이 순서를 가진다 -> 출력시 index를 사용한다. - 데이터를 추가할 때

gayoung78.tistory.com

 

[나의답]

 

*교집합

   for(int i = 0; i<list1.size(); i++){           
        for(int j =0; j<list2.size(); j++){     
              if(list1.get(i) == list2.get(j)){             
                   kyo.add(list1.get(i));           
   }     
 }

*차집합

       for(int i = 0; i<list1.size(); i++){           
              for(int j =0; j<list2.size(); j++){ 
                    int count = 0;
                  if(list1.get(i) == list2.get(j)){ 
                      cha.remove(list1.get(i)); 
          }   
    }     
  }      

  kyo.addAll(list1);     
  kyo.retainAll(list2);

*합집합

hap.addAll(list1);       
hap.addAll(list2);

 

▶문제2

 

다음 코드의 실행결과를 적으시오.

 

import java.util.*;



class Exercise11_2 {

	public static void main(String[] args) {

		ArrayList list = new ArrayList();

		list.add(3);

		list.add(6);

		list.add(2);

		list.add(2);

		list.add(2);

		list.add(7);

		

		HashSet set = new HashSet(list);

		TreeSet tset = new TreeSet(set);

		Stack stack = new Stack();

		stack.addAll(tset);

		

		while (!stack.empty())

			System.out.println(stack.pop());

	}

}

 

[답]

 

7
6
3
2

 

[풀이]

 

ArrayList는 중복을 허용하고 저장순서를 유지한다.

HashSet은 중복을 허용하지 않기 때문에 중복요소들은 저장되지않는다.

TreeSet은 정렬해서 저장하기 때문에, 그리고 따로 정렬 기준이 주어지지않으면 숫자의 기본정렬인 오름차순으로 정렬한다.

Stack '쌓다'라는 의미를 가지고 있으며 접시를 차곡차곡 쌓아올리듯이 데이터를 쌓아올리는 형상이다. 

 

Stack은 '마지막에 추가된 데이터가 가장 먼저 나오는 특징'을 가지고있다. 그래서 TreeSet으로 오름차순으로 정렬된 데이터가 Stack을 통해 나올땐 내림차순이 되어 나온다.

 

Stack 참고 블로그 : https://hbase.tistory.com/122

 

[Java] Stack(스택) 사용법 및 예제

Stack(스택) 사전적으로 Stack(스택)은 '쌓다', '더미'라는 의미를 가지고 있다. 접시를 차곡차곡 쌓아 올리듯이 데이터를 쌓아올리는 형상을 생각하면 된다. Stack(스택)은 Queue(큐)와 함께 자바에서

hbase.tistory.com

 

 ▶문제3

 

다음 중 ArrayList에서 제일 비용이 많이 드는 직업은? 단, 작업도중에 ArrayList의 크기 변경이 발생하지 않는다고 가정한다.

a. 첫 번째 요소 삭제
b. 마지막 요소 삭제
c. 마지막에 새로운 요소 추가
d. 중간에 새로운 요소 추가

 

[답]

a

 

[풀이]

 

ArrayList는 배열을 기반으로 하고, 배열은 크기를 변경할 수 없기 때문에 저장할 공간이 부족하면 새로운 배열을 만들고 내용을 복사해야하므로 많은 비용이 든다. 그리고 배열의 중간에 새로운 요소를 추가 또는 삭제하는 것은 다른 요소들을 이동시켜야 하기 때문에 배열을 새로 생성하는 것보다는 적지만 역시 비용이 많이 드는 작업이다. 

특히 배열의 첫 번째 요소를 삭제하면, 빈자리를 채우기 위해 나머지 모든 요소들을 이동시켜야 하기 때문에 많은 비용이 든다. 반면에 ArrayList의 마지막에 요소를 추가 또는 삭제하는 것은 다른 요소들을 이동시킬 필요가 없기 때문에 아주 적은 비용만으로 처리가 가능하다.

 

 ▶문제4

 

LinkedList 클래스는 이름과 달리 실제로는 이중 원형 연결리스트(doubly circular linked list)로 구현되어 있다. LinkedList인스턴스를 생성하고 11개의 요소를 추가했을 때, 이 11개의 요소 중 접근시간(access time)이 가장 오래 걸리는 요소는 몇 번째 요소인가?

 

[답]

여섯 번째 요소 (LiskedList에서 제일 가운데 위치한 요소)

 

[풀이]

LinkedList는 각 요소가 서로 참조로 연결되어 있어서, n번째 요소에 접근하기 위해서는 첫 번째 요소부터 순서대로 각 요소를 거쳐야 된다. 예를 들어 세 번째 요소에 접근하기 위해서는 첫 번째 요소에서 두 번째 요소로, 두 번째 요소에서 세 번째 요소로 이동해야 한다.

LinkedList의 마지막 요소에 접근하는 것이 시간이 제일 많이 걸릴 것 같지만, 그렇지 않은 이유는 LinkedList가 실제로는 이중 원형 연결리스트로 되어 있기 때문이다.

이중 원형 연결리스트는 첫 번째 요소와 마지막 요소를 연결해서 LinkedList의 단점인 접근성을 향상시킨 것이다. 이중 원형 연결리스트에서 마지막 요소에 접근하기 위해서는 첫 번째 요소에서 한 번만 이동하면 된다. 마지막 요소에서 첫 번째 요소에 접근하기 위해서도 역시 한 번만 이동하면 된다. 

 

 

▶문제5

 

이 프로그램은 Student 클래스와 Subject 클래스를 사용한다. 만약 어떤 학생이 10과목을 수강한다면 Subject 클래스형 자료형을 자료형으로 선언한 변수가 10개 필요할 것이다. 또 어떤 학생은 5과목을, 또 다른 학생은 3과목을 수강할 수도 있다.

 

import java.util.*;



class Student {

	String name;

	int ban;

	int no;

	int kor;

	int eng;

	int math;



	Student(String name, int ban, int no, int kor, int eng, int math) {

		this.name = name;

		this.ban = ban;

		this.no = no;

		this.kor = kor;

		this.eng = eng;

		this.math = math;

	}



	int getTotal() {

		return kor + eng + math;

	}



	float getAverage() {

		return (int) ((getTotal() / 3f) * 10 + 0.5) / 10f;

	}



	public String toString() {

		return name + "," + ban + "," + no + "," + kor + "," + eng + "," + math

				+ "," + getTotal() + "," + getAverage();

	}

}// class Student



class BanNoAscending implements Comparator {

	public int compare(Object o1, Object o2) {

		/* (1) 알맞은 코드를 넣어 완성하시오  . */

	}

}



class Exercise11_7 {

	public static void main(String[] args) {

		ArrayList list = new ArrayList();

		list.add(new Student("이자바", 2, 1, 70, 90, 70));

		list.add(new Student("안자바", 1, 2, 80, 80, 90));

		list.add(new Student("홍길동", 2, 2, 60, 100, 80));

		list.add(new Student("남궁성", 1, 3, 100, 100, 100));

		list.add(new Student("김자바", 1, 1, 90, 70, 80));

		Collections.sort(list, new BanNoAscending());

		Iterator it = list.iterator();

		while (it.hasNext())

			System.out.println(it.next());

	}

}



[실행결과]

김자바,1,1,90,70,80,240,80.0 

안자바,1,2,80,80,90,250,83.3 

남궁성,1,3,100,100,100,300,100.0 

이자바,2,1,70,90,70,230,76.7 

홍길동,2,2,60,100,80,240,80.0

 

 

https://developer-ek.tistory.com/17