본문 바로가기
카테고리 없음

TIL 230131

by hbIncoding 2023. 1. 31.

알고리즘 문제 풀기 5일차

 

1. 오늘 공부한 이론

1)Integer와 int 의 차이

  • Integer는 (wrapper class), int 는 변수 타입이다.
  • Integer는 매개변수로 객체가 필요할때, 기본형 값이 아닌 객체로 저장할 때, 객체간 비교가 필요할 때 사용
  • int는 산술연산이 가능하다, null로 초기화 불가능(0으로 초기화 된다)
  • Integer는 null값을 처리할 수 있다.

2)Set과 TreeSet, HashMap

  • 이둘의 공통점은 중복을 제거한다는 것
  • 요소를 넣어줄 때 Set은 들어온 순서대로 넣는다.
  • TreeSet 은 이진탐색법을 이용하여 중복제거와 동시에 정렬을 이루어 준다.
  • Map은 딕셔너리와 같다. 키값은 중복이 안되지만 value는 중복이 된다.

3)ArrayList와 LinkedList

  • ArrayList : 일기는 빠르지만, 추가/삭제는 느리다 > 순차적인 추가삭제는 더 빠름, 비효율적 메모리 사용
  • LinkedList : 읽기는 느리지만, 추가/삭제는 빠리다. > 데이터가 많을수록 접근성이 떨어진다.

4)Stack과 Queue

  • 스택은 LIFO(Last in Fisrt out)
  • 큐는 FIFO(First in First out)

5)Generics

  • 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시 타입 체크를 해주는 기능
  • 객체 타입을 컴파일 시에 체크하기 때문에 타입 안정성을 높이고 형변환의 번거로움이 줄어듦
  • 저장된 객체를 꺼낼 때 형변환이 필요 없어서 편하다.  > 코드가 간결해 진다

 

2. 코드로 실습해본 내용

2) Array의 메서드

 ㄱ.Arrays.asList(arr)로 list로 바꿀 수 있지만 빈환한 list의 크기를 변경할 수 없다. 하지만 아래와 같이 바꿀 수 있다.

        int[] arr = {1,2,3,4,5,4};
        System.out.println(Arrays.binarySearch(arr,4));
        List list = Arrays.asList(arr);
//        list.remove(3); 불가능
        System.out.println(Arrays.deepToString(list.toArray()));

        List list2 = new ArrayList(Arrays.asList(1,2,3,4,5));
        list2.remove(2); 가능  하지만 (1,2,3,4,5)가 아닌 (arr)로 받으면 수정 불가
        System.out.println(Arrays.deepToString(list2.toArray()));

 

 ㄴ. 배열 채우기 - fill(), setAll()

int arr = new int[5];
Arrays.fil(arr, 9) // arr=[9,9,9,9,9];
Arrays.setAll(arr, (i) -> (int)(Math.random()*5) +1 // arr = [1,3,4,3,2]

 ㄷ. 배열의 검색 - binarySearch() : 2진 검색을 이용하기 때문에 중복 원소가 있다면 어느 index가 호출될지 모른다

        int[] arr = {1,2,3,4,5,43,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4};
        System.out.println(Arrays.binarySearch(arr,4)); // 10

 ㄹ. sort의 다양한 활용과 compare 오버라이딩

public class test_call {
	public static void main(String[] args) {
        String[] arr = {"cat","Dog","lion","tiger"};

        Arrays.sort(arr);
//        "Dog", "cat","lion","tiger"
        Arrays.sort(arr, String.CASE_INSENSITIVE_ORDER);
//        "cat","Dog","lion","tiger"
        Arrays.sort(arr, new Descending());
//        "tiger", "lion","Dog", "cat"
    }
}
class Descending implements Comparator{
    @Override
    public int compare(Object o1, Object o2) {
        if( o1 instanceof Comparable && o2 instanceof Comparable){
            Comparable c1 = (Comparable) o1;
            Comparable c2 = (Comparable) o2;
            return c1.compareTo(c2) *-1;
        }
        return -1;
    }
}

3) HashSet, TreeSet

 ㄱ. 중복값을 제거한다 + Object 클래스는 다양한 변수 타입을 저장 가능하다.

 ㄴ.Iterator를 이용한 출력이 가능하다.

        Object[] objArr = {"1",1, new Integer(1), "2", "2","3",2};
        Set set = new HashSet();
        for (int i = 0; i < objArr.length; i++) {
            set.add(objArr[i]);
        }
        System.out.println(set);
        //[1, 1, 2, 2, 3]
        
        
        Iterator it = set.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }
        //출력
        1
        1
        2
        2
        3

ㄷ. LinkedList로 바꾸어 sort를 할 수 있다.

        Object[] objArr = {3,3,12,14,1,6,8,4,4,15,21,20};
        Set set = new HashSet();
        for (int i = 0; i < objArr.length; i++) {
            set.add(objArr[i]);
        }
        System.out.println(set);

        List list = new LinkedList(set);
        Collections.sort(list);
        System.out.println(list);

 ㄹ. TreeSet적용

 ㅁ. Treeset을 이용한 범위 탐생

        int[] Arr = {3,3,12,14,1,6,8,4,4,15,21,20};
        TreeSet set = new TreeSet();

        for (int i = 0; i < Arr.length; i++) {
            set.add(Arr[i]);
        }
        System.out.println(set);    
        /[1, 3, 4, 6, 8, 12, 14, 15, 20, 21]/
        
        System.out.println(set.subSet(10,16));
        /[12, 14, 15]/

4)제너릭스

ArrayList tvList = new ArrayList();
tvList.add(new Tv());
Tv t = (Tv)tvlist.get(0);

//제너릭스 사용시
ArrayList<Tv> tvList = new ArrayList<Tv>();
tvList.add(new Tv());
Tv t = tvlist.get(0);
tvList.add(new audio()); >> Tv외 다른 타입은 저장불가로 에러 발생