Processing math: 100%
 

2588번: 곱셈

첫째 줄부터 넷째 줄까지 차례대로 (3), (4), (5), (6)에 들어갈 값을 출력한다.

www.acmicpc.net

문제

  세 자릿수 곱셈에서 (3), (4), (5), (6) 위치에 들어갈 값을 출력

 

입력

  첫째 줄에는 (1)의 위치에 들어갈 세 자리 자연수, 둘째 줄에 (2)의 위치에 들어갈 세 자리 자연수가 주어진다.

 

출력

  첫째 줄부터 넷째 줄 까지 차례대로 (3), (4), (5), (6)의 값을 출력

 

예제 입력

472
385

예제 출력

2360
3776
1416
181720

 


 

코드

1. 입력값을 문자열로 처리하는 경우

import java.util.*;

public class Main {
	public static void main(String[] args) {
		String num1, num2;
		int sum, pos;
	
		Scanner sc = new Scanner(System.in);
		
		num1 = sc.nextLine();
		num2 = sc.nextLine();
		
		for (int i = 2 ; i >= 0 ; i--) {
			sum = 0;
			pos = 1;
			for (int j = 2 ; j >= 0 ; j--) {
				sum += Character.getNumericValue(num1.charAt(j)) * Character.getNumericValue(num2.charAt(i)) * pos;
				pos *= 10;
			}
			System.out.println(sum);
		}
		System.out.println(Integer.parseInt(num1) * Integer.parseInt(num2));
		sc.close();
	}
}

처음에는 배열을 쓰지 않으면서 각 자리를 사용해야 하므로 문자열로 처리하는 게 좋다고 생각했다.

이중 for문에서 한 단계씩 계산하는 과정은 우리가 일반적으로 수학식을 계산하는 과정과 동일하다.

 

  계산과정

  1. 숫자 2개를 문자열로 받은 다음 charAt으로 한 자리씩 추출한다.
  2. getNumericValue()로 각 위치의 자리를 숫자 변환한 뒤 서로 계산한다.
  3. 2의 결과값에 가중치(pos)를 곱해서 더한다.
    pos는 10진수의 가중치 값을 곱해주는 변수이다(1의 자리, 10의 자리, 100의 자리수이므로)

 

 

 

2. 입력값을 숫자로 처리하는 경우

import java.util.*;

public class Main {
	public static void main(String[] args) {
		int num1, num2, sum;
	
		Scanner sc = new Scanner(System.in);
		
		num1 = sc.nextInt();
		num2 = sc.nextInt();
		
		System.out.println(num1 * (num2 % 10));
		System.out.println(num1 * ((num2 / 10) % 10));
		System.out.println(num1 * (num2 / 100));
		System.out.println(num1 * num2);
		
		sc.close();
	}
}

위의 코드도 문자열로 바꿀 수는 있지만 로직의 차이가 있어서 정리했다.

예를 들어 472 * 5인 경우 1번 코드는 ((2 * 5) * 1) + ((7 * 5) * 10) + ((4 * 5) * 100) = 2360이여서 for문에서 3번 연산을 하는 반면에 2번 코드에서는 472 * 5 = 2360으로 연산을 한 번에 끝내기 때문에 훨씬 효율적이다.

 

 

 

'기타 > 백준' 카테고리의 다른 글

[백준][Java, 1000] A + B  (0) 2021.09.14
 

1000번: A+B

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

www.acmicpc.net

문제

  두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

 

입력

  첫째 줄에 A와 B가 주어진다. (0 < A, B < 10)

 

출력

  첫째 줄에 A+B를 출력한다.

 

예제 입력

1 2

예제 출력

3

 


 

코드

import java.util.*;

public class Main {
	public static void main(String[] args) {
		int a, b;
		
		Scanner sc = new Scanner(System.in);
		
		a = sc.nextInt();
		b = sc.nextInt();
		
		System.out.printf("%d", a + b);
		sc.close();
	}
}

풀이는 간단하다.

 

알게 된 점

println

  • 문자열과 숫자를 처리할 경우 문자열이 나온 이후는 전부 문자열 덧셈(덧붙이기) 처리됨
    System.out.println(2 + 1 + "d" + 3 + 4);  → 3d34
  • 중간에 계산 값을 넣어주려면 괄호로 묶어주면 된다.
    System.out.println("결과는 " + (1 + 2) + "입니다.");  → 결과는 3입니다.

 

Scanner

  • Scanner로 입력값을 받는 경우 가변 인자처럼 처리된다.
    nextInt()함수만 그런 건지 모르겠는데 입력값이 안 들어오면 프로그램이 안 끝난다(대기함)
    // 테스트 코드
    // 입력값의 개수에 따라 결과가 어떻게 달라지는지 확인하면 된다.
    import java.util.*;
    
    public class Main {
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in);
    		
    		System.out.println("결과는" + (sc.nextInt() + sc.nextInt()) + "입니다");
    		sc.nextInt();
    		sc.nextInt();
    		sc.nextInt();
    		sc.nextInt();
    		System.out.println("끝");
    		sc.nextInt();
    		System.out.println("진짜끝");
    		sc.close();
    	}
    }

 

 

 

'기타 > 백준' 카테고리의 다른 글

[백준][Java, 2588] 곱셈  (1) 2021.09.17

 

 

공부했던 자료 정리하는 용도입니다.

재배포, 수정하지 마세요.

 

 

그래프(graph)

  • 객체 사이의 연결 관계를 표현할 수 있는 자료구조
  • 정점(vertex)과 간선(edge)들의 유한 집합

 

 

용어 정리

  • 정점 : 여러 가지 특성을 가질 수 있는 객체를 의미
    ex) V(G) : 그래프 G의 정점들의 집합
  • 정점의 차수(degree) : 인접 정점의 개수
    인접 정점(adjacent vertex) : 간선에 의해 직접 연결된 정점
  • 간선 : 링크(link)라고도 한다. 간선의 종류에 따라 무방향 그래프와 방향 그래프로 구분된다.
    ex) E(G) : 그래프 G의 간선들의 집합
    - 브리지(bridge) : 제거하면 정점과의 연결이 끊어지는 간선

  • 단순 경로(simple path) : 반복되는 간선이 없는 경로
  • 사이클(cycle) : 시작 정점과 종료 정점이 동일한 단순 경로

 

 

그래프의 종류

  • 무방향 그래프(undirected graph) : 간선이 양방향으로 갈 수 있는 그래프
     ex) (A, B) : 정점 A와 정점 B를 연결하는 간선.
           (A, B) == (B, A)
    무방향 그래프의 모든 정점의 차수합 == 간선 * 2 (간선이 두 개의 정점에 인접하기 때문)
  • 방향 그래프(directed graph) : 간선에 방향성이 존재하는 그래프. 간선은 한쪽 방향으로만 갈 수 있다.
     ex) <A, B> : 정점 A에서 정점 B로만 갈 수 있는 간선
           <A, B> != <B, A>
    - 진입 차수(in-degree) : 외부에서 오는 간선의 개수
    - 진출 차수(out-degree) : 외부로 향하는 간선의 개수
  • 가중치 그래프(weighted graph), 네트워크(network) : 간선에 비용이나 가중치가 할당된 그래프
  • 부분 그래프(subgraph) : 어떤 그래프의 정점의 일부와 간선의 일부로 이뤄진 그래프. V(S)⊆V(G), E(S)⊆E(G)를 만족시키는 그래프이다.
  • 연결 그래프(connected graph) : 모든 정점 쌍에 대하여 항상 경로가 존재하는 무방향 그래프
       + 트리는 사이클을 가지지 않는 연결 그래프이다.
    - 비연결 그래프(unconnected graph)
  • 완전 그래프(complete graph) : 그래프에 속해있는 모든 정점이 서로 연결되어있는 그래프
    그래프 정점의 수가 n인 경우 하나의 정점은 n - 1개의 다른 정점으로 연결되므로 간선의 수는 n(n1)2이 된다.

 

 

그래프의 연산

객체 : 정점의 집합과 간선의 집합
연산 :
    create_graph() ::= 그래프 생성
    init(g) ::= 그래프 g를 초기화
    insert_vertex(g, v) ::= 그래프 g에 정점 v를 삽입
    insert_edge(g, u, v) ::= 그래프 g에 간선 (u, v)를 삽입
    delete_vertex(g, v) ::= 그래프 g의 정점 v를 삭제
    delete_edge(g, u, v) ::= 그래프 g의 간선 (u, v)를 삭제
    is_empty(g) ::= 그래프 g가 공백 상태인지 검사
    adjacent(v) ::= 정점 v에 인접한 정점들의 리스트 반환
    destroy_graph(g) ::= 그래프 g를 제거

 

 

그래프 구현 방법

  1. 인접 행렬(adjacency matrix) : 2차원 배열을 이용
    - 시간 복잡도
       * 두 정점의 간선 존재 여부 : O(1)
          ex) 정점 u와 정점 v를 연결하는 간선 : M[u][v]
       * 정점의 차수 : O(n) 인접 행렬의 행이나 열을 보면 됨
       * 모든 간선의 수 : O(n2) 인접 행렬 전체를 봐야 하기 때문
    - n개의 정점을 가지는 그래프를 표현하기 위해서는 항상 n2개의 메모리 공간이 필요
    - 간선이 많이 존재하는 밀집 그래프(dense graph)를 표현할 때는 적합하나 간선이 적은 희소 그래프(sparse graph)에는 메모리 낭비가 큼
  2. 인접 리스트(adjacency list) : 연결 리스트를 이용
    - 정점의 개수만큼 포인터 배열이 필요

 

 

그래프 탐색

  1. 깊이 우선 탐색(DFS : depth first search)
    - 구현 방법

       1) 순환 호출 이용
       2) 명시적인 스택을 사용
    - 시간 복잡도 (정점의 수가 n이고 간선의 수가 e인 그래프인 경우)
       * 인접 리스트로 표현되어 있는 경우 : O(n+e)
       * 인접 행렬로 표현되어 있는 경우 : O(n2)
  2. 너비 우선 탐색(BFS : breath first search) : 시작 정점으로부터 가까운 정점을 먼저 방문하고 멀리 떨어져 있는 정점을 나중에 방문하는 순회 방법
      - 시간 복잡도
        * 인접 리스트로 표현되어 있는 경우 : O(n+e)
        * 인접 행렬로 표현되어 있는 경우 : O(n2) 

 

 

 

 

 


신장 트리(spanning tree)

  • 그래프 내의 모든 정점을 포함하는 트리(그래프의 최소 연결 부분 그래프이다.)
  • 모든 정점들이 연결되어 있어야 한다.
  • 사이클을 포함해서는 안된다.
  • 정점이 n개일 때 (n - 1)개의 간선으로 연결된다.
  • 최소 비용 신장 트리(MST: minimum spanning tree) : 신장 트리 중에서 사용된 간선들의 가중치 합이 최소인 신장 트리

 

 

최소비용 신장 트리를 구하는 알고리즘

  결과는 두 방법 모두 동일하다. 희소 그래프를 대상으로 한 경우에는 Kruskal의 알고리즘, 밀집 그래프의 경우에는 Prim의 알고리즘이 더 효율적이다.

  1. Kruskal (간선 기반 알고리즘) : 탐욕적인 방법을 이용
    • 탐욕적인 방법(greedy method) : 매 순간 가장 좋다고 생각되는 것을 선택함으로써 최종 답에 도달하는 방식
    • 시간 복잡도 : union-find 알고리즘을 쓰면 |e|log2|e| (간선들을 정렬하는 시간에 좌우되기 때문)
    • union-find 알고리즘
      - 간선의 양끝 정점이 같은 집합에 속해있는지 검사하는 알고리즘(같은 집합이면 간선을 추가할 경우 사이클이 형성됨)
         ex) union(x, y) : 원소 x와 y가 속해있는 집합을 입력으로 받아 2개의 합집합을 만듦

               find(x) : 원소 x가 속해있는 집합을 반환
  2. Prim (정점 기반 알고리즘) : 시작 정점부터 신장 트리 집합을 단계적으로 확장해나가는 방법. 간선이 n - 1개가 될 때까지 반복하며, 앞 단계에서 만들어진 신장 트리 집합에 인접한 정점들 중에서 최저 간선으로 연결된 정점을 선택하여 트리를 확장한다.
    • 시간 복잡도 : O(n2)

 

 

최단 경로 알고리즘

   최단 경로(shortest path)  : 네트워크 안의 특정한 정점 두 개를 연결하는 경로 중에서 간선들의 가중치의 합이 최소가 되는 경로

  1. Dijkstra : 하나의 시작 정점으로부터 다른 모든 정점까지의 최단 경로를 구하는 알고리즘. 최단 경로는 경로의 길이 순으로 구해진다.
    • 시간 복잡도 : O(n2)
  2. Floyd : 그래프에 존재하는 모든 정점 사이의 최단 경로를 한 번에 모두 찾아주는 알고리즘
    • 시간 복잡도 : O(n3)

 

 

위상 정렬

  • 위상 정렬(topological sort) : 방향 그래프에 존재하는 각 정점들의 선행 순서를 위배하지 않으면서 모든 정점을 나열하는 것. 하나의 그래프에는 여러 개의 위상 순서가 존재할 수 있다.
  • 위상 순서(topological order) : 위상 정렬 과정에서 선택되는 정점의 순서

 

 

 

 

 

공부했던 자료 정리하는 용도입니다.

재배포, 수정하지 마세요.

 

 

우선순위 큐(priority queue)

  • 큐에 우선순위의 개념을 도입한 자료구조
  • 데이터들은 우선순위를 가지고 있고, 우선순위가 높은 데이터가 먼저 나가게 된다.
  • 우선순위에 따라 스택이나 큐처럼 동작하기도 한다.

 

우선순위 큐 연산

객체 : n개의 element형의 우선 순위를 가진 요소들의 모임
연산 :
    create() ::= 우선순위 큐 생성
    init(q) ::= 우선순위 큐 q를 초기화
    is_empty(q) ::= 우선순위 큐 q가 비어있는지 검사
    is_full(q) ::= 우선순위 큐 q가 포화상태인지 검사
    insert(q, x) ::= 우선순위 큐 q에 요소 x를 추가
    delete(q) ::= 우선순위 큐로부터 가장 우선순위가 높은 요소를 삭제하고 해당 요소 반환
    find(q) ::= 우선순위가 가장 높은 요소를 반환

 

 

 

우선순위 큐 구현 방법

  1. 배열을 이용
    - 정렬된 배열을 사용하는 경우
    - 정렬되지 X 배열을 사용하는 경우
  2. 연결 리스트를 이용
    - 정렬된 연결 리스트를 사용하는 경우
    - 정렬되지 않은 연결 리스트를 사용하는 경우
  3. 힙(heap)을 이용

 

 

각 구현 방법에 따른 시간 복잡도

자료 구조 삽입 연산 삭제 연산
정렬된 배열 이용 O(n) O(1)
정렬되지 않은 배열 이용 O(1) O(n)
우선순위가 높은 요소를 찾아야하기 때문 
정렬된 연결 리스트를 이용 O(n)
우선순위가 높은 요소를 찾아야 하기 때문
O(1)
정렬되지 않은 연결리스트 이용 O(1) (처음에 삽입하는 경우) O(n)
배열과 마찬가지로 우선순위가 높은 요소를 찾아야 하기 때문
힙(heap)을 이용 O(log2n) O(log2n)

 

 

 

 

 


힙(heap)

  • 완전 이진트리의 일종으로 우선순위 큐를 위하여 만들어진 자료구조이다.
  • 이진 탐색 트리와 달리 중복 값을 허용한다.
  • 부모 노드의 키 값이 자식 노드의 키 값보다 항상 큰 이진트리이다.
  • 일종의 느슨한 정렬 상태를 유지한다. (삭제 연산이 수행될 때 최대값(root)만 찾으면 되므로 전체를 정렬하지 않는다.)
  • 최대값이나 최소값을 빠르게 찾을 때 유리하다.

 

 

힙의 종류

  1. 최대 힙(max heap)
    : 부모 노드의 키 값이 자식 노드의 키 값보다 크거나 같은 완전 이진트리
  2. 최소 힙(min heap)
    : 부모 노드의 키 값이 자식 노드의 키 값보다 작거나 같은 완전 이진트리

 

 

힙 구현 방법

  1. 배열을 이용한 구현
    - 정렬된 배열 이용
    - 정렬되지 X 배열 이용
    - 구현을 쉽게 하기 위해서 인덱스 0은 사용하지 않는다.
    - 연산을 통해 노드의 인덱스를 알 수 있다.
      ##왼쪽 자식의 인덱스 = (부모의 인덱스) * 2##
      ##오른쪽 자식의 인덱스 = (부모의 인덱스) * 2 + 1##
      ##부모의 인덱스 = (자식의 인덱스) / 2##
  2. 연결 리스트 이용

 

 

힙의 시간 복잡도

  • 삽입 연산 : O(log2n)
  • 삭제 연산 : O(log2n)

 

 

힙의 연산

  • 삽입 연산
    (1) 요소를 힙의 가장 마지막 노드로 삽입
    (2) 부모 노드와 비교하여 부모 노드보다 클 경우 값 교환(부모 노드보다 작을 때까지 반복)
  • 삭제 연산
    (1) 루트 노드 삭제
    (2) 빈 루트 자리에 힙의 마지막 노드를 가져옴
    (3) 양쪽 자식 중 큰 값과 교환이 일어남(자식 노드보다 클 때까지 반복)

 

 

힙 정렬(heap sort)

  최대 힙을 이용하면 정렬을 할 수 있다. 데이터를 차례대로 최대 힙에 추가하여 힙을 생성한 뒤, 요소를 하나씩 빼서 뒤쪽부터 저장하면 오름차순이 된다. 이렇게 힙을 사용하는 정렬 알고리즘을 힙 정렬(heap sort)이라고 한다. 전체 자료를 정렬하지 않고 큰 값만 필요한 경우에도 유용하게 사용된다.

    시간 복잡도  : O(nlog2n) (전체 높이가 log2n인 완전 이진트리이기 때문)

 

 

 

힙 응용

  • LPT 알고리즘(longest processing time first) : 가장 긴 작업을 우선적으로 할당하는 것
  • 허프만 코드(Huffman codes)
    ex) 영문자 빈도수를 이용한 데이터 압축

 

 

 

'기타 > 자료구조' 카테고리의 다른 글

[자료구조] 그래프(graph)  (0) 2021.07.31
[자료구조] 트리, 이진 트리, 이진 탐색 트리  (0) 2021.06.18
[자료구조] 큐(Queue), 덱(Deque)  (0) 2021.02.02
[자료구조] 스택(Stack)  (0) 2021.01.26
순환 알고리즘  (0) 2021.01.25

 

 

공부했던 자료 정리하는 용도입니다.

재배포, 수정하지 마세요.

 

 

트리와 관련된 용어

  •  트리(tree)  : 한 개 이상의 노드로 이루어진 유한 집합.
    레벨(level) : 트리의 각 층에 번호를 매긴 것. 루트는 1이되고 한 층 내려갈수록 1씩 증가한다.
    높이(height) : 트리가 가지고 있는 최대 레벨
    forest : 트리들의 집합
  • 노드(node) : 트리의 구성 요소
  • 루트 노드(root node) : 트리에서 가장 높은 곳에 있는 노드
  • 차수(degree)
    노드의 차수 : 노드가 가지고 있는 자식 노드의 개수 (단말 노드의 차수는 0)
    트리의 차수 : 트리가 가지고 있는 노드의 차수 중에서 가장 큰 값
  • 서브 트리 : 트리의 하위 트리구조
  • 간선(edge) : 노드를 연결하는 선
  • 부모 노드(parent node) : 자식 노드가 속해있는 노드
  • 자식 노드(children node) : 부모 노드에 속한 부속 노드
  • 형제 노드(sibling node) : 같은 부모 노드를 가지는 노드
  • 조상 노드(ancestor node) : 루트 노드에서 임의의 노드까지의 경로를 이루고 있는 노드들을 의미
  • 후손 노드(descendent node)
    - 임의의 노드 하위에 연결된 모든 노드들을 의미.
    - 어떤 노드의 서브 트리에 속하는 모든 노드들은 후손 노드이다.
  • 단말 노드(terminal node, leaf node) : 자식 노드가 없는 노드
    비 단말 노드(nonterminal node) : 단말 노드의 반대
  •  결정 트리(decision tree)  : 의사 결정 구조를 표현하는 방법 중 하나

 

 

 

이진트리(binary tree)

  • 루트와 왼쪽 서브 트리, 오른쪽 서브 트리로 구성된 노드들의 유한 집합
  • 이진트리의 서브 트리들은 모두 이진트리여야 한다. (서브 트리는 공집합일 수 있다.)
  • 모든 노드가 2개의 서브 트리를 가지고 있는 트리이다. (서브 트리는 공집합일 수 있다.)
  • 최대 2개까지의 자식 노드가 존재할 수 있다 (== 모든 노드의 차수가 2 이하이다.)
  • 서브 트리 간의 순서가 존재(왼쪽 서브 트리와 오른쪽 서브 트리는 서로 구별된다.)

 

 

이진트리의 성질

  • 부모와 자식 간에는 하나의 간선만 존재
  • 노드가 n개인 이진트리의 간선 개수 : n1(부모 노드는 항상 1개이기 때문)
  • 높이가 h인 이진트리의 노드 개수 : 최소 h개 ~ 최대 2h1
  • 레벨 i에서의 노드 최대 개수 : 2i1
  • 노드가 n개인 이진트리의 높이 : 최소 log2(n+1) ~ 최대 n

 

 

이진트리의 종류

  1. 포화 이진트리 (full binary tree)
    - 트리의 각 레벨에 노드가 꽉 차있는 이진트리 (== 노드의 개수가 항상 2k1개)
    - 노드에 번호를 부여할 때는 (같은 레벨에서) 왼쪽에서 오른쪽으로 붙인다.
  2. 완전 이진트리(complete binary tree)
    : 높이가 k일 때, 레벨 1부터 k -1까지는 노드가 모두 채워져 있고 마지막 레벨에서는 왼쪽부터 오른쪽으로 노드가 순서대로 채워져 있는 이진트리(중간에 비어있으면 안 됨)
    - 포화 이진트리는 항상 완전 이진트리
    - 포화 이진트리와 노드 번호 부여 방식은 같다.
  3. 기타 이진트리

 

 

이진트리 구현

  1. 배열 표현법
    : 노드의 최대 개수인 2k1개의 공간을 할당한 뒤 노드들을 저장
    - 기억공간 낭비가 심함
  2. 포인터 이용 : 포인터를 이용해서 왼쪽 노드와 오른쪽 노드를 저장한다. 
    typedef struct TreeNode{
        int data;
        struct TreeNode *left;
        struct TreeNode *right;
    } TreeNode;​

 

 

이진트리 순회

       순회(traversal)  : 이진트리에 속한 모든 노드를 한 번씩 방문하는 것

  • 위 순회(preorder traversal) : 루트 노드를 가장 먼저 방문 (루트왼쪽 서브 트리오른쪽 서브 트리)
  • 위 순회(inorder traversal) : 루트 노드를 2번째로 방문 (왼쪽 서브 트리루트오른쪽 서브 트리)
  • 위 순회(postorder traversal) : 루트 노드를 서브 트리 방문 후에 방문 (왼쪽 서브트리오른쪽 서브트리루트)
  • 레벨 순회(level order)
    - 각 노드를 레벨 순으로 방문
    - 같은 레벨일 경우에는 좌, 우로 방문

 

 

트리 응용

  • 디렉터리 용량 계산 : 후위 순회(하위 디렉터리 용량을 알아야 현재 디렉터리 용량을 계산할 수 있음)
  • 수식 트리(expression tree) 처리 : 후위 순회

 

 

 

 

 

이진 탐색 트리(binary search tree)

  : 이진트리 기반의 탐색을 위한 자료 구조

  • 이진 탐색 트리의 정의
    - 모든 원소의 키는 유일한 키를 가진다.
    - 왼쪽 서브 트리 키들은 루트 키보다 작다.
    - 오른쪽 서브 트리의 키들은 루트의 키보다 크다.
    - 왼쪽과 오른쪽 서브 트리도 이진 탐색 트리이다.
  • 탐색과 관련된 용어
    탐색 : 레코드의 집합에서 특정 레코드를 찾아내는 작업
    테이블(table) : 레코드들의 집합
    레코드(record) : 하나 이상의 필드(field)로 구성
    주요 키(primary key) : 레코드를 구별할 수 있는 값 (중복되지 않은 고유한 값)

 

 

이진 탐색 트리의 시간 복잡도

  • 탐색, 삽입 삭제 연산의 시간 복잡도 : (트리의 높이가 h일때) O(h)
  • 노드가 n개인 이진 탐색 트리 연산
    평균적인 경우(좌우 서브 트리가 균형을 이루는 경우) 시간복잡도 : O(log2n)
    최악의 경우(한쪽으로 치우치는 경우) : 선형 탐색과 같이 O(n)
    → 최악의 경우를 방지하기 위해 트리의 높이를 log2n으로 한정시키는 방식을 사용한다... 

 

 

 

'기타 > 자료구조' 카테고리의 다른 글

[자료구조] 그래프(graph)  (0) 2021.07.31
[자료구조] 우선순위 큐(priority queue), 힙(heap)  (0) 2021.07.17
[자료구조] 큐(Queue), 덱(Deque)  (0) 2021.02.02
[자료구조] 스택(Stack)  (0) 2021.01.26
순환 알고리즘  (0) 2021.01.25

+ Recent posts