본문 바로가기

프로그래밍

(27)
동적 계획법 (DP) 과 비트 마스킹 (Bit Masking) 동적 계획법 (DP) 와 비트 마스킹 (Bit Masking) 프로그래밍 문제를 풀기 위해 비트 마스킹을 쓰실때는 비트 마스킹 자체가 일반적으로 지수 형태의 시간 복잡도와 메모리를 잡아먹기 때문에, 적은 제약조건(small constraints) 을 설정하고 쓰시는것이 좋습니다. 첫째로, 비트 마스크(Bitmask) 란 무엇인지 알아보겠습니다. 비트마스크에서 마스크(Mask) 는 뭔가를 숨긴다는 의미입니다. 비트 마스크는 어떤 무엇을 이(2)진수의 형태로 표현한 것입니다. 예를 들어보겠습니다. 어떤 집합 $A$ 는 다음과 같습니다. $A = \{1,2,3,4,5\}$. 우리는 이 집합 $A$ 를 길이가 $5$ 인 비트마스크를 이용해서 나타낼 수 있습니다. 이때 $i$ 번째 $(0\leq i \leq 4)..
[DP] sub-string 찾기 DP 연습 문제 : sub-string 찾기 문제 숫자로 이루어진 입력 문자열의 sub 문자열을 찾아 모두 더한 값을 출력하는 알고리즘을 작성하면 됩니다. 입력값인 숫자 $N$ 의 범위는 $1 \leq N \leq 2 \times 10^5$ 입니다. 더하는 값이 상당히 크기 때문에 sub 문자열의 합이 $T$ 라면, $T\ \% \ (10^9+7)$ 을 출력하면 됩니다. 예제 1 입력값 16 출력값 23 설명 숫자 16 의 sub 문자열은 16, 1, 그리고 6 이 있습니다. 모두 더하면 그 합은 23이 됩니다. 예제 2 입력값 123 출력값 164 설명 숫자 123 의 sub 문자열은 1, 2, 3, 12, 23, 123 이 있습니다. 모두 더하면 그 합은 164 가 됩니다. 문제를 이곳에서 풀어보세요..
트리보나치 숫자 (Tribonacci Number) Tribonacci Number : 트리보나치 숫자 피보나치 수열은 $F_n = F_{n-1} + F_{n-2}$ 와 같이 이전에 계산된 두개의 값을 이용해 새로운 값을 찾는 개념이죠. 트리보나치 수열은 피보나치 수열과 비슷한 개념으로 이전에 계산된 값이 두개가 아닌 세개의 값으로 새로운 값을 찾는 개념입니다. 쉽게 생각하면, 트리보나치는 피보나치의 세개짜리 버젼이라 생각하시면 됩니다. $$F_n = F_{n-1} + F_{n-2} + F_{n-3}, F_0 = F_1 = 0 \ and \ F_2 = 1$$ 트리보나치 숫자를 나열하면 다음과 같습니다. 0, 0, 1, 1, 2, 4, 7, 13, 24, 44, 81, 149, 274, 504, 927, 1705, 3136, 5768, 10609, 1951..
[DP] 집에서 값나가는 물건 훔치기 DP 연습문제 : 집에서 값나가는 물건 훔치기 흥미로운 문제입니다. DP 를 연습하시는 분에게 꼭 추천드리는 문제입니다. 문제 총 $n$ 개의 집들이 한 거리에 일렬로 있습니다. 집 안에는 각자 중요한 물건들이 있습니다. 한 도둑이 각 집에서 가장 중요한 물건들을 훔쳐서 최대의 이득을 얻으려합니다. 하지만 도둑은 전략적으로 움직이죠. 도둑은 절대로 훔친 집에서 인근한 집의 물건은 훔치지 않습니다. 왜냐면 물건이 사라진 집은 그 집의 집주인이 자기 집을 기준으로 왼쪽집과 오른쪽 집에 경고를 하기 때문에 경찰에 걸릴 수 있거든요. 도둑을 도와(?)서 물건들을 훔쳤을때 최대의 값어치가 나가게끔 해주세요. 예제: 입력값 : hval[] = {6, 7, 1, 3, 8, 2, 4} 출력값 : 19 도둑은 6, 1,..
[DP] 동물원의 닭 DP 연습문제 : 동물원의 닭 쉬운 DP 문제인데 허점을 찌르는 문제입니다. 적어도 저는 그랬네요. ㅠ 문제 동물원에 한 마리의 닭이 있습니다. 닭 한마리는 하루가 지나면 2마리의 닭을 만듭니다. 닭의 기대 수명은 6일 입니다. 동물원 관리자는 닭들을 위한 사료를 사려고 하는데 얼마만큼 사야하는지 잘 모릅니다. $n$ 일에 몇마리의 닭이 동물원에 있는지 알면 그에 적합한 사료의 양을 계산할 수 있을겁니다. 관리자를 도와주세요. (단, 처음에 한 마리 있는 닭은 $0$ 일에 태어났습니다. ) 입력값 : 첫번째 줄은 test case, 두번째 줄 부터는 날짜가 입력됩니다. 출력값 : $n$ 일 에 해당하는 살아있는 닭의 마리수 제한값 : $1
포함 배제의 원리 (Inclusion-Exclusion) 포함 배제의 원리 포함 배제의 원리는 조합, 확률, 그리고 계산에서 유용하게 쓰이는 유명한 기술입니다. $n$ 개의 집합 $A_1, A_2, \dotsc , A_n$ 들이 주어진 전체 집합 $A$ 가 있습니다. 이제 이 집합들이 가지고 있는 합집합의 원소갯수를 $S_n$ 이라 하겠습니다. 좀더 수식으로 표현하자면, $S_n = \bigg|\bigcup_{i=1}^n A_i\bigg|$ 와 같습니다. 즉, $n$ 개의 집합 $A_1, A_2, \dotsc , A_n$ 에 주어진 모든 원소들을 합집합 하여 만든 집합을 $S$ 라 한다면 그 $S$ 집합 원소들의 총 개수인 $S_n = |S|$ 를 찾는것 입니다. (집합 $A$ 에 대한 집합의 원소개수를 영어로 cardinality (카디널리티) 라고 하고 $..
[DP] 도시의 집 DP 연습 문제 : 도시의 집 문제 한 나라에 $n $개의 도시가 있다. 각 도시들은 $1, 2, 3, \dotsc n$ 의 번호가 주어진다. 또한 각 도시들은 $a[i]$개의 집이 있다. $q$ 개의 쿼리가 주어진다면, 도시 $l$ 과 도시 $r$ 사이에 얼마나 많은 집이 있는지 알려주어야 한다. 입력값 : 테스트 케이스 ,$t$ 도시의 개수 , $n$ 각 도시의 집의 개수 $a[i]$ 쿼리의 개수, $q$ 도시 $l$ 과 $r$ 제약: $1
segment tree (세그먼트 트리) 세그먼트 트리 (Segment Tree) 세그먼트 트리란 무엇일까요? 다음의 문제를 통해 알아봅시다. 문제 arr[0 ... n-1] 인 배열이 주어졌을때, $ 0 \leq l \leq r \leq n-1$ 인 $l$ 부터 $r$ 까지 배열의 원소들 합을 구하기. 특정 배열의 원소를 새로운 값 $x$ 로 바꾸기. 다시 말하면 $ 0 \leq i \leq n-1$ 인 상황에서 arr[i] = x 을 해야 합니다. 정답 가장 간단한 솔루션은 $l$ 부터 $r$ 까지 loop 를 만들어서 주어진 범위 내의 배열 원소들의 합을 계산하는 것입니다. 배열의 값을 업데이트 하기 위해서는, arr[i] = x 를 하면 됩니다. 주어진 범위의 합을 계산하는 과정은 $O(n)$ 의 시간복잡도가 걸리고, 값을 업데이트 하기..