일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Eulerian path
- scc
- dynamic programming
- flows
- hashing
- bitmask
- Sieve_of_Eratosthenes
- POJ
- Segment Tree
- graph modeling
- Euler path
- Eulerian circuit
- Greedy
- Shortest path
- implementation
- mathematics
- DynamicProgramming
- Dag
- disjoint-set
- backtracking
- Algospot
- BOJ
- BFSDFS
- Cycle detecting
- BST
- CS Academy
- Euler circuit
- GCD
- graph
- 백준
- Today
- Total
목록분류 전체보기 (146)
그냥 하는 노트와 메모장
* Clone 생성 / forking - 저장소 사본을 생성하는 과정. * 업스트림(upstream) - SW 제품의 공식버전을 현재 저장소의 업스트림이라 부른다. * Check out - 현재 브랜치를 다른 브랜치로 교체하는 것 (작업 다운로드) * Pull원격 저장소에서 수정사항을 가져와 자동으로 로컬 저장소에 적용하는 것.중앙 저장소의 새로운 수정사항을 가져오는 fetch 기능을 수행하고 그 다음 수정사항을 추적(track)된 브랜치 사본을 병합하는 merge 기능을 수행한다. * push - 나의 브랜치를 원격 저장소에 올리는것 * Wrapper software * Commit object(커밋 객체) * Rebase * Agile 방법론 * Ticket * 추적 * Delta와 Snapshot ..
* git reset git reset git reset HEAD main.cpp 위 명령어로 해당 파일을 Unstated 상태로 변경할 수 있다. --hard 옵션 git reset --hard [branch] 이 옵션과 함께 사용하면 워킹 디렉터리 파일까지 수정되기에 조심해야 한다(워킹 디렉토리에서 해당 파일의 내용이 맨 처음으로 reset된다..). --hard 옵션만 사용한다면 git reset 명령은 Staging area 파일만 조작하기 때문에 위험하지 않다.
* git commit git commit git commit 현재 committed file, stage에 올려지지 않은 track file, Untracked file을 vim으로 보여준다. -m 옵션 git commit -m "my first commit" 실제로 commit 하는 옵션. message에는 이 commit이 무엇을 의미하는 것인지 작성한다. -a 옵션 git commit -a -m "my second commit" Tracked file들을 모두 stage 영역에 add한다. 따라서 추가적으로 add하지 않더라도 commit -a를 하면 자동적으로 올려준다. 단 새로 만든 파일은 올리지 않는다. (Untracked기 때문) --amend 옵션 git commit -m 'initial..
* git diff git diff git diff 워킹 디렉터리와 stage와 비교한다. --staged/ --cached 옵션 git diff --staged git diff --cached stage와 commit된 데이터(HEAD)를 비교한다. --staged옵션과 --cached옵션 결과는 동일하다. * git difftool git difftool vimdiff git difftool emerge GUI 비교툴을 호출한다. 보통 vimdiff 또는 emerge를 사용한다.
* git rm 실제 워킹 디렉터리에도 영향을 미친다. -f optiongit rm -f Track 중이던 파일이라면 Unstaged 상태를 Staged 상태로 변경한다. 또한 -f 옵션으로 Staged에 있던 파일이 수정되거나 변경된 후 Stage에 올라간 파일을 삭제할 수 있다. 일괄 삭제git rm log/\*.log log 디렉터리 안에 있는 .log 파일을 모두 삭제한다. 삭제할 때 별표(*) 앞에 \가 붙는 것을 명심하자.
* Codeforces Round #462 (Div. 2) A. A Compatible Pair 곱셈에 대해 가장 작게 만들기 위해 for문을 세 개로 구성해서 Brute force로 알아낼 수 있다. O(N^2 M) #include using namespace std; using ll = long long; ll min_v(ll a, ll b) { return a b ? a : b; } int main() { int n, m,i,j,k; ll ans=1e18, tmp, A[50], B[50]; cin >> n >> m; for (i = 0; i > A[i]; for (i = 0; i < m..
A. B. 걷다보니 신천역 삼 (Small)/(Large) 단순 dynamic으로 생각할 수 있다. 마지막 수에 대해서 0,1,2가 들어갈 수 있으므로 현재 k자리 수에 대해서 3*dp[k]를 처리해주면 된다. 단 int의 경우 3개를 더했을 경우 오버플로가 발생할 수 있으니 유의. #include #define MOD 1000000009 int main() { long long N,R=0; scanf("%lld", &N); if (N > 1) R = 2; while (N-- > 2) R = ((R + R) % MOD + R) % MOD; printf("%lld", R); return 0; } C. 나는 행복합니다 ~ 규칙이 있는 2차원에서 해싱을 할 수 있는지 물어보는 문제. 가로로 순서대로 적혀지기 ..
A. Eleven 주어진 길이에 대해 피보나치 수가 넘어가지 않을 때까지 'O'로 바꿔주기만 하면 된다. #include #include int main() { int N,a=1,b=1,t; char name[1001] = {}; scanf("%d", &N); memset(name, 'o', N); name[0] = 'O'; while (a + b
A. Perfect Squares sqrt 함수를 이용하여 제곱수인지 확인하고 그 중에서 최대값을 찾으면 된다. #include #include int max_v(int a, int b) { return a > b ? a : b; } int main() { int n, D,ans=-1e9; double tD; scanf("%d", &n); while(n--) { scanf("%d", &D); if (D >= 0) { tD = sqrt(D); if (tD != (int)tD) ans = max_v(ans, D); } else ans = max_v(ans, D); } printf("%d", ans); return 0; } B. Conan and Agasa play a Card Game Greedy하게 접근한..
조금 짜증나는 백트랙킹 문제였다. unsigned long long 범위를 벗어나지 않기 위해서는 곱셈과정을 직접 구현해야 한다. 그렇지 않으면 10자리 수에 대한 세제곱 수를 구할 때, 무조건 overflow가 발생한다. 기본 아이디어는 다음과 같다. 일의 자리에 대해서 생각을 해보자. 어떤 한자리 수 세제곱을 하면 숫자 k(0
A. 순서쌍의 곱의 합 단순 for 두번 O(N^2)으로는 시간초과가 나버린다. 구하는 것은 (A1*A2 + A1*A3 + ... + A1*AN) + (A2*A3 + A2*A4 + ... A2*AN) + ... + (AN-1*AN) 꼴이 된다. 규칙성을 말하자면 A1의 경우 A2부터 AN까지의 합에 곱셈을 해야하고, AK의 경우(1
A. 비밀번호 재귀 완전탐색을 구현한다. 모든 가능한 숫자에 대해서 사용했으면 1을 추가해준다. 매우 간단. #include int ans,n,m, used[10], mc[10]; void back(int p) { if (p >= n + 1) { bool f = 1; for (int i = 0; i < m && f; i++) if (!used[mc[i]]) f = 0; ans += f; return; } for (int i = 0; i < 10; i++) { used[i]++; back(p + 1); used[i]--; } } int main() { scanf("%d%d", &n, &m); for (int i = 0; i < m; i++) scanf("%d", &mc[i]); back(1); printf..
그래프 이론 + dp 문제의 다소 신기한 문제라 포스팅한다. i가 3이상인 구간에 대해서 아래의 공식이 성립한다. 아래 그림을 보자. 먼저 dp[i-1]을 설명한다. i이지만 i->k가 아닌 경우 > 0 k로 가는 경우는 없이 세는 것이다. i이고 i->k인 경우 > 마찬가지로 k의 후보는 0~i-1이므로 총 i개, k에 대해 i를 연결하고 i에 대해 k를 연결하면 나머지 i-2개에 대해 재배정이 되지 않도록 하는 방법의 수는 dp[i-2]가 된다. 따라서 i*dp[i-2]가 된다. 이 이후로 사이클 3개, 4개에 대해서 다루지 않는 이유는 이미 dp[i-1]에 포함되어 있기 때문이다. k가 i를 가리키고 있는 와중에 나머지 i-1개의 정점들 간의 재배정되지 않는 경우 안에 이 것이 포..
재밌는 문제라 포스팅하고자 한다. 연속된 숫자 1,5,10 이라고 한다면 심어야할 나무는 1보다 작은 위치 또는 10을 넘어가는 위치에 심을 순 없다. 따라서 1-5 간격과 5-10 간격이 다르기 때문에 각 구간에 나무를 심어야되는데, 그 간격을 정해보는 것에 포커싱을 맞춰보자. 1-5 간격은 4, 5-10 간격은 5다. 따라서 2도 3도 4,5 모두 간격으로 둘 수 없다. 따라서 1간격으로 나무를 심을 수 밖에 없다. 반면 1,5,11 이라고 가정해보자. 1-5 간격은 4, 5-11 간격은 6이 된다. 따라서 2간격만큼 나무를 심어줄 수 있다. 모든 구간에 대해 같은 간격으로 나눠져야하기 때문에 최대공약수를 이용해 구한다. 모든 간격에 대해 최대공약수를 구하면 그것을 나눈 값 - 1로 답을 구할 수 있..
BOJ 2479 - 경로찾기 문제를 먼처 푸는 것을 추천합니다. ====================================================== 해밍 경로에서 차이가 1인 것끼리 경로가 될 수 있다는 것은 문제에 나와있다. 즉, 그래프 상의 A,B 해밍코드가 연결되기 위해서는 A^B 결과의 1인 비트가 반드시 한 개여야 한다는 것이다. 그래프를 구성한 뒤, 해밍 코드 1번부터 시작하는 BFS를 구성하여 trace할 배열을 따로 설정하여 저장해주기만 하면 된다. 문제는 간선을 잇기 위한 작업인데, 가능한 서로다른 A,B 쌍에 대해 간선을 알아보기 위한 시간복잡도는 O(N^2 K)다. K를 없애고 일반 정수로 한다고 하더라도 (A^B 결과의 log2하는 등), O(N^2)라서 시간이 초과된..