알고리즘 문제 풀기 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외 다른 타입은 저장불가로 에러 발생