스택(Stack)/큐(Queue)/우선순위 큐(Priority Queue)/힙(Heap)
·
Algorithm/알고리즘 이론
스택(stack) 삽입과 삭제 연산이 후입선출(LIFO)로 이뤄지는 자료구조 LIFO(Last In Frist Out) 가장 마지막에 삽입된 데이터가 가장 먼저 나오는 구조 삽입과 삭제가 한쪽에서만 일어남 💡 파이썬 스택(stack) 연산 s.append(n): top 위치에 새로운 데이터(n)를 삽입 s.pop(): top 위치에 현재 있는 데이터를 삭제하고 확인 s[-1]: top 위치에 현재 있는 데이터를 단순 확인하는 연산 큐(Queue) 삽입과 삭제 연산이 선입선출(FIFO)로 이뤄지는 자료구조 FIFO(First In First Out) 가장 먼저 삽입된 데이터가 가장 먼저 나오는 구조 삽입과 삭제가 양방향에서 이뤄짐 💡 파이썬 큐(queue) 연산 s.append(n): rear 위치에 새로..
투 포인터/슬라이딩 윈도우
·
Algorithm/알고리즘 이론
투 포인터 2개의 포인터로 알고리즘의 시간 복잡도를 최적화함 [문제 006] 연속된 자연수의 합 구하기 N의 최댓값이 10,000,000으로 매우 크므로 O(nlogn)의 시간 복잡도 알고리즘을 사용하면 제한 시간을 초과하므로 O(n) 시간 복잡도 알고리즘을 사용해야 함 ⇒ 이런 경우 자주 사용하는 방법이 투 포인터 💡 투 포인터 이동 법칙 sum > N: sum = sum-start_index; start_index++; sum < N: end_index++; sum = sum+end_index; sum = N: end_index++; sum = sum+end_index; count++; start_index를 오른쪽으로 한 칸 이동하는 것은 연속된 자연수에서 왼쪽 값을 삭제하는 것 end_index를..
구간 합
·
Algorithm/알고리즘 이론
구간 합 합 배열을 이용하여 시간 복잡도를 더 줄이기 위해 사용하는 특수한 목적의 알고리즘 구간 합의 핵심 이론 구간 합 알고리즘을 활용하려면 먼저 합 배열을 구해야 함 합 배열 S 정의 S[i] = A[0] + A[1] + A[2] + … + A[i-1] + A[i] # S[i]는 A[0]부터 A[i]까지의 합 인덱스 0 1 2 3 4 5 배열 A 15 13 10 7 3 12 합 배열 S 15 28 38 45 48 60 합 배열 S를 만드는 공식 S[i] = S[i-1] + A[i] i에서 j까지 구간 합을 구하는 공식 S[j] - S[i-1] ex) A[2]부터 A[5]까지의 합 = A[0]부터 A[5]까지의 합 - A[0]부터 A[1]까지의 합 = S[5] - S[1] [문제 003] 구간 합 구하..
백준 10986 | 나머지 합[파이썬 python]
·
Algorithm/백준
10986번: 나머지 합 수 N개 A1, A2, ..., AN이 주어진다. 이때, 연속된 부분 구간의 합이 M으로 나누어 떨어지는 구간의 개수를 구하는 프로그램을 작성하시오. 즉, Ai + ... + Aj (i ≤ j) 의 합이 M으로 나누어 떨어지는 (i, j) www.acmicpc.net 코드 n, m = map(int, input().split()) # n개의 수, M으로 나누기 A = list(map(int, input().split())) # n개의 수로 이루어진 원본 배열 S = [] # 합 배열 M = [] # 합 배열 S를 M으로 나눈 나머지 answer = 0 # M으로 나눠지는 (i, j) 쌍의 개수 temp = 0 for i in A: temp += i S.append(temp) # ..
백준 11660 | DP | 구간 합 구하기 [파이썬 python]
·
Algorithm/백준
11660번: 구간 합 구하기 5 첫째 줄에 표의 크기 N과 합을 구해야 하는 횟수 M이 주어진다. (1 ≤ N ≤ 1024, 1 ≤ M ≤ 100,000) 둘째 줄부터 N개의 줄에는 표에 채워져 있는 수가 1행부터 차례대로 주어진다. 다음 M개의 줄에는 네 www.acmicpc.net 코드 import sys input = sys.stdin.readline n, m = map(int, input().split()) # 표의 크기, 합을 구해야 하는 횟수 A = [] # NxN 리스트 for _ in range(n): A.append(list(map(int, input().split()))) # 합 배열 D 구하기 D = [[0] * (n+1) for _ in range(n+1)] # DP 테이블 for..
배열과 리스트
·
Algorithm/알고리즘 이론
배열 메모리의 연속 공간에 값이 채워져 있는 형태의 자료구조 인덱스를 사용하려 값에 바로 접근 가능 새로운 값을 삽입하거나 특정 인덱스에 있는 값을 삭제하기 어려움 값을 삽입하거나 삭제하려면 해당 인덱스 주변에 있는 값을 이동시키는 과정이 필요함 배열의 크기는 선언할 때 지정할 수 있으며, 한 번 선언하면 크기를 늘리거나 줄일 수 없음 구조가 간단하므로 코딩 테스트에서 많이 사용함 리스트 값과 포인터를 묶은 노드라는 것을 포인터로 연결한 자료구조 인덱스가 없으므로 값에 접근하려면 Head 포인터부터 순서대로 접근해야 함 즉, 값에 접근하는 속도가 느림 포인터로 연결되어 있으므로 데이터를 삽입하거나 삭제하는 연산 속도가 빠름 선언할 때 크기를 별도로 지정하지 않아도 됨 즉, 리스트의 크기는 정해져 있지 않..