본문 바로가기

bitcamp/면접족보

면접족보 20/12/22_ArrayList, Set

1. ArrayList 와 LinkedList 의 장단점은?

ArrayList<E>

· 배열 기반으로 이루어진 구조이며, 연속된 구간으로 형성되어 삽입/삭제보다는 검색 위주로 사용된다.

· 잠점: 인스턴스 참조가 빠르다. (주소를 직접적으로 검색)

· 단점: 공간이 부족한 경우, 기존 배열을 복사하여 증가시키기 때문에 비교적 많은 시간이 소요된다.

 

LinkedList<E>

· 리스트 기반으로 이루어진 구조이며, 연속된 구간이 아닌 참조 형태로 형성되어 삽입/삭제 위주로 사용된다.

· 잠점: 객체를 생성하기 때문에 저장 공간을 늘리고, 삭제하는 과정이 단순.하다.

· 단점: 연속된 구간이 아닌 객체를 생성하여 주소를 참조하기 때문에 검색 시간이 비교적 많이 소요된다.

 

 

2. 아래와 같이 양수를 입력받아 저장하고, 가장 큰 수를 출력하는 프로그램을 작성하여라.

    단, Scanner 클래스로 -1이 입력되면 종료되어 큰 수가 출력된다.

 

· 참고

· 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 class Link{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        List<Integer> list = new LinkedList<>();
        int max = 0;
        
        System.out.println("정수를 입력해주세요(-1은 stop)");
        
        while(true) {
            Integer num;
            num = sc.nextInt();
            list.add(num);
            
            if(num == -1)
                break;    
 
            for(int e : list) {
                if(max < e)    
                    max = e;
            }        
    }System.out.println("가장 큰 수는 " + max);
    }
 }
cs

 

 

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

1
2
3
4
5
6
7
8
9
 class Lotto {
    public static void main(String[] args) {
        Set<Integer> set = new HashSet<Integer>();
        while(set.size() < 6) {
    set.add((int)(Math.random() * 45+ 1);
        }
        System.out.println(set);
    }
 }
cs

 

 

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

· Set<E> 인터페이스를 구현하는 대표적인 컬렉션은 HashSet<E>와 TreeSet<E>가 있으며,

  수학적 집합과 유사한 특성으로 저장 순서가 유지되지 않으며, 중복 저장을 허용하지 않는다.

· TreeSet<E>: List<E>와의 차이점은 중복 저장되지 않으면서, 오름차순으로 정렬된다는 차이가 있다. 

  단, 정렬이 되기 위해서는 Comparable-compareTo를 기반으로 구현된다.

 

 

5. Scanner 클래스를 사용하여 6개 학점('A', 'B', 'C', 'D', 'F')을 입력받아 ArrayList에 저장하고,

  ArrayList를 검색하여 학점을 점수(A=4.0, B=3.0, C=2.0, D=1.0, F=0)로 변환하여 평균을 출력하는 프로그램을 작성하라.

 

· 참고

· 작성

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
32
33
34
35
36
37
38
39
40
41
 class Grade{
    private double sum;
    private double avg;
    List<String> list;
 
    Grade(){
    }        
    public void input() {
        list = new ArrayList<>();    
        Scanner sc = new Scanner(System.in);
        System.out.println("성적을 입력해주세요");
        
        for(int i = 0; i < 6; i++) {
            String grade = sc.next();
            list.add(grade);
            
            switch(grade) {
            case "A" :
                sum += 4.0;
                break;
            case "B" :
                sum += 3.0;
                break;
            case "C" :
                 sum += 2.0;
                break;
            case "D" :
                sum += 1.0;
                break;
            case "F" :
                sum += 0;
                break;
            }
        }
    }
    public void output() {
        double avg = sum / list.size();
        System.out.println("총점은 " + sum);
        System.out.println("평균은 " + avg);
    }
 }
cs

 

1
2
3
4
5
6
7
 class Grademain {
    public static void main(String[] args) {
        Grade gr = new Grade();
            gr.input();
            gr.output();
    }
 }
cs

 

 

6. 출력이 아래와 같이 나오도록 하시오. **필수**

· 참고

· 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 class Num {
    private int num;
    
    public Num(int n) {
        num = n;
    }    
    @Override
    public String toString() {
        return String.valueOf(num);
    }
        
    @Override
    public int hashCode() {
        return num % 3;
    }
    @Override 
    public boolean equals(Object obj) {
        if(num == ((Num2)obj).num)
            return true;
       else
            return false;
    }
 }
cs

 

※위 코드에서 public int hashCode() 주석 처리 시 3개의 값이 출력되는 이유?

· hashCode를 통해 분류되는 주소값을 가진 군집에 객체들이 분류되어야 하는데 주석 처리 시 주소값이

  생성되지않기 때문에 분류가 이루어지지 않아 3개의 값이 출력된다.

 

 

7. Set<E>가 호출되는 원리와 순서를 설명하시오.

· 동일 인스턴스가 저장되지 않기 위해 hashCode()와 equals() 메소드 2가지의 기준을 거쳐 인스턴스를 판단한다.

· 주소를 가진 테이블을 찾아 체계적으로 검색하기 때문에 검색 속도가 가장 빠르고, hashCode() 호출하기 위해서는

  실제 주소를 가진 key가 필요하다. 

 

 1) hashCode를 통한 분류

  · hashCode()는 Object 함수 종류 중 하나이다.

  · 3, 7, 4, 13, 19의 분류 대상이 존재한다면, key를 통해 함수가 호출되어 해쉬알고리즘(ex: num % 3)을 통해 반환 값을

   기준으로 분류하여 군집을 형성하고, 동일한 값들이 모여 동일한 주소를 가진 테이블을 형성한다. 

  ·  

2) equals를 통한 분류(내용 비교!!)

  · hashCode()를 기반으로 분류된 군집에서 equals 메소드를 호출하여 한 번 더 동일 인스턴스가 존재하는지 비교한다.

 

 

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

· 참고

 

· 작성

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
 class Person {
    private String name;
    private int age;
    
    Person(String name, int age){
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return name + "(" + age + "세)";
    }    
    @Override
    public int hashCode() {
        return age % 3;    
       //3으로 나누지 않아도 ok!! age로 분류되서 이름이 같지 않으면 또 분류되기 때문!
       //equals에서 이름, 나이 둘 다 따지기 때문! 꼭 String은 equals로 비교하기.
   }
    @Override
    public boolean equals(Object obj) {
        String n = ((Person)obj).name;
        int a = ((Person)obj).age;
 
        if((this.name.equals(n)) && (this.age == a))
            return true;
        else
            return false;
    }
 }
cs