
부스트코드 '자바로 구현하고 배우는 자료구조'정리
1주차 - 자바 특성 및 알고리즘 기본
1.복잡성
(1) 자료구조란?
종류 - Array, Linked List, Stack&Queue, Hash Table, Tree
자료 형태

int[] score = new int[4];
score[0] = 90;
score[1] = 80;
score[2] = 70;
score[3] = 60;
출처 - https://kpopbloging.tistory.com/88
Linked List

-코드가 긴 관계로 참고가 되는 사이트를 올립니다.
LinkedList 출처 - https://freestrokes.tistory.com/84
Stack&Queue
-Stack(Last Input First Output)

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
public class StackQueueTest {
public static void main(String[] args) {
Stack<String> stack = new Stack<String>(); //Generics을 이용하여 Collection이 저장할 데이터 타입 지정
for(int i=0;i<3;i++)
stack.push("Hi-"+i); //stack에 데이터를 삽입하는 문장
//stack = ["Hi-0", "Hi-1", "Hi-2"], top=2
System.out.println(stack.pop()); //스택의 꼭대기 값을 반환하고 삭제한다. Hi-2
System.out.println(stack.peek()); //스택의 꼭대기 값을 반환한다. Hi-1
System.out.println(stack.search("Hi-1")); //값이 존재하면 1, 아니면 -1을 출력한다. 1
System.out.println(stack.isEmpty()); //스택이 비어있으면 true을 출력한다. false
System.out.println(stack); //[Hi-0, Hi-1]
-Queue(First Input First Output)

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
public class StackQueueTest {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<String>();
for(int i=0;i<3;i++)
queue.add("데이터-"+i); //큐에 데이터를 삽입한다.
//queue = ["데이터-0", "데이터-1", "데이터-2"], front=0, rear=2
System.out.println(queue.peek()); //큐의 front가 가리키는 값을 반환한다. 데이터-0
System.out.println(queue.poll()); //큐의 front가 가리키는 값을 반환하고 삭제한다. 데이터-0
System.out.println(queue.isEmpty()); // false
System.out.println(queue); //[데이터-1, 데이터-2]
}
}
출처 - https://blog.naver.com/PostView.nhn?blogId=pjok1122&logNo=221504688603


(2) 복잡성
*시간복잡도 - 서로 다른 알고리즘을 비교시 사용.
규칙)
생각해보기) 시간복잡도가 1이거나 n인 경우 어떤 상황을 의미할까?
=>
(3) 빅오 표기법
*빅오 표기법 - 알고리즘의 효율성을 표기하는 표기법, 알고리즘끼리 비교하는 용도로 자주 사용

(x축 - 시간복잡도(n에 따라 증가하는 메모리의 양), y축 - 처리 시간)
*빅오 표기법 속 관계
생각해보기) 빅오 표기법 속 관계는 무엇의 약자일까?
=>
[빅 오 표기법 문제] 맞게 표기됐는지 확인하시오.
문제1. n^(4/3) = O(nlogn)
=> 그래프로 그리면 무한대로 식이 그래프에 그려지는 경우 어떻게 나오는지 확인하는 게 포인트!
풀이)
(1)1000을 대입하면,1000^(4/3)과 1000log(1000)을 그래프로 그리면서 비교하면, 10000과 1000이 된다
-> 이를 가지고 그래프를 그려서 (0,0)과 같은 x축에 따른 결과에
지나는 그래프의 모양을 선형적으로 그려 파악한다.
(2)n^(4/3)과 nlogn을 그래프로 비교하면 n^(4/3)은 nlogn 위에 위치
-> 이를 통해 n^(4/3)과 nlogn을 비교하여 n^(4/3)이 위치하는 곳을 본다.
여기서 nlogn은 비교대상으로 빅 오 복잡도를 통해 보면
n^(4/3)은 nlogn보다 위에 존재하여 O(nlogn)이라고 말할 수 없다.
정답: No, n^(4/3)은 O(nlogn)이 될 수 없다.
문제2. 3n^3+4n^2+5n+6 = θ(n^3)
=> 상수항, 최대차수항을 제외한 모든 (n-1)차항은 제거된다.
풀이)
남는 건 n^3으로 비교대상인 n^3과 일치.
정답: Yes.
문제3. n(n-1)/2 = O(n^2)
=> 문제 2번과 같은 접근 방식
풀이)
남는 건 n^2으로 비교대상은 n^2
정답: Yes.
문제4. 2^n = w(n)
=> 1번 접근 방식과 유사.
풀이)
(1)1000을 대입하면,
-> 2^(1000)과 1000인 점과 (0,0)인 점을 그래프에 선형적으로 그린다.
(2)그래프 내 비교하면,
-> 2^n이 n 위에 존재한다. 비교대상인 n 위가 바로 w()영역으로 이는 정답.
정답: Yes.
문제5. n^3 = O(n^2)
=> 1번 접근 방식으로 그래프 내 비교.
풀이)
n^3과 n^2를 비교하면, n^3 > n^2가 된다. 이를 가지고 그래프 내 비교 하면, n^3은 n^2위에 배치.
정답: No, n^3은 O(n^2)이 될 수 없다.
문제6. n^2 = O(n^3)
=> 1번 접근 방식으로 그래프 내 비교.
풀이)
그래프 내 서로 비교하면, n^2은 n^3보다 무조건 아래에 위치.
정답: Yes.
생각해보기) 문제 1이에서 n=1을 대입하면 어떻게 되나요? 적당히 큰 수를 대입하는 이유는?
+)왜 문제 1과 문제 3은 로피탈 정리로 문제를 풀 수 있을까?
*참고
-빅오 표기법: https://noahlogs.tistory.com/27 (복잡도 관련)

-로피탈 정리
