반응형
누적합(Prefix Sum)과 구간합 누적합 누적합이란 나열 된 수들의 누적된 합을 뜻합니다. 즉, 이 배열의 누적합을 구하면 1 + 3 + 4 + 2 + 5 = 15가 됩니다. 누적합의 배열의 크기가 원본 배열보다 1더 큰데 이는 밑에서 설명하겠습니다. 구간합 말 그대로 나열 된 수 중에서 합을 구하고 싶은 구간의 합입니다. 만약 1번째 인덱스부터 ~ 3번째 인덱스까지의 구간합을 구한다면, 3 + 4 + 2 = 11이 됩니다. 구간합을 빠르게 구할 수 있는 공식이 있는데, 이 공식이 만들어지는 과정을 봅시다. 누적합 배열 prefixSum의 크기가 arr보다 1 더 큰 이유는 0번 인덱스 부터 n번 인덱스의 구간합을 구할 수 있게 하기 위함입니다. 이제 1번째 인덱스부터 ~ 3번째 인덱스까지의 구간합을..
이 내용을 다루기 앞서 이전에 포스팅했던 캐시에 대해 읽어보시는 것을 추천드립니다. 쿠키, 캐시, 세션 이란 ? 각 개념들과 차이점에 대해 쉽게 알아보자. 쿠키, 캐시, 세션에 대해 설명하기 전에 먼저 HTTP의 특징에 대해 짚고 넘어가야합니다. HTTP에 대한 설명은 아래 포스팅 참고하시면 좋습니다. HTTP와 HTTPS의 개념 및 차이점에 대해 알아보자. HTTP ( hstory0208.tistory.com CS면접의 단골 질문인 쿠키, 캐시, 세션에 대해 각 특징과 차이점들에 대해 설명해놓았으므로 도움이 되실 겁니다. 캐시가 사용하는 리소스의 양은 무한대가 아니라 제한적이기 때문에, 캐시는 제한된 리소스 내에서 데이터를 빠르게 저장하고 접근할 수 있어야합니다. 그래서 "캐시 교체 알고리즘"으로 어떤..
유클리드 호제법 유클리드 호제법이란, 두 개의 수가 주어졌을 때, 최대공약수를 구하는 알고리즘입니다. 최소공배수는 주어진 두 개의 수를 곱한 값을, 그 두 개의 수의 최대공약수로 나누어 구할 수 있습니다. 최대공약수 : GCD(greatest common divisor) 최소공배수 : LCM(largest common multiple) 유클리드 호제법으로 최대공약수를 구하는 원리 1980과 168의 최소공배수를 유클리드 호제법을 이용하면 다음과 같은 과정을 거치게 됩니다. 1. 1980을 168로 나눕니다. 2. 1980을 168로 나눈 나머지 132와 168을 다시 나눕니다. 3. 168을 132로 나눈 나머지 36과 132를 다시 나눕니다. 4. 나머지가 0이 될때까지 반복합니다. 5. 나머지가 0이..
문제 설명 단어 퍼즐은 주어진 단어 조각들을 이용해서 주어진 문장을 완성하는 퍼즐입니다. 이때, 주어진 각 단어 조각들은 각각 무한개씩 있다고 가정합니다. 예를 들어 주어진 단어 조각이 [“ba”, “na”, “n”, “a”]인 경우 "ba", "na", "n", "a" 단어 조각이 각각 무한개씩 있습니다. 이때, 만들어야 하는 문장이 “banana”라면 “ba”, “na”, “n”, “a”의 4개를 사용하여 문장을 완성할 수 있지만, “ba”, “na”, “na”의 3개만을 사용해도 “banana”를 완성할 수 있습니다. 사용 가능한 단어 조각들을 담고 있는 배열 strs와 완성해야 하는 문자열 t가 매개변수로 주어질 때, 주어진 문장을 완성하기 위해 사용해야 하는 단어조각 개수의 최솟값을 return..
문제 설명 N개의 스티커가 원형으로 연결되어 있습니다. 다음 그림은 N = 8인 경우의 예시입니다. 원형으로 연결된 스티커에서 몇 장의 스티커를 뜯어내어 뜯어낸 스티커에 적힌 숫자의 합이 최대가 되도록 하고 싶습니다. 단 스티커 한 장을 뜯어내면 양쪽으로 인접해있는 스티커는 찢어져서 사용할 수 없게 됩니다. 예를 들어 위 그림에서 14가 적힌 스티커를 뜯으면 인접해있는 10, 6이 적힌 스티커는 사용할 수 없습니다. 스티커에 적힌 숫자가 배열 형태로 주어질 때, 스티커를 뜯어내어 얻을 수 있는 숫자의 합의 최댓값을 return 하는 solution 함수를 완성해 주세요. 원형의 스티커 모양을 위해 배열의 첫 번째 원소와 마지막 원소가 서로 연결되어 있다고 간주합니다. 제한 사항 sticker는 원형으로 ..
동적 프로그래밍(Dynamic programming) 란? 동적 프로그래밍은 "큰 문제"를 "부분 문제"로 나누고, "부분 문제"의 정답으로 "큰 문제"의 답을 찾는 알고리즘 설계 기법입니다. 동적 프로그래밍의 대표적인 예로 피보나치 수열을 예로 들 수 있는데요, 이 점화식을 코드로 표현하면 다음과 같습니다. F[1] = 1 F[2] = 1 F[1] = F[2] F[i] = F[i-1] + F[i-2] 점화식은 재귀식이라고도 하며 위 코드를 보면 피보나치 수열은 재귀적인 관계를 가지고 있다는 것을 알 수 있습니다. DP를 적용하기 위한 2가지 조건 동적 프로그래밍을 적용시키기 위해선 다음 고같은 두 가지가 만족되어야 합니다. 부분 반복 문제(Overlapping Subproblem) 최적 부분 구조(Op..