본문 바로가기

카테고리 없음

3월 5주차 리마인드! 4월 첫째주에는

결국 백엔드 개발자에게 나중에 발휘될 지식은

바로 알고리즘과 자료구조(CS지식)이다.

 

선형자료구조:

배열, 연결리스트, 스택, 큐, 데크, 해시테이블

 

비선형자료구조:

트리(+이진탐색트리), 그래프, 힙, 우선순위 큐, 트라이

 

많이 쓰이는 배열(Array)에 대해.

Array vs ArrayList

 

공통점:

1. 요소를 추가할 땐 add, 요소를 가져올 땐 get을 사용한다.(일정한 시간에 실행)

2. 둘 다 중복되는 요소를 저장할 수 있다.

3. Null 값을 저장할 수 있고, index를 사용해 값을 참조할 수 있다.

4. 순서 지정은 되지 않는다.

 

차이점:

1. 길이를 조정할 수 있는 건 ArrayList(가변 길이),

길이 조정이 안되는 건 Array(고정 길이) -> 새로운 데이터 추가 시 또 새로운 배열 만들어야함

(+ ArrayList Object는 ArrayList size를 나타내는 capacity 인스턴스 변수를 가지고 있다.

ArrayList에 요소들이 더해지면 capacity 또한 자동적으로 늘어난다.)

 

2. 속도의 차이

더 빠른 건 Array이다.

코테나 알고리즘 문제 풀이 시 Array로 푸는 것이 가능하다면 Array를 이용하기

 

3. ArrayList는 길이 반환시 size() 메소드,

Array는 length 메소드.

 

4. 제네릭이 사용가능한 건 ArrayList,

Array는 사용불가

(출처: https://velog.io/@humblechoi/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-Array-vs-ArrayList)

 

원형 큐

배열을 이용해 큐를 구현할 땐, 크기가 고정되어있고,

데이터의 삽입과 삭제가 반복되며 rear과 front가 계속 증가되기에 이미 꺼낸 데이터가 들어있던 배열의 인덱스를 

다시 활용할 수 없다!

 

이런 문제를 해결하기 위해 원형 큐를 사용한다!

//배열을 이용한 기본 큐 직접 구현(원형 큐)
class MyQueue2{
    int[] arr;
    int front =0;
    int rear = 0;
    MyQueue2(int size){
    arr = new int[size+1];

    }

    public boolean isEmpty(){
    return this.rear == this.front;
    }

    public boolean isFull(){
    return (this.rear+1) % this.arr.length  == this.front;
    }

    public void enqueue(int data){
    if(this.isFull()){
        System.out.println("Queue is full");
        return;
    }
    this.rear = (this.rear+1)% this.arr.length; //끝에 도달하면 다시 원형으로 돌아와야 하니까 this.arr.length;
         this.arr[this.rear] = data;
    }

    public Integer dequeue(){
    if(this.isEmpty()){
        System.out.println("Queue is empty!");
        return null;
    }
    front = (front+1)%this.arr.length;
    return this.arr[front];
    }

    public void printQueue(){
    int start =(this.front+1) %this.arr.length;
    int end = (this.rear +1) %this.arr.length;

        for (int i = start; i != end; i =(i+1)%arr.length) {
            System.out.println(this.arr[i]+" ");
        }
        System.out.println();
    }
}}

 

여기서 포인트는 원형 큐는 계속 회전해야하기에 %length로 처리한다.

원형 큐에선 배열로 설정된 크기 모두를 사용할 수 없는데,

원형 큐에서의 포화 큐는 front와 rear 사이에 하나의 빈 공간이 존재하기에,

front와 rear 값을 증가시킬 때 배열의 크기에 대해 나머지 연산자를 사용한다.

(출처: https://m.blog.naver.com/PostView.naver?blogId=ghdalswl77&logNo=222167674316&categoryNo=77&proxyReferer=)

 


4월 첫째 주 목표:

-자료구조 다시 구현해보기(선형, 비선형 둘다)

- 밀린 과제 다 듣기

-하루에 2문제는 추가로 백준 문제 풀기

 

 

이번주 아쉬웠던 점:

-컨디션 조절 실패

- 개념이해가 먼저라 생각해, 문제를 열심히 풀 지 않음

(막상 풀어보니 문제를 풀고 부족한 개념을 보충하는 편이 더 효율적이라 판단되어짐)

 

다음 주엔 이번 주에 아쉬웠던 점을 해결해보겠습니다!!  😎