r,f 좌표를 통해 고객이 어디에 해당하는지 분류하는 문제다.r은 현재시간 - 가장 최근 접속시간f는 유저의 접속 횟수다 맵을 이용해서 를 저장하면 문제를 풀 수있다! 근데 소스가 더럽다!처음에 틀렸는데 다음 코드를 추가하니 맞았다.cin이 느려서 그런가보다 ios::sync_with_stdio(false); cin.tie(0); 소스코드1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677#include #include #include #include #include using namespace st..
3개의 점이 직선인지 아닌지 판단하는 문제다CCW를 이용하면 쉽게 판단할 수 있다CCW를 사용해서 직선이면 0을 리턴하므로 0인지 아닌지만 확인하자! 소스코드1234567891011121314#include using namespace std;int ccw(int x1, int y1, int x2, int y2, int x3, int y3) { int ret = x1*y2 + x2*y3 + x3*y1; ret -= (y1*x2 + y2*x3 + y3*x1); return ret;} int main() { int x1, y1, x2, y2, x3, y3; cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3; if (ccw(x1, y1, x2, y2, x3, y3)==0) puts("WH..
문제 제목부터 디스크립션까지 너무 좋은 문제다 문제는 SCC의 기본문제이다dfs로 풀면 cycle때문에 풀수가없다! 문제를 푸는방법은1. SCC를 통해 cycle이 없는 그래프로 만든다2. 각각의 컴포넌트의 indegree를 계산한다3. indegree가 0인 곳에만 바이러스를 넣어야 최소이다!! 소스코드12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182#include #include #include #include #include using namespace std;int n, ..
(301,301) 까지 가면서 다 보면 된다처음에 d[300][300][600] 해서 시간까지 테이블로 잡으려다가 메모리 보고 포기했다 ㅎㅎ 시간을 잡지않아도 (0,0)에서 위,오른쪽만 움직이기 때문에시간 = x+y가 된다. 따라서 m-x+y가 현재위치에서의 사탕 수 이다 소스코드123456789101112131415161718192021222324252627#include #include #include using namespace std;int d[303][303];bool arr[303][303];int n, m; int go(int x, int y) { if (x >= 301 || y >= 301) return 0; int&ret = d[x][y]; if (ret != -1) return ret;..
Cycle이 있는지 없는지 판단하는 문제다!간단하게 Cycle찾는 함수를 구현하면 풀수있다...! 소스코드123456789101112131415161718192021222324252627282930313233343536373839#include #include #include #include using namespace std;int n, m;int cycle[111];vector Graph; bool isCycle(int x) { if (cycle[x]) { if (cycle[x] == -1) return true; return false; } cycle[x] = -1; for (int i = 0; i
트리의 전위,중위 순회 결과를 주고 후위 순회 결과를 구하는 문제다재귀를 잘 이용하면 풀 수 있다 방법은1. 전위순회에서 첫번째 노드는 루트라는것을 기억한다!2. 후위순회에서 루트기준 앞쪽 노드들은 왼쪽, 뒷쪽은 오른쪽 서브트리다3. 후위 순회를 출력하므로 왼쪽 오른쪽 순서로 함수를 호출하고 루트를 출력한다 후위순회에서 루트 위치를 찾기 위해 map을 사용했다! 소스코드12345678910111213141516171819202122232425262728293031323334#include #include #include #include using namespace std;int t, n, pre[1010], in[1010];map mp; void go(int s, int e,int x, int y) { ..
전위순회를 주고 후위순회한 결과를 출력하는 문제다트리를 직접 만들어도 되지만 그러면 귀찮다 푸는방법은 전위,후위순회를 할 때 방문하는 노드를 생각해보면된다 전위순회한 결과에서 첫번째 노드는 항상 루트다그리고 두번째 노드부터 루트보다 큰노드가 나오기 전까지는 왼쪽서브트리큰노드부터 마지막까진 오른쪽 서브트리다 그럼 범위를 쪼개가며 재귀로 타고 들어가서왼쪽 오른쪽 순서로 들어가며 루트를 출력해주면 원하는 답을 얻을 수 있다!그림을 그려서 생각해보면 쉽다! 소스코드12345678910111213141516171819202122#include #include using namespace std;int arr[10010], n; void go(int l, int r) { if (l > r) return; int r..
문제 설명이 애매하다..! 풀이는 간단하다 1. 입력받은 인용수를 배열에 넣고 정렬시킨다.2. 0~10000까지를 다 돌아보며 k를 정해준다3. k의 lower_bound부터 upper_bound까지가 확인 해 줄 범위다왜냐하면 k의 lower_bound 부터 upper_bound 이전까지는 k번 이하를 만족한다!4. 범위를 돌며 k이상 인용한게 k와 같은지 확인한다 소스코드12345678910111213141516171819202122#include #include using namespace std;int n;int arr[1010]; int main() { scanf(" %d", &n); for (int i = 0; i
1~n 까지의 수를 스택에 넣을 때 push , pop 을 이용해 주어진 배열을 만들수 있는지 알아보는게 문제다 1부터 차례로 넣으므로만약 스택이 비었거나 또는 top이 현재보는 수와 같지 않다면현재보는 수 까지 스택에 넣으면 된다 근데 만약 이 때 넣는수가 n보다 커진다면 만들수 없는 배열이 된다!!이것만 잘 처리해준다면 쉽게 풀 수 있다..! 소스코드12345678910111213141516171819202122232425262728293031323334#include #include #include #include using namespace std;int n;int arr[100010];stack st;vector ans; int main() { int it = 1; scanf(" %d", &n)..