posted by 귀염둥이채원 2019. 2. 28. 19:57

블로그(네이버, 티스토리)에 프로그래밍 관련 소스 코드를 포스팅할때 가독성이 중요하다.

소스코드를 하이라이트해서 예쁘게 포스팅하는 두가지 방법이 있다.


# 티스토리 소스코드 하이라이트

1. Colorscripter 사용

2. SyntaxHighlighter 사용


# Colorscripter 

- https://colorscripter.com/ 

- 웹페이지에서 소스 코드를 변환하여 포스팅에 붙여 넣는 방법

- 설치가 필요없고 사용법이 쉽다.

남들에게 URL주소를 공유하면서 소스코드를 공유할 수 있다


# SyntaxHighlighter

- http://alexgorbatchev.com/SyntaxHighlighter/ 

- 오픈소스 자바 스크립트를 pre 태그로 포스팅하는 방법

- 설치 및 설정이 번거롭지만 테마 종류가 다양하다.


# 참고사이트

https://tbbrother.tistory.com/43

https://ingorae.tistory.com/342

posted by 귀염둥이채원 2019. 2. 28. 19:02

프로그래밍을 하다보면 특정 소스 코드 구간의 시간을 측정해야 하는 경우 생긴다.

알고리즘을 문제를 풀다보면 시간복잡도가 중요하기 때문에 알고리즘에 대한 속도를 측정하는 것이 필요하다.

또는 개발한 프로그램의 성능이 잘 안나오는 경우 어느 부분이 병목인지 확인이 필요할수도 있다.


자바(Java)에서 System 함수인 System.currentTimeMillis() 함수를 이용하면 쉽게할 수 있다.

시작 구간과 끝나는 구간에 각각 해당 함수를 써서 시간을 저장한 후,

두 시간간의 차이를 계산하면 ms 단위의 시간차를 구할 수 있다.


아래의 코드는 특정 부분의 로직에 걸리는 시간을 테스트 할때 사용하면 좋다.


# 샘플 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class TEST {
    public static void main(String arg[]) throws Exception {
        long beforeTime = System.currentTimeMillis();
        long count = 0;
        for (int i = 0; i < 1000000; i++) {
            for (int j = 0; j < 1000000; j++) {
                count++;
            }
        }
        System.out.println("count= " + count);
        long afterTime = System.currentTimeMillis();
        long secDiffTime = (afterTime - beforeTime);
        System.out.println("시간차이(msec) : " + secDiffTime);
    }
}
cs

# 참고 사이트

https://hijuworld.tistory.com/2

http://www.topcredu.com/bbs/board.php?bo_table=LecJava&wr_id=736

posted by 귀염둥이채원 2019. 2. 28. 18:28

# Parametric Search(파라메트릭 서치) 알고리즘 개념

- Binary Search를 응용한 방법으로 기본적인 탐색 방법은 Binary Search와 비슷함

- 최적화 문제(문제의 상황을 만족하는 특정 변수의 최솟값, 최댓값을 구하는 문제)를 결정 문제로 바꾸어 푸는 것

- 원하는 조건을 만족하는 가장 알맞는 값을 특정한 오차범위 이내에서 알고싶은 경우 사용

임의의 값으로 계산 후 확인해가며 해를 구하는 방법 (Binary Search 사용)


# Binary Search vs Parametric Search

Binary Search: 배열에서 중앙값(middle)이 가리키는 값이 내가 찾는 값인지 중요

Parametric Search:  원하는 조건을 만족하는 가장 알맞는 값을 찾는 것


# 시간복잡도

Binary Search와 마찬가지로 O(logN)의 복잡도를 가지게 된다.


# Parametric Search를 사용할수 있는 조건

1) 결정 문제를 정의했을 때, 쉽게 풀 수 있는 경우

2) (최소값을 구하는 경우) 최소값이 x라면, x이상의 값에 대해서는 모두 조건을 만족

3) (최대값을 구하는 경우) 최대값이 x라면, x이하의 값에 대해서는 모두 조건을 만족


# 참고사항

* 데이터는 정렬된 상태이면 좋지만, 정렬되지 않은 경우도 사용가능하다.

   - 데이터가 정렬되지 않은 경우에는 중간값을 설정 기준이 중요하다?? 

     (목적에 맞게 조건을 설정하는 것이 중요)


# SWEA 샘플 코드

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import java.io.FileInputStream;
import java.util.Scanner;
 
public class ParametricSearch {
    static int K;
    static int N;
    static int low;             // 리본의 최소 길이
    static int high;            // 리본의 최대 길이
    static int mid;             // 리본의 중간 길이
    static int numRibbon;       // 중간 길이로 자른 경우 리본의 개수
    static int Answer;          // 리본의 최대 길이
    static int sizeRibbon[];    // K개 리본의 길이
 
    static void search() {
        // 중간 값을 구하기
        mid = low + (high - low) / 2;
        numRibbon = 0;
        // System.out.printf("[Before] low:%5d, mid=%5d, high=%5d, (high-low)/2=%5d,
        // numRibbon=%5d, Answer=%5d\n",
        // low, mid, high, (high-low)/2, numRibbon, Answer);
 
        // 중간값으로 나눠서 리본 개수를 구하기
        for (int i = 0; i < K; i++) {
            numRibbon += (sizeRibbon[i] / mid);
        }
 
        // 필요한 리본개수보다 같거나 많은 경우
        // - 리본의 최소 길이 = 중간길이 + 1
        // - 중간길이 > 현재 최대 길이
        // - 최대 길이로 설정
        // 필요한 리본개수보다 적은 경우
        // - 리본의 최대 길이 = 중간 길이 - 1
        if (numRibbon >= N) {
            low = mid + 1;
            if (Answer < mid)
                Answer = mid;
        } else {
            high = mid - 1;
        }
 
        // System.out.printf("[After ] low:%5d, mid=%5d, high=%5d, (high-low)/2=%5d,
        // numRibbon=%5d, Answer=%5d\n",
        // low, mid, high, (high-low)/2, numRibbon, Answer);
    }
 
    public static void main(String arg[]) throws Exception {
        System.setIn(new FileInputStream("C:\\java\\SW\\sample.txt"));
        Scanner sc = new Scanner(System.in);
 
        int T = sc.nextInt();
        for (int test_case = 1; test_case <= T; test_case++) {
            low = 1;
            high = 0;
            Answer = -1;
 
            K = sc.nextInt();
            N = sc.nextInt();
            sizeRibbon = new int[K];
 
            // 리본 길이의 최대값을 구하기
            for (int i = 0; i < K; i++) {
                sizeRibbon[i] = sc.nextInt();
                if (high < sizeRibbon[i]) {
                    high = sizeRibbon[i];
                }
            }
            // System.out.printf("%d: %d\n", test_case, high);
 
            while (low <= high) {
                search();
            }
            System.out.println("#" + test_case + " " + Answer);
        }
    }
}
cs


# 관련 문제

[2110번] 공유기 설치 :: https://www.acmicpc.net/problem/2110

[1654번] 랜선 자르기 :: https://www.acmicpc.net/problem/1654

[2613번] 숫자 구슬 :: https://www.acmicpc.net/problem/2613


# 참고사이트

https://www.crocus.co.kr/1000

https://coderkoo.tistory.com/8

https://sarah950716.tistory.com/16

https://its2eg.tistory.com/entry/%EC%9D%B4%EC%A7%84%ED%83%90%EC%83%89Binary-Search%EC%99%80-%ED%8C%8C%EB%9D%BC%EB%A9%94%ED%8A%B8%EB%A6%AD-%EC%84%9C%EC%B9%98Parametric-Search

posted by 귀염둥이채원 2019. 2. 28. 15:54

# 자바 기본 타입(Primitive)

- 정수타입: byte(1바이트), short(2바이트), char(2바이트), int(4바이트), long(8바이트)

- 실수타입: float(4바이트), double(8바이트)

- 논리타입: Boolean(1바이트)


# 소스코드

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
public class TEST {
    public static void main(String[] args) throws Exception {
        System.out.println("##### byte 타입의 값");
        System.out.println("MIN: " + Byte.MIN_VALUE);
        System.out.println("MAX: " + Byte.MAX_VALUE + "\n");
 
        System.out.println("##### short 타입의 값");
        System.out.println("MIN: " + Short.MIN_VALUE);
        System.out.println("MAX: " + Short.MAX_VALUE + "\n");
 
        System.out.println("##### int 타입의 값");
        System.out.println("MIN: " + Integer.MIN_VALUE);
        System.out.println("MAX: " + Integer.MAX_VALUE + "\n");
 
        System.out.println("##### long 타입의 값");
        System.out.println("MIN: " + Long.MIN_VALUE);
        System.out.println("MAX: " + Long.MAX_VALUE + "\n");
 
        System.out.println("##### float 타입의 값");
        System.out.println("MIN: " + Float.MIN_VALUE);
        System.out.println("MAX: " + Float.MAX_VALUE + "\n");
 
        System.out.println("##### double 타입의 값");
        System.out.println("MIN: " + Double.MIN_VALUE);
        System.out.println("MAX: " + Double.MAX_VALUE + "\n");
    }
}
cs


# 결과

##### byte 타입의 값

MIN: -128

MAX: 127


##### short 타입의 값

MIN: -32768

MAX: 32767


##### int 타입의 값

MIN: -2147483648

MAX: 2147483647


##### long 타입의 값

MIN: -9223372036854775808

MAX: 9223372036854775807


##### float 타입의 값

MIN: 1.4E-45

MAX: 3.4028235E38


##### double 타입의 값

MIN: 4.9E-324

MAX: 1.7976931348623157E308 


posted by 귀염둥이채원 2019. 2. 28. 02:38

# 시간복잡도(Time Complexity)란?

* 알고리즘이 문제를 해결하기 위한 시간(연산)의 횟수

* INPUT N에 대하여 알고리즘이 문제를 해결하는 데에 얼마나 오랜 시간이 걸리는 지를 분석하는 것

* 최고차항의 계수만 표기하는 방법을 사용

  (N이 커질수록 낮은 차수들의 연산의 횟수는 상대적으로 작아져서 무시해도 됨)


ex) n개의 데이터에 대한 연산 횟수가 

2n^3-5n^2+n+1일 경우 시간 복잡도는 O\left(n^3\right)이다. 
최고차항의 계수 2 -5n^2+n+1이 시간 복잡도에 영향을 안 끼치는 것은 아니나, 
전체적인 관점에서 보면 최고차항의 차수가 가장 큰 영향을 끼치고 그 외의 것들은 최고차항의 차수에 비하면 상대적으로 영향이 미미하기 때문이다.


# 알고리즘 성능 파악

1. 최선의 경우 Best Case

2. 최악의 경우 Worst Case

3. 평균적인 경우 Average Case


평균적인 경우가 가장 이상적으로 보이겠지만 알고리즘이 복잡해 질수록 평균적인 경우는 구하기가 매우 어려워 진다.

그러므로 최악의 경우로 알고리즘의 성능을 파악한다.


# 빅오(Big-O)표기법이란?

* 최악의 경우로 알고리즘의 성능을 파악하는 것

ex) Binary Search 알고리즘의 시간복잡도를 Big-O로 나타내면 O(n log n)

-> Binary 알고리즘은 n개의 원소가 있을때 아무리 못해도(최악의 경우에) 

   n log n번 정도(대략적) 반복문을 돌리면 값을 찾을 수 있다는 의미이다.


# 시간복잡도 정리

은 \log_{2}n을 의미한다.

  •  과 같은 상수(Constant) 형태
  • O\left(\log n\right) 과 같은 로그(Logarithmic) 형태
  • O\left(n\right) 과 같은 선형
  • O\left(n \log n\right) 과 같은 선형로그 형태
  • O\left(n^c\right), O\left(n^3\right)과 같은 다차(Polynomial) 형태
  • O\left(c^n\right), O\left(3^n\right)과 같은 지수(Exponential) 형태
  • O\left(n!\right)과 같은 팩토리얼(Factorial) 형태


\log n



시간복잡도가 O(N^3)이상이면 시간복잡도가 기하급수적으로 늘기때문에 실행하기 힘든 프로그램



# 참고사항

* 성한 알고리즘이 1억 번의 연산을 하면 수행시간은 1초로 가정하고 접근하는것이 일반적이다.



# 참고 사이트

https://ko.wikipedia.org/wiki/%EC%8B%9C%EA%B0%84_%EB%B3%B5%EC%9E%A1%EB%8F%84

https://namu.wiki/w/%EC%8B%9C%EA%B0%84%20%EB%B3%B5%EC%9E%A1%EB%8F%84

https://m.blog.naver.com/PostView.nhn?blogId=kks227&logNo=220769859177&proxyReferer=https%3A%2F%2Fwww.google.com%2F

https://www.youtube.com/watch?v=OVRLHJC95Gs

https://www.youtube.com/watch?v=6Iq5iMCVsXA


posted by 귀염둥이채원 2019. 2. 27. 21:37

이클립스 단축키 정리입니다.



##########################################################

F1 : 도움말

F3 : 클래스, 메소드, 속성이 선언된 위치로 이동

F4 : 클래스의 계층구조 확인(Type Hierarchy view)

F5 : 디버깅 시 선택된 행의 메소드 내부로 이동 (Step In)

F6 : 디버깅 시 선택된 행의 아래로 이동 (Step Over)

F7 : 디버깅 시 실행중인 메소드 외부로 이동(Step Return)

F8 : 디버깅 시 다음 디버그 포인트(중단점)로 이동 (Resume)

F11 : 디버그 모드로 실행 (Debug)

F12 : Editor창으로 이동

 

##########################################################

Ctrl + / : 한 줄 주석(//) 처리 또는 해제

Ctrl + 콤마(,) 또는 점(.) : 다음/이전 에러(경고)로 이동

Ctrl + F6 또는 E : Editor 창 간의 이동 (파일간의 이동)

Ctrl + F7 : View 창 간의 이동 (Console, Problems 등)

Ctrl + F8 : Perspectives 창 간의 이동 (Java, Debug 등)

Ctrl + F11 : 실행 모드로 실행 (Run)

Ctrl + 1 : 빠른 수정 (에러에 대한 수정할 코드 추천)

Ctrl + D : 한 줄 삭제

Ctrl + F : 문자열 찾기 (Find/Replace 다이얼로그)

Ctrl + H : 문자열 찾기 (Search 다이얼로그)

Ctrl + I : 들여쓰기 자동 적용

Ctrl + K : 현재 선택된 문자열과 동일한 문자열 찾기

Ctrl + L : 행 번호를 입력하여 특정 행으로 이동 (Go to Line 다이얼로그)

Ctrl + M : 현재 View / Editor 를 최대화

Ctrl + N : 새로운 파일 / 프로젝트 생성

Ctrl + O : 메소드 또는 속성 이동

Ctrl + Q : 마지막으로 편집한 곳으로 이동

Ctrl + T : 클래스 계층 구조 팝업

Ctrl + W : 파일 닫기

Ctrl + Space : 코드 자동완성

 

##########################################################

Ctrl + Shift + F4 : 열린 파일 모두 닫음

Ctrl + Shift + Space : 메소드의 파라미터 목록 표시

Ctrl + Shift + B : 현재 행의 중단점(Break Point) 설정 / 해제

Ctrl + Shift + F : 코드 형식 정리

Ctrl + Shift + G : 선택한 메소드, 속성이 사용된 모든 곳을 검색 (Search view)

Ctrl + Shift + L : 모든 단축키 정보 표시

Ctrl + Shift + O : import 자동 추가 / 삭제

Ctrl + Shift + R : 파일(클래스 포함) 찾기(Open Resource 다이얼로그)

Ctrl + Shift + T : 클래스 찾기 (Open Type 다이얼로그)

Ctrl + Shift + X : 대문자 변환

Ctrl + Shift + Y : 소문자 변환

Ctrl + Alt + G : 전체 파일에서 선택된 문자열과 동일한 문자열 찾기 (Search view)

Ctrl + Alt + 화살표(up, down) : 현재 라인을 위(아래)로 복사

Alt + 화살표(up, down) : 현재 라인을 한 줄씩 위(아래)로 이동

posted by 귀염둥이채원 2019. 2. 27. 21:28

# 이진 탐색(Binary Search)이란?

* 반씩 범위를 나누어 가면서 분할정복하여 탐색하는 방법

* 데이터가 정렬되어 있는 배열에서 특정한 값을 찾아내는 알고리즘 (정렬된 데이터가 아니면 적용이 불가능)

* 사전을 찾을 때 사전을 펴서 찾는 단어가 없으면 위치에 따라 앞쪽을 찾거나 뒤쪽을 찾고, 찾을 때까지 그걸 반복하는 걸 생각하면 쉽다.

* 1부터 n까지 숫자중 하나 맞추기 게임을 생각하면 쉽다.


# 선형 자료구조의 대표적인 탐색 방법

* 선형탐색 (Linear Search)

처음부터 하나하나 비교하여 검색하는 방법

장점: 구현하기 쉽고, 정렬이 안되어 있어도 된다.

단점: 검색하는데 시간이 오래 걸린다.


시간 복잡도

최고: O(1), 평균: O(N), 최악: O(N)


* 이진탐색 (Binary Search)

장점: 속도가 빠르다.

단점: 값들이 정렬된 상태이어야 한다.


시간 복잡도

최고: O(1), 평균: O(log N), 최악: O(log N)


# 이진 탐색의 성능

* 탐색 대상의 범위 : 1/2 1/4, 1/16, ... (탐색 대상이 반씩 줄어들게 된다.)

* n : 데이터 집합의 크기

   x : 탐색 반복 횟수

   x = log2n

* 100만개의 데이터 집합 : 최대 20회

* 1000만개의 데이터 집합 : 최대 23회

* 4,294,967,296개(약 43억개)의 데이터 집합: 최대 32회


# 이진탐색 (Binary Search) 과정

1. 데이터 집합의 중앙에 있는 요소 선택

2. 중앙 요소의 값과 찾고자 하는 목표 값을 비교

3. 목표 값이 중앙 요소의 값보다 작다면 중앙을 기준으로 데이터 집합의 왼편에 대해 새로 검색을 수행

   크다면 오른편에 대해 이진 탐색을 새로이 수행

4. 찾고자 하는 값을 찾을 때까지 1번~3번 과정을 반복


# 예제 소스

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import java.io.FileInputStream;
import java.util.Scanner;
 
public class BinarySearch_Test {
    static int M; // 배열의 개수
    static int N; // 검색할 숫자의 개수
    static int input[];
 
    static void binarySearch(int input[], int low, int high, int searchValue) {
        // 값을 찾지 못한 경우
        if (low > high) {
            System.out.print("-1 ");
            return;
        }
 
        // 중간 index 구하기
        int mid = (low + high) / 2;
 
        // 1. searchValue < 중간값
        // 2. searchValue > 중간값
        // 3. searchValue == 중간값
        if (searchValue < input[mid]) {
            binarySearch(input, low, mid - 1, searchValue);
        } else if (searchValue > input[mid]) {
            binarySearch(input, mid + 1, high, searchValue);
        } else {
            System.out.print(+mid + " ");
            return;
        }
    }
 
    public static void main(String[] args) throws Exception {
        System.setIn(new FileInputStream("C:\\java\\SW\\sample.txt"));
        Scanner sc = new Scanner(System.in);
 
        int T = sc.nextInt();
 
        for (int test_case = 1; test_case <= T; test_case++) {
            M = sc.nextInt();
            N = sc.nextInt();
            input = new int[M];
 
            for (int i = 0; i < M; i++) {
                input[i] = sc.nextInt();
            }
 
            System.out.print("#" + test_case + " ");
            for (int i = 0; i < N; i++) {
                int searchValue = sc.nextInt();
                binarySearch(input, 0, M - 1, searchValue);
            }
            System.out.println();
        }
        sc.close();
    }
}
cs


# 참고 사이트

https://namu.wiki/w/%EC%9D%B4%EC%A7%84%20%ED%83%90%EC%83%89

https://www.youtube.com/watch?v=Vfg6-AWGsCw

https://ledgku.tistory.com/35

https://mygumi.tistory.com/72

https://blockdmask.tistory.com/167

https://wayhome25.github.io/cs/2017/04/15/cs-16/

posted by 귀염둥이채원 2019. 2. 27. 19:25

# sample.txt

2

5

5


# Template Code


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.io.FileInputStream;
import java.util.Scanner;
 
public class TEST {
    static int N;
    static int Answer;
 
    public static void main(String[] args) throws Exception {
        System.setIn(new FileInputStream("C:\\java\\SW\\sample.txt"));
        Scanner sc = new Scanner(System.in);
 
        int T = sc.nextInt();
        for (int test_case = 1; test_case <= T; test_case++) {
            Answer = N = sc.nextInt();
            System.out.println("#" + test_case + " " + Answer);
        }
    }
}
cs


# Result

#1 5

#2 5

posted by 귀염둥이채원 2019. 2. 27. 18:34

# 문제 링크


# 문제 요약


# 문제 풀이


# 소스 코드


# 회고

posted by 귀염둥이채원 2019. 2. 27. 18:33

# SWEA Reference Code

https://www.swexpertacademy.com/main/code/referenceCode/referenceCodeList.do


# Data Structure

- Stack

- Queue

- Priority Queue

- Hash

- Tree

- Graph

- Linked List


# Algorithm

- Recursion

- Insertion Sort

- Quick Sort

- Quick Sort

- Counting Sort

- Binary Search -- https://palyoung.tistory.com/35

- DFS Searching

- BFS Searching

- Parametric Search

- Dynamic Programming

- Permutation & Combination

- Dijkstra



# 백준 알고리즘 기초

https://code.plus/course/4


1. 알고리즘과 입/출력

- Hello World

- A+B

- A+B - 2

- A+B - 3

- A+B - 4

- A+B - 5

- A+B - 6

- A+B - 7

- A+B - 8

- 그대로 출력하기

- 그대로 출력하기 2

- 숫자의 합

- 열 개씩 끊어 출력하기


2. 자료구조 1

- 스택

- 괄호

- 쇠막대기

- 에디터

- 큐

- 조세퍼스 문제

- 덱

- 알파벳 개수

- 알파벳 찾기

- 문자열 분석

- 단어 길이 재기

- ROT13

- 네 수

- 접미사 배열


3. 다이나믹 프로그래밍 1

- 1로 만들기

- 2×n 타일링

- 2×n 타일링 2

- 1, 2, 3 더하기

- 붕어빵 판매하기

- 쉬운 계단 수

- 오르막 수

- 이친수

- 스티커

- 포도주 시식

- 가장 긴 증가하는 부분 수열

- 가장 큰 증가 부분 수열

- 가장 긴 감소하는 부분 수열

- 가장 긴 바이토닉 부분 수열

- 연속합

- 계단 오르기

- 제곱수의 합

- 타일 채우기

- 파도반 수열

- 합분해

- 암호코드


4. 수학 1

- 나머지

- 최대공약수와 최소공배수

- 최소공배수

- GCD 합

- 진법 변환 2

- 진법 변환

- 2진수 8진수

- 8진수 2진수

- 2진수

- Base Conversion

- 소수 찾기

- 소수 구하기

- 골드바흐의 추측

- 소인수분해

- 팩토리얼

- 팩토리얼 0의 개수

- 조합 0의 개수


5. 정렬

- 수 정렬하기 2

- 좌표 정렬하기

- 좌표 정렬하기 2

- 나이순 정렬

- 국영수

- 수 정렬하기 3

- 카드

- K번째 수

- 버블 소트


6. 그래프 1

- DFS와 BFS

- 연결 요소의 개수

- 이분 그래프

- 순열 사이클

- 반복수열

- 텀 프로젝트

- 단지번호붙이기

- 섬의 개수

- 미로 탐색

- 토마토

- 다리 만들기


7. 트리 1

- 트리 순회

- 트리의 부모 찾기

- 트리의 지름

- 트리의 지름


# 삼성 SW 역량 테스트 기출 문제

https://www.acmicpc.net/workbook/view/1152



# geeksforgeeks

https://www.geeksforgeeks.org/


# 알고리즘 문제 해결 전략 세트 도서


# 동빈나 알고리즘

https://www.youtube.com/watch?v=qQ5iLNjpxSk&list=PLRx0vPvlEmdDHxCvAQS1_6XV4deOwfVrz


# T 아카데미

https://www.youtube.com/watch?v=vQv7PTKM2LI&list=PL9mhQYIlKEhdvKFh-wVpDuihNQv6C1gSy&index=1


# 권호흠 교수: 자바 알고리즘

https://www.youtube.com/playlist?list=PL52K_8WQO5oUuH06MLOrah4h05TZ4n38l

http://alg.pknu.ac.kr/


# 생활코딩: 자료구조

https://www.youtube.com/playlist?list=PLuHgQVnccGMDsWOOn_P0EmAWB8DArS3Fk


# 알고리즘 투게더 with 거니

https://www.youtube.com/channel/UCO7g158NWgLyn98z8v3zduA/videos


# 인프런: 영리한 프로그래밍을 위한 알고리즘 강좌

https://www.inflearn.com/course/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EA%B0%95%EC%A2%8C/


# 인프런: Java로 배우는 자료구조

https://www.inflearn.com/course/java-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0/