Skip to content

Latest commit

Β 

History

History
550 lines (433 loc) Β· 18.5 KB

week_01.md

File metadata and controls

550 lines (433 loc) Β· 18.5 KB

1μ£Όμ°¨-μ•Œκ³ λ¦¬μ¦˜κ³Ό 자료ꡬ쑰의 κ°œμš”


μ•Œκ³ λ¦¬μ¦˜(Algorithm)의 κ°œμš”

  • μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹€ν–‰ μ‹œκ°„ 및 기타 μžμ›μ˜ μ‚¬μš©λŸ‰μ„ 뢄석

    • 기타 μžμ› : λ©”λͺ¨λ¦¬, μ €μž₯μž₯치, 톡신 λ“±
  • μ‹€ν–‰ μ‹œκ°„μ˜ 뢄석에 집쀑해야 λ˜λŠ” 이유

점근적 뢄석

  • μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹€ν–‰ μ‹œκ°„μ— λ”°λ₯Έ λΆ„λ₯˜
    • 첫번째 : μž…λ ₯κ°’μ˜ 크기에 λ”°λ₯Έ μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹€ν–‰ μ‹œκ°„
    • λ‘λ²ˆμ§Έ : μž…λ ₯κ°’μ˜ 크기에 λ”°λ₯Έ μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹€ν–‰ μ‹œκ°„μ˜ μ„±μž₯λ₯ 

  • 점근적 ν‘œκΈ°λ²•(asymptotic notation)
    • λ°μ΄ν„°μ˜ 개수 n β†’ ∞ 일 λ•Œ μˆ˜ν–‰μ‹œκ°„μ΄ μ¦κ°€ν•˜λŠ” growth rate둜 μ‹œκ°„λ³΅μž‘λ„λ₯Ό ν‘œν˜„ν•˜λŠ” 기법
    • 점근적 ν‘œκΈ°λ²• : μƒμˆ˜ κ³„μˆ˜μ™€ μ€‘μš”ν•˜μ§€ μ•Šμ€ ν•­λͺ©μ„ μ œκ±°ν•œ 것
      • μ€‘μš”ν•˜μ§€ μ•Šμ€ ν•­κ³Ό μƒμˆ˜ κ³„μˆ˜λ₯Ό μ œκ±°ν•˜λ©΄ 이해λ₯Ό λ°©ν•΄ν•˜λŠ” λΆˆν•„μš”ν•œ 뢀뢄이 μ—†μ–΄μ Έμ„œ μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹€ν–‰ μ‹œκ°„μ—μ„œ μ€‘μš”ν•œ 뢀뢄인 μ„±μž₯λ₯ μ— 집쀑할 수 있음

  • 점근적 ν‘œκΈ°λ²•μ˜ μ’…λ₯˜
    • Big-Θ(λΉ… 세타) ν‘œκΈ°λ²• : μ‹€ν–‰ μ‹œκ°„μ— λŒ€ν•΄ 점근적으둜 κ·Όμ ‘ν•œ ν•œκ³„κ°’μ΄ μ‘΄μž¬ν•˜λŠ” ν‘œκΈ°λ²•
    • Big-Ο(λΉ… 였) ν‘œκΈ°λ²• : 점근적 μƒν•œμ„ λ§Œ μ œκ³΅ν•˜κ³  점근적으둜 κ·Όμ ‘ν•œ ν•œκ³„λ₯Ό 주지 μ•ŠλŠ” ν‘œκΈ°λ²•
    • Big-Ξ©(λΉ… μ˜€λ©”κ°€) ν‘œκΈ°λ²• : μ΅œμ†Œν•œμ˜ ν‘œν˜„μ„ ν•΄μ•Όν•  λ•Œ, μƒν•œμ„  없이 점근적 ν•˜ν•œμ„ λ§Œ μ‘΄μž¬ν•˜λŠ” ν‘œκΈ°λ²•

  • μœ μΌν•œ 뢄석법도 μ•„λ‹ˆκ³  κ°€μž₯ 쒋은 뢄석법도 μ•„λ‹˜
    • λ‹€λ§Œ μƒλŒ€μ μœΌλ‘œ κ°€μž₯ κ°„λ‹¨ν•˜λ©° μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹€ν–‰ν™˜κ²½μ— λΉ„μ˜μ‘΄μ μž„
    • κ·Έλž˜μ„œ κ°€μž₯ κ΄‘λ²”μœ„ν•˜κ²Œ μ‚¬μš©λ¨


Big-O ν‘œκΈ°λ²•μ˜ 상세

  • Big-OλŠ” μ•Œκ³ λ¦¬μ¦˜μ˜ νš¨μœ¨μ„±μ„ λ‚˜νƒ€λ‚΄λŠ” λŒ€μ€‘μ μΈ μ§€ν‘œ

    • κ°œμ„ ν•œ μ•Œκ³ λ¦¬μ¦˜μ΄ λΉ¨λΌμ‘ŒλŠ”μ§€, λ©”λͺ¨λ¦¬λ₯Ό 많이 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”μ§€ λ“±μ˜ μ•Œκ³ λ¦¬μ¦˜μ˜ μ„±λŠ₯을 νŒλ‹¨
  • μ‹œκ°„μ— λŒ€ν•œ μ‹œκ°„λ³΅μž‘λ„μ™€ 곡간에 λŒ€ν•œ κ³΅κ°„λ³΅μž‘λ„κ°€ 쑴재

μ‹œκ°„λ³΅μž‘λ„(Time Complexity)

  • μ‹œκ°„ λ³΅μž‘λ„ : μ•Œκ³ λ¦¬μ¦˜μ˜ μˆ˜ν–‰ μ‹œκ°„μ΄ μ–Όλ§ˆμΈμ§€λ₯Ό λ‚˜νƒ€λƒ„
    • μˆ˜ν–‰λ˜λŠ” μ—°μ‚°μ˜ 수λ₯Ό 가지고 κ³„μ‚°ν•˜λ©° μ•Œκ³ λ¦¬μ¦˜μ—μ„œ μ€‘μš”ν•˜μ§€ μ•ŠλŠ” 값듀은 μ΅œλŒ€ν•œ λ¬΄μ‹œ
    • μ•Œκ³ λ¦¬μ¦˜ μ‹€ν–‰ μ‹œκ°„μ€ μ‹€ν–‰ ν™˜κ²½μ— 따라 λ‹¬λΌμ§€λ―€λ‘œ μ‹€ν–‰ μ‹œκ°„μ΄ μ•„λ‹Œ μ—°μ‚°μ˜ μ‹€ν–‰ 횟수λ₯Ό 카운트

  • μˆ˜ν–‰λ˜λŠ” μ—°μ‚°μ΄λž€ λŒ€κ°œ μ‚°μˆ , 비ꡐ, λŒ€μž… 등을 말함
    • 연산이 많이 μ‘΄μž¬ν•˜λ”λΌλ„ ν•˜λ‚˜λ‘œ μ·¨κΈ‰ν•˜μ—¬ Big-O값을 ꡬ할 μˆ˜λ„ 있음

  • μž…λ ₯ κ°’(N)에 λ”°λΌμ„œ μ‹€μ œ μ†Œμš”λ˜λŠ” μ‹œκ°„μ΄ Big-O에 μ˜ν•œ 결과와 λ‹€λ₯Ό μˆ˜λ„ 있음
    • μ•Œκ³ λ¦¬μ¦˜μ˜ νš¨μœ¨μ„±μ€ λ°μ΄ν„°μ˜ μž…λ ₯ 값이 μ–Όλ§ˆλ‚˜ 크냐에 영ν–₯을 λ°›μœΌλ―€λ‘œ μ‚¬μ†Œν•œ 뢀뢄은 λ¬΄μ‹œ κ°€λŠ₯
    • μ΅œμ•…μ˜ 경우 μ‹œκ°„λ³΅μž‘λ„ (worst case)
    • 평균 μ‹œκ°„λ³΅μž‘λ„ (average case)

  • λ¬΄μ‹œν•˜λŠ” ν•­λͺ©

    μƒμˆ˜ν•­ λ¬΄μ‹œ 영ν–₯λ ₯ μ—†λŠ” ν•­ λ¬΄μ‹œ
    O(2N) β†’ O(N) O(NΒ² + N) β†’ O(NΒ²)
    O(NΒ² + 2) β†’ O(NΒ²) O(NΒ²) 이 κ°€μž₯ μ§€λ°°μ μ΄λ―€λ‘œ 영ν–₯λ ₯이 μ—†λŠ” λ‹€λ₯Έ 항듀은 λ¬΄μ‹œ

  • Big-Oμ—μ„œ 자주 μ‚¬μš©λ˜λŠ” λ³΅μž‘λ„

O(1) < O(log n) < O(n) < O(n log n) < O(n²) < O(2ⁿ) < O(n!) < O(nⁿ)


  • 항상 N λ³€μˆ˜ ν•˜λ‚˜λ§Œ μ‚¬μš©λ˜λŠ” 것은 μ•„λ‹˜


μ‹œκ°„λ³΅μž‘λ„μ˜ 예제

μž…λ ₯ κ°’ N에 λŒ€ν•΄ N²을 κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜κ³  각각의 μ‹œκ°„ λ³΅μž‘λ„λ₯Ό λΉ„κ΅ν•΄λ³΄μž.

  • 첫번째

    int sum1(int N){
        return N*N;
    }
    
    // 1. κ³±μ…ˆ μ—°μ‚° 1κ°œμ΄λ―€λ‘œ Big-O ν‘œκΈ°λ²• O(1) 이 됨
  • λ‘λ²ˆμ§Έ

    int sum2(int N){
        sum = 0;
    
        for (int i=1; i<=N; i++) {
            sum = sum + N;
        }    
    
        return sum;
    }
    
    // 1. λ§μ…ˆ μ—°μ‚° 1κ°œμ™€ λŒ€μž… μ—°μ‚° 1κ°œκ°€ N만큼 μ‹€ν–‰
    // 2. 2N의 μ‹œκ°„μ΄ κ±Έλ¦¬μ§€λ§Œ Big-O ν‘œκΈ°λ²•μœΌλ‘œλŠ” μƒμˆ˜ν•­μ„ λ¬΄μ‹œν•˜μ—¬ O(N) 이 됩
    // 3. sum = 0; λ˜ν•œ λŒ€μž… μ—°μ‚°μ΄μ§€λ§Œ μƒμˆ˜ κ°’ 1 μ΄λ―€λ‘œ λ¬΄μ‹œ
  • μ„Έλ²ˆμ§Έ

    int sum3(int N){
        sum = 0;
    
        for (int i=1; i<=N; i++) {
            for (int j=1; j<=N; j++) {
                sum = sum + 1;
            }
        }
    
        return sum;
    }
    
    // 1. λ§μ…ˆ μ—°μ‚°, λŒ€μž… μ—°μ‚° 이 각각 NxN번 μ‹€ν–‰
    // 2. 총 2N²의 μ‹œκ°„μ΄ κ±Έλ¦¬μ§€λ§Œ Big-O ν‘œκΈ°λ²•μœΌλ‘œλŠ” μƒμˆ˜ν•­μ„ λ¬΄μ‹œν•˜μ—¬ O(NΒ²) 이 됩
    // 3. sum = 0; λ˜ν•œ λŒ€μž… μ—°μ‚°μ΄μ§€λ§Œ μƒμˆ˜ κ°’ 1 μ΄λ―€λ‘œ λ¬΄μ‹œ


κ³΅κ°„λ³΅μž‘λ„(Space Complexity)

  • κ³΅κ°„λ³΅μž‘λ„ : μ•Œκ³ λ¦¬μ¦˜μ΄ 곡간을 μ–Όλ§ˆλ‚˜ ν•„μš”λ‘œ ν•˜λŠ”μ§€λ₯Ό λ‚˜νƒ€λƒ„
    • μ‹œκ°„λ³΅μž‘λ„ 보닀 덜 μ€‘μš”ν•˜κ²Œ μ·¨κΈ‰λ˜μ§€λ§Œ 신경을 써야 함
    • 크기가 N인 배열을 μž‘μ„±ν•˜λ©΄ 곡간 λ³΅μž‘λ„λŠ” O(N), NxN 배열을 μž‘μ„±ν•˜λ©΄ O(NΒ²) 이 됨

  • ν•¨μˆ˜μ˜ μž¬κ·€μ μΈ 호좜의 경우 μŠ€νƒ 곡간도 κ³ λ €


κ³΅κ°„λ³΅μž‘λ„ 예제

1λΆ€ν„° NκΉŒμ§€μ˜ 합을 κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž¬κ·€ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ μž‘μ„±ν•΄λ³΄μž.

  • 첫번째

    int sum(int N){
        sum = 0;
        if(N<1)
            return 0;
        return N + sum(N-1);
    }
    
    // 1. N = 5 일 경우 μŠ€νƒμ— μŒ“μ΄λŠ” μ΅œλŒ€ λ©”λͺ¨λ¦¬λŠ” sum(1) + sum(2) + … + sum(5)
    // 2. λ”°λΌμ„œ κ³΅κ°„λ³΅μž‘λ„λ‘œ λ‚˜νƒ€λ‚΄λ©΄ O(N) 이 됨
    // +. N번 ν˜ΈμΆœν–ˆλ‹€κ³  ν•΄μ„œ 곡간 λ³΅μž‘λ„κ°€ 항상 O(N)이 λ˜λŠ” 것은 μ•„λ‹˜, μ•„λž˜ 예제 확인
  • λ‘λ²ˆμ§Έ

    int mainSum(int N){
        int result = 0;
    
        for(int i=0; i<N; i++)
            result += sum(i, i+1);
    
        return result;
    }
    
    int sum(int a, int b){
        return a + b;
    }
    
    // 1. mainSum() ν•¨μˆ˜μ—μ„œ sum() λ₯Ό N번 호좜
    // 2. ν•˜μ§€λ§Œ μŠ€νƒμ— μŒ“μ΄λŠ” μ΅œλŒ€ 곡간은 mainSum() + sum(), 2 μž„
    // 3. λ”°λΌμ„œ κ³΅κ°„λ³΅μž‘λ„λ‘œ λ‚˜νƒ€λ‚΄λ©΄ O(1) 이 됨


(μ°Έμ‘°) 점근적 λΆ„μ„μ˜ 예: μ„ ν˜• μ‹œκ°„λ³΅μž‘λ„

  • μ„ ν˜• μ‹œκ°„λ³΅μž‘λ„λ₯Ό 가진닀고 λ§ν•˜κ³  O(n)이라고 ν‘œκΈ°ν•œλ‹€.

    int sum(int[] A) {
        int n = 0;
        int result = 0;
        for (int i = 0; i < A.length; i++){
            result += A[i];
            n+=1;
        }
        return result;
    }
    κ°€μž₯ 자주 μ‹€ν–‰λ˜λŠ” λ¬Έμž₯ 쀑 ν•˜λ‚˜μ΄λ©° μ‹€ν–‰ νšŸμˆ˜λŠ” 항상 nλ²ˆμ΄λ‹€.
    κ°€μž₯ 자주 μ‹€ν–‰λ˜λŠ” λ¬Έμž₯이 n번이라면 λͺ¨λ“  λ¬Έμž₯의 μ‹€ν–‰ 횟수의 합은
    n에 μ„ ν˜•μ μœΌλ‘œ λΉ„λ‘€ν•˜λ©°, λͺ¨λ“  μ—°μ‚°λ“€μ˜ μ‹€ν–‰νšŸμˆ˜μ˜ 합도 μ—­μ‹œ n에 μ„ ν˜•μ μœΌλ‘œ λΉ„λ‘€ν•œλ‹€.
    

    int search(int[] A, int target) {
        for (int i = 0; i < A.length; i++) {
            if (A[i] == target)
                return i;
        }
        return -1;
    }
    κ°€μž₯ 자주 μ‹€ν–‰λ˜λŠ” λ¬Έμž₯ 쀑 ν•˜λ‚˜μ΄λ©°, μ‹€ν–‰ νšŸμˆ˜λŠ” μ΅œμ•…μ˜ 경우 nλ²ˆμ΄λ‹€.
    μ΅œμ•…μ˜ 경우 μ‹œκ°„λ³΅μž‘λ„λŠ” O(n)이닀.
    

    boolean isDistinct(int[] A) {
        for (int i = 0; i < A.length; i++) {
            for (int j = 0; i + 1 < A.length; j++) {
                if (A[i] == A[j])
                    return false;
            }
        }
        return true;
    }
    μ΅œμ•…μ˜ 경우 배열에 μ €μž₯된 λͺ¨λ“  μ›μ†Œ μŒλ“€μ„ λΉ„κ΅ν•˜λ―€λ‘œ 비ꡐ μ—°μ‚°μ˜ νšŸμˆ˜λŠ” n(n-1)/2이닀.
    λ”°λΌμ„œ μ‹œκ°„λ³΅μž‘λ„λŠ” O(n2)이닀
    

    int binarySearch(int n, int[] data, int target) {
        int begin = 0;
        int end = n - 1;
        while (begin <= end) {
            int middle = (begin + end) / 2;
            if (data[middle] == target)
                return middle;
            else if (data[middle] < target)
                begin = middle + 1;
            else
                end = middle - 1;
        }
        return - 1;
    }
    μœ„ μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹œκ°„λ³΅μž‘λ„λŠ”?
    


자료ꡬ쑰(DataStructure)의 κ°œμš”

ν˜„μ‹€μ„ ν”„λ‘œκ·Έλž˜λ°μ μœΌλ‘œ ν‘œν˜„ν•˜λŠ” 것 / 큰 데이터λ₯Ό 효율적으둜 κ΄€λ¦¬ν•˜λŠ” 것

  • 책이 ν•œκΆŒμ΄λ©΄ μ•„λ¬΄λ ‡κ²Œ λ˜μ Έλ†”λ„ μ°ΎλŠ”λ° λ¬Έμ œκ°€ μ—†μœΌλ‚˜ 100ꢌ, 200κΆŒμ”© κ·Έ μˆ˜κ°€ λ§Žμ•„μ§€λ©΄ 정리λ₯Ό ν•˜μ§€ μ•ŠλŠ” ν•œ μ›ν•˜λŠ” 책을 μ°ΎκΈ° μ–΄λ ΅λ‹€. 정리λ₯Ό 톡해 곡간을 μ ˆμ•½ν•˜κ³  μ‹œκ°„μ„ μ ˆμ•½ν•˜λŠ” 효과λ₯Ό λˆ„λ¦°λ‹€.

μ •λ¦¬μ •λˆμ˜ 진화 : 쒅이 β†’ μ±… β†’ μ±…μž₯ β†’ λ„μ„œκ΄€ β†’ WWW(인터넷 λ˜λŠ” λ„€νŠΈμ›Œν¬)

  • μ»΄ν“¨ν„°μ—μ„œ μ€‘μš”ν•œ 것 : MEMORY, CPU, STORAGE
    • MEMORY : 가격이 λΉ„μ‹Έκ³  μš©λŸ‰μ΄ 적으며 전원을 끄면 데이터도 μ†Œμ‹€λ˜μ§€λ§Œ STORAGE 보닀 μ›”λ“±νžˆ λΉ λ₯΄κ²Œ 데이터λ₯Ό κ°€μ Έμ˜¬ 수 μžˆλ‹€.
    • STORAGE : HDD/SDD 둜 μ €μž₯μž₯μΉ˜μ΄λ‹€. 가격이 μ €λ ΄ν•˜κ³  μš©λŸ‰μ΄ 크며 전원이 꺼져도 데이터가 μ €μž₯λœλ‹€.
    • CPU : 처리 속도 차이가 λ„ˆλ¬΄ 심해 μŠ€ν† λ¦¬μ§€μ— κ³§λ°”λ‘œ μ—‘μ„ΈμŠ€ ν•˜μ§€ μ•ŠλŠ”λ‹€. 컴퓨터가 λ™μž‘ν•˜λŠ” 데 ν•„μš”ν•œ λͺ¨λ“  계산을 μ²˜λ¦¬ν•œλ‹€.

  • 처리 μˆœμ„œ
    • λ©”λͺ¨λ¦¬κ°€ μŠ€ν† λ¦¬μ§€μ—μ„œ 데이터λ₯Ό κ°€μ Έμ˜¨λ‹€.
    • CPUκ°€ λ©”λͺ¨λ¦¬μ— λ‹΄κΈ΄ 데이터λ₯Ό μ½λŠ”λ‹€.

  • μžλ£Œκ΅¬μ‘°μ— μžˆμ–΄ κ°€μž₯ μ€‘μš”ν•œ 것은 λ©”λͺ¨λ¦¬μ΄λ‹€.
    • 자료ꡬ쑰의 λ―Έμ…˜ : λ©”λͺ¨λ¦¬λ₯Ό μ–΄λ–»κ²Œ 효율적으둜 μ‚¬μš©ν•˜λŠλƒ?
    • λ©”λͺ¨λ¦¬λŠ” λΉŒλ”©κ³Ό κ°™λ‹€. μ—¬λŸ¬ λ‚΄λΆ€ μ €μž₯μ†Œμ— 데이터λ₯Ό λ„£κ³ , ν•΄λ‹Ή μ£Όμ†Œλ₯Ό 톡해 데이터λ₯Ό κ°€μ Έμ˜€λŠ” 속도가 λͺ¨λ“  μ£Όμ†Œλ“€μ΄ λ™μΌν•˜λ‹€.


자료ꡬ쑰의 μ’…λ₯˜

  • 자료 κ°„ μ—°κ²° ν˜•νƒœ / λͺ¨μ–‘에 λ”°λ₯Έ ꡬ뢄
    • μ„ ν˜• 자료ꡬ쑰 (Linear, μ „ν›„ 1:1 μ—°κ²° ν˜•νƒœ)

      - ν•œ μ›μ†Œ 뒀에 ν•˜λ‚˜μ˜ μ›μ†Œ 만이 쑴재
          > μžλ£Œλ“€μ΄ 직선 ν˜•νƒœλ‘œ λ‚˜μ—΄λ˜μ–΄ μžˆλŠ” ꡬ쑰둜 μ›μ†Œλ“€ κ°„ μˆœμ„œ κ³ λ €
          > μ „ν›„/인접/μ„ ν›„ μ›μ†Œλ“€ 간에 1:1 κ΄€κ³„λ‘œ λ‚˜μ—΄
      
      - μ„ ν˜• 자료ꡬ쑰의 예
          > κΈ°λ³Έ μ„ ν˜• 자료ꡬ쑰 : 리슀트, μ—°κ²° 리슀트, λ°°μ—΄, λ ˆμ½”λ“œ λ“±
              >> 자료의 μ‚½μž… 및 μ‚­μ œκ°€ μ–΄λŠ μœ„μΉ˜μ—μ„œλ„ 이루어짐 
          > μ œν•œ μ„ ν˜• 자료ꡬ쑰 : μŠ€νƒ, 큐, 데크(μŠ€νƒκ³Ό 큐가 ν˜Όν•©λœ ν˜•νƒœ) λ“±
              >> 자료의 μ‚½μž… 및 μ‚­μ œκ°€ 정해진 μœ„μΉ˜μ—μ„œλ§Œ 이루어짐
      
    • λΉ„μ„ ν˜• 자료ꡬ쑰 (Nonlinear, μ „ν›„ 倚:倚 μ—°κ²° ν˜•νƒœ)

      - ν•œ μ›μ†Œ 뒀에 μ—¬λŸ¬κ°œμ˜ μ›μ†Œλ“€μ΄ μ‘΄μž¬ν•  수 있음
          > 인접(μ „ν›„) μ›μ†Œλ“€ 간에 倚:倚 κ΄€κ³„λ‘œ 배치됨
          > 계측적 ꡬ쑰(Hierarchical Structure)λ₯Ό λ‚˜νƒ€λ‚΄κΈ°μ— 적절
          > κ°€κ³„λ„μƒμ—μ„œ 쑰상-μžμ† κ°„μ˜ 관계, 직μž₯ 상사-λΆ€ν•˜ κ°„μ˜ 관계, 컴퓨터 폴더 ꡬ쑰 λ“±
          
      
      - λΉ„μ„ ν˜• 자료ꡬ쑰의 예
          > 트리, κ·Έλž˜ν”„ λ“±
      

  • 자료 κ°„ 연속, μ—°κ²° ꡬ쑰에 λ”°λ₯Έ ꡬ뢄
    • 배열에 κΈ°λ°˜ν•œ 연속 방식 ꡬ쑰 (Continuation) : 리슀트 λ“±
    • 포인터 기반의 μ—°κ²° 방식 ꡬ쑰 (Link) : μ—°κ²° 리슀트 λ“±


자료ꡬ쑰의 관점

  • 데이터 및 연산을 λ‹€λ£¨λŠ” 관점
    • μžλ£Œν˜•(Data Type) : 데이터 μ€‘μ‹¬μœΌλ‘œλ§Œ κ³ λ €
      • 자료(λ³€μˆ˜)κ°€ κ°–λŠ” κ°’μ˜ μ’…λ₯˜λ₯Ό ν‘œν˜„
      • 연산은 κ·Έ μžλ£Œν˜•μ— λ§žλ„λ‘, 별도/뢀가적/λΆ€μ°¨μ μœΌλ‘œ μˆ˜ν–‰λ˜λŠ” 관점
    • 좔상 μžλ£Œν˜•(Abstract Data Type) : 데이터와 연산을 ν•¨κ»˜ κ³ λ €
      • 자료 및 연산을 λͺ¨λ‘ ν•˜λ‚˜λ‘œ λ¬Άμ–΄ ν•˜λ‚˜μ˜ λ‹¨μœ„λ‘œ ν‘œν˜„
      • 자료 μ €μž₯ 및 처리 λ³΄λ‹€λŠ” 문제 ν•΄κ²° 지ν–₯적인 μžλ£Œν˜•
        - 좔상적 자료ꡬ쑰(Abstract Data Structure) : κ΅¬ν˜„ 방법을 λͺ…μ‹œν•˜μ§€ μ•ŠμŒ
            > 리슀트
                >> μ—°κ²° 리슀트 (Linked List)
            > μŠ€νƒ (Stack)
            > 큐 (Queue)
            > 트리 (Tree)
                >> 트라이 (Trie)
            > κ·Έλž˜ν”„ (Graph)
            > λ”•μ…”λ„ˆλ¦¬ 자료ꡬ쑰 (Dictionaries)
                >> μ—°κ΄€ λ°°μ—΄ (Associative array.) Map이라고 μΉ­ν•˜κΈ°λ„ ν•œλ‹€.
                >> μ—°κ΄€ 리슀트
                >> ν•΄μ‹œ ν…Œμ΄λΈ”
        

  • λ°μ΄ν„°μ˜ ν‘œν˜„/κ΅¬ν˜„/섀계 관점
    • 사전 μ •μ˜ν˜•(ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ κΈ°λ³Έ λ‚΄μž₯ 제곡)
    • μ‚¬μš©μž μ •μ˜ν˜•(ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μ‘μš©μ— 따라 직접 κ΅¬ν˜„)


(μ°Έμ‘°) 자료ꡬ쑰의 μ‚¬μš©μ²˜

  • β˜…(ν•„μˆ˜) List : λͺ¨λ“  κ³³

  • Set : 집합, ꡐ집합 / 합집합 / 차집합 λ“±

  • β˜…(ν•„μˆ˜) Tree : 쑰직도, 디렉토리 λ“±

  • Graph : 지도 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ λ“±, μ΅œλ‹¨κ±°λ¦¬ 이동



1μ£Όμ°¨ - λ¬Έμ œν’€κΈ°(λ°°μ—΄)

  • 1번 - 코딩인터뷰

    - "쀑볡이 μ—†λŠ”κ°€"
      * > λ¬Έμžμ—΄μ΄ μ£Όμ–΄μ‘Œμ„ λ•Œ, 이 λ¬Έμžμ—΄μ— 같은 λ¬Έμžκ°€ μ€‘λ³΅λ˜μ–΄ λ“±μž₯ν•˜λŠ”μ§€ ν™•μΈν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ„ μž‘μ„±ν•˜λΌ.
      * > 자료ꡬ쑰λ₯Ό μΆ”κ°€λ‘œ μ‚¬μš©ν•˜μ§€ μ•Šκ³  ν’€ 수 μžˆλŠ” μ•Œκ³ λ¦¬μ¦˜ λ˜ν•œ κ³ λ―Όν•˜λΌ.
    
    public boolean solution1(String str)
    {
        if (str.length() > 128)
            return false;
        boolean[] char_set = new boolean[128];
        for (int i = 0; i < str.length(); i++)
        {
            int val = str.charAt(i);
            if (char_set[val])
                return false;
            char_set[val] = true;
        }
        return true;
    }
  • 2번 - 코딩인터뷰

    - "URIλ³€ν™˜"
        * λ¬Έμžμ—΄μ— λ“€μ–΄ μžˆλŠ” λͺ¨λ“  곡백을 '%20'으둜 λ°”κΏ” μ£ΌλŠ” λ©”μ„œλ“œλ₯Ό μž‘μ„±ν•˜λΌ.
        * μ΅œμ’…μ μœΌλ‘œ λͺ¨λ“  문자λ₯Ό λ‹€ 담을 수 μžˆμ„ 만큼 μΆ©λΆ„ν•œ 곡간이 이미 ν™•λ³΄λ˜μ–΄ μžˆλ‹€.
        * λ¬Έμžμ—΄μ˜ μ΅œμ’… 길이가 ν•¨κ»˜ 주어진닀고 가정해도 λœλ‹€.
        * (μžλ°”λ‘œ κ΅¬ν˜„ν•œλ‹€λ©΄ λ°°μ—΄ μ•ˆμ—μ„œ μž‘μ—…ν•  수 μžˆλ„λ‘ 문자 λ°°μ—΄(character array)λ₯Ό μ΄μš©ν•˜κΈΈ λ°”λž€λ‹€)
    
    public char[] solution2(String str, int trueLength)
    {
        int spaceCount = 0, index, i = 0;
        char[] cstr = str.toCharArray();
        
        for (i = 0; i < trueLength; i++)
        {
            if (cstr[i] == ' ')
                spaceCount++;
        }
        
        index = trueLength + spaceCount * 2;
        char[] array = Arrays.copyOf(cstr, index);
        
        if (trueLength < cstr.length)
            array[trueLength] = '\0'; // λ°°μ—΄μ˜ 끝
            
        for (i = trueLength - 1; i >= 0; i--)
        {
            if (array[i] == ' ')
            {
                array[index - 1] = '0';
                array[index - 2] = '2';
                array[index - 3] = '%';
                index = index - 3;
            }
            else
            {
                array[index - 1] = array[i];
                index--;
            }
        }
        
        return array;
    }
  • 3번 - ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

    λ°°μ—΄ array의 i번째 μˆ«μžλΆ€ν„° j번째 μˆ«μžκΉŒμ§€ 자λ₯΄κ³  μ •λ ¬ν–ˆμ„ λ•Œ, kλ²ˆμ§Έμ— μžˆλŠ” 수λ₯Ό κ΅¬ν•˜λ € ν•©λ‹ˆλ‹€.
    
    예λ₯Ό λ“€μ–΄ arrayκ°€ [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면
    array의 2λ²ˆμ§ΈλΆ€ν„° 5λ²ˆμ§ΈκΉŒμ§€ 자λ₯΄λ©΄ [5, 2, 6, 3]μž…λ‹ˆλ‹€.
    1μ—μ„œ λ‚˜μ˜¨ 배열을 μ •λ ¬ν•˜λ©΄ [2, 3, 5, 6]μž…λ‹ˆλ‹€.
    2μ—μ„œ λ‚˜μ˜¨ λ°°μ—΄μ˜ 3번째 μˆ«μžλŠ” 5μž…λ‹ˆλ‹€.
    
    λ°°μ—΄ array, [i, j, k]λ₯Ό μ›μ†Œλ‘œ 가진 2차원 λ°°μ—΄ commandsκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, commands의 λͺ¨λ“  μ›μ†Œμ— λŒ€ν•΄
    μ•žμ„œ μ„€λͺ…ν•œ 연산을 μ μš©ν–ˆμ„ λ•Œ λ‚˜μ˜¨ κ²°κ³Όλ₯Ό 배열에 λ‹΄μ•„ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μž‘μ„±ν•΄μ£Όμ„Έμš”.
    
    [μ œν•œμ‚¬ν•­]
    array의 κΈΈμ΄λŠ” 1 이상 100 μ΄ν•˜μž…λ‹ˆλ‹€.
    array의 각 μ›μ†ŒλŠ” 1 이상 100 μ΄ν•˜μž…λ‹ˆλ‹€.
    commands의 κΈΈμ΄λŠ” 1 이상 50 μ΄ν•˜μž…λ‹ˆλ‹€.
    commands의 각 μ›μ†ŒλŠ” 길이가 3μž…λ‹ˆλ‹€.
    
    public int[] solution3(int[] array, int[][] commands)
    {
        int[] answer = new int[commands.length];
    
        List<Integer> list = new ArrayList<>();
    
        for(int i = 0 ; i < commands.length; i++){
            System.out.println("μ‹œμž‘");
            for(int j = commands[i][0]; j <= commands[i][1]; j++){
                if(commands[i][0] == commands[i][1]){
                    list.add(array[j-1]);
                    break;
                }
                list.add(array[j-1]);
            }
    
            Collections.sort(list);
            answer[i] = list.get((commands[i][2])-1);
            list.clear();
        }
        
        return answer;
    }
  • 4번 - λ°±μ€€μ•Œκ³ λ¦¬μ¦˜

    λ™ν˜μ΄λŠ” λ‚˜λ¬΄ 쑰각을 5개 가지고 μžˆλ‹€. λ‚˜λ¬΄ μ‘°κ°μ—λŠ” 1λΆ€ν„° 5κΉŒμ§€ 숫자 쀑 ν•˜λ‚˜κ°€ μ“°μ—¬μ Έ μžˆλ‹€.
    또, λͺ¨λ“  μˆ«μžλŠ” λ‹€μ„― 쑰각 쀑 ν•˜λ‚˜μ—λ§Œ μ“°μ—¬ μžˆλ‹€.
    
    λ™ν˜μ΄λŠ” λ‚˜λ¬΄ 쑰각을 λ‹€μŒκ³Ό 같은 과정을 κ±°μ³μ„œ 1, 2, 3, 4, 5 μˆœμ„œλ‘œ λ§Œλ“€λ €κ³  ν•œλ‹€.
    
    첫 번째 쑰각의 μˆ˜κ°€ 두 번째 μˆ˜λ³΄λ‹€ 크닀면, λ‘˜μ˜ μœ„μΉ˜λ₯Ό μ„œλ‘œ λ°”κΎΌλ‹€.
    두 번째 쑰각의 μˆ˜κ°€ μ„Έ 번째 μˆ˜λ³΄λ‹€ 크닀면, λ‘˜μ˜ μœ„μΉ˜λ₯Ό μ„œλ‘œ λ°”κΎΌλ‹€.
    μ„Έ 번째 쑰각의 μˆ˜κ°€ λ„€ 번째 μˆ˜λ³΄λ‹€ 크닀면, λ‘˜μ˜ μœ„μΉ˜λ₯Ό μ„œλ‘œ λ°”κΎΌλ‹€.
    λ„€ 번째 쑰각의 μˆ˜κ°€ λ‹€μ„― 번째 μˆ˜λ³΄λ‹€ 크닀면, λ‘˜μ˜ μœ„μΉ˜λ₯Ό μ„œλ‘œ λ°”κΎΌλ‹€.
    
    λ§Œμ•½ μˆœμ„œκ°€ 1, 2, 3, 4, 5 μˆœμ„œκ°€ μ•„λ‹ˆλΌλ©΄ 1 λ‹¨κ³„λ‘œ λ‹€μ‹œ κ°„λ‹€.
    
    처음 쑰각의 μˆœμ„œκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, μœ„μΉ˜λ₯Ό λ°”κΏ€ λ•Œ λ§ˆλ‹€ 쑰각의 μˆœμ„œλ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.
    
    public void solution4(int[] n) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        // or Scanner sc = new Scanner(System.in);
        
        String[] nums;
        // or String[] nums2;
        
        nums = br.readLine().split(" ");
        // or nums2 = sc.nextLine().split(" ");
        
        for (int i = 0; i < n.length; i++)
            n[i] = Integer.parseInt(nums[i]);
        // or n[i] = Integer.parseInt(nums2[i]);
        
        int tmp = 0;
        
        for (int i = 0; i < n.length - 1; i++)
        {
            for (int j = 0; j < n.length - 1; j++)
            {
                if (n[j] > n[j + 1])
                {
                    tmp = n[j];
                    n[j] = n[j + 1];
                    n[j + 1] = tmp;
                    for (int p : n)
                        System.out.print(p + " ");
                    System.out.println();
                }
            }
        }
    }


λ’€λ‘œκ°€κΈ°