Loading...

수열의 구간 합을 빠르게 계산하는 방법1 -접두사 합(prefix sum)-

1. 개요 연속적으로 나열된 수 n개가 있을때, 특정 구간의 모든 수를 합한 값을 구하는 문제 예를 들어 [10,20,30,40,50]이 있다고 가정해보자. 두번째 수부터 네번째 수까지의 합은 20+30+40=90이다. 이러한 구간 합 계산 문제는 매우 간단하게 인덱싱으로 구할 수 있을 것 같지만, 여러개의 테스트 케이스로 구성된 문제라면 이야기가 달라진다 T개의 테스트 케이스가 주어지고 테스트케이스 각각이 [left,right]에 존재하는 모든 수의 합을 구하라고 한다고 하자 만약 수열의 길이가 N이라고 한다면, 최악의 경우 O(NT)의 시간복잡도를 가진다 매 테스트케이스마다 길이 N의 구간합을 계산하라고 할 수 있기 때문이다. 하지만 만약 N=1000000이고 T=1000000이라고 한다면? O(NT..

2022. 10. 30. 17:17

투 포인터 알고리즘 응용문제 배우기2 -정렬된 두 리스트의 합집합-

1. 개요 이미 정렬되어 있는 2개의 리스트의 모든 원소를 합쳐서 정렬한 결과를 계산하라한다면 어떻게 해야할까 2. 알고리즘 2-1) 정렬된 리스트 A와 B를 입력받는다 2-2) 리스트 A에서 처리되지 않은 원소 중 가장 작은 원소를 i가 가리킨다 2-3) 리스트 B에서 처리되지 않은 원소 중 가장 작은 원소를 j가 가리킨다 2-4) A[i]와 B[j]중 더 작은 원소를 결과 리스트에 담는다 만약 A[i]가 더 작다면 i를 1 증가시킨다 B[j]가 더 작다면 j를 1 증가시킨다 2-5) 만약 i나 j가 가리키는 리스트의 길이를 넘어서는 경우, 남아있는 리스트의 원소를 모두 차례대로 담으면 된다 병합정렬이랑 똑같잖아? 3. 예시를 통해 이해하는 알고리즘 A = [1,3,5]이고 B=[2,4,6,8]일때, ..

2022. 9. 10. 04:05

이진 탐색 정복기2 - 이진 탐색이란..-

1. 이진 탐색(binary search) 배열 내부의 데이터가 정렬되어 있어야만 사용할 수 있는 알고리즘 데이터가 무작위일 때는 사용할 수 없지만, 이미 정렬되어 있다면 매우 빠르게 데이터를 찾을 수 있다는 특징이 있다 범위를 절반씩 좁혀가며 데이터를 탐색하는 특징이 있다 위치를 나타내는 변수 3개를 사용하는데 탐색하고자 하는 범위의 시작점, 끝점, 그리고 중간점이다. 찾으려는 데이터와 중간점 위치의 데이터를 반복적으로 비교하여 원하는 데이터를 찾는게 이진 탐색이다. 이미 10개의 정렬된 데이터에서 값이 4인 원소를 찾는 예시를 살펴보자 1) 먼저 시작점과 끝점을 확인하고 둘 사이에 중간점을 정한다 시작점은 0, 끝점은 9이고 중간점은 4.5인데 중간점이 실수면 소수점 이하를 버린다 그래서 중간점은 4..

2022. 9. 8. 03:36

이진 탐색 정복기1 -기본 이론 순차 탐색?-

리스트 내에서 데이터를 매우 빠르게 탐색하는 알고리즘에 대하여 1. 순차 탐색 가장 기본적인 탐색 방법 n개의 데이터가 있을 때, 데이터를 차례대로 하나씩 확인하여 어떠한 처리를 해준 그 자체가 바로 순차 탐색이다. 순차 탐색(sequential search)이란 리스트 안에 있는 특정한 데이터를 찾기 위해 앞에서부터 데이터를 하나씩 차례대로 확인하는 방법 정렬되지 않은 리스트에서 데이터를 찾아야할때 리스트 내에 데이터가 아무리 많아도 시간만 충분하다면 항상 원하는 원소를 찾을 수 있다 2. 순차 탐색으로 'IU'를 찾는 과정 1) 먼저 첫번째 데이터 'Daehyuck'는 찾고자 하는 문자열 'IU'와는 다르다. 따라서 다음 데이터로 이동 2) 두번째 데이터 'Taeyeon'은 찾고자 하는 'IU'와는 ..

다이나믹 프로그래밍 정복기 2 - 연습문제 1로 만들기 -

1. 문제 https://www.acmicpc.net/problem/1463 1463번: 1로 만들기 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다. www.acmicpc.net 1이상의 정수 x가 주어질때, 1) x가 3으로 나누어 떨어지면 3으로 나눈다 2) x가 2로 나누어 떨어지면 2로 나눈다 3) x에서 1을 뺀다 3가지 연산을 적절히 사용해서 1을 만들고 싶다 연산을 사용한 횟수의 최솟값을 출력한다면? 2. 나의 풀이 다이나믹 프로그래밍 연습문제니까 다이나믹 프로그래밍을 써야겠지 기본이 바텀업이고 반복문 구현이라고 배웠으니까 이에 따라보자 작은 문제부터 구해놓고, 이들을 이용해서 반복문을 구현한다면.. 1이상이니까 dp[0] = 0, 1은 연산을 안해도 1이니까 d..