#include int f(int *a) { int b = *a%4; if(b==0) b=*a; else if(b==1) b=1; else if(b==2) b=*a+1; else if(b==3) b=0; return b; } int main(void) { int n; scanf("%d",&n); while(n--) { int a, b; scanf("%d %d", &a, &b); --a; printf("%d\n", f(&b)^f(&a)); } } XOR의 성질을 이용하는 문제입니다. 1. 1부터 연속적으로 XOR을 하면 0001 0001 ... 1 0002 0003 ... 3 = 2 + 1 0003 0000 ... 0 0004 0004 ... 4 0005 0001 ... 1 0006 0007 ... 7 =..
#include #define ll long long ll U(ll a, ll b) { ll r = a%b; return (r) ? U(b, r) : b; } int main(void) { ll n, b, X=0, Y=0, sign = -1; scanf("%lld %lld",&n, &b); for(int i=0; i a = -Y/X 입니다. 여기서 계산을 용이하기 위해 부호가 양인지 음인지를 나타내는 변수 하나를 만든다음 sign = -1 을 기본으로 해줍니다 여기서 -1을 기본으로 하는 이유는 a = -Y/X 에서 -을 sign에 넣어준 것 입니다. Y / X 계산에서 X, Y 둘 다 양수이어야 계산이 용이하므로, 음수인 경우 양수로 바꾸어 줍니다. 물론 sign의 값도 변경해주어야 합니다 (양이면 음..
#include int U(int a, int b) { //유클리드 (최대공약수) int r = a%b; if(r) U(b, r); else return b; } int main(void) { int n, a, b; scanf("%d %d",&n, &a); for(int i=0; i0) { b = U(b, tmp); } else b = tmp; } printf("%d", b); } https://www.acmicpc.net/problem/17087 17087번: 숨바꼭질 6 수빈이는 동생 N명과 숨바꼭질을 하고 있다. 수빈이는 현재 점 S에 있고, 동생은 A1, A2, ..., AN에 있다. 수빈이는 걸어서 이동을 할 수 있다. 수빈이의 위치가 X일때 걷는다면 1초 후에 X+D나 X-D로 이 www.ac..
#include int main(void) { char arr[100] = {}; char str[51] = {}; scanf("%s", str); int left = 50, right = 50; //덱의 왼쪽 끝과 오른쪽 끝을 같은 곳에 위치 시켜둡니다. for(int i=0; str[i] != '\0'; i++) { if(arr[left] < str[i]) { //초기화를 0으로 했기에 처음 덱에 집어 넣을때는 덱의 오른쪽에 들어가게 됩니다. arr[right++] = str[i]; //값을 넣은 다음 right을 1 증가 시킵니다. } else arr[--left] = str[i]; //right와는 달리 left는 먼저 1 감소 시킨다음 값을 집어넣습니다. } for(int i=left; i
#include int main(void) { int t; scanf("%d", &t); while(t--) { char deq[2000] = {}; int l=1000, r=1000; int n; scanf("%d", &n); while(n--) { char c; scanf(" %c", &c); if(deq[l] < c) { //가장 왼쪽에 있는 값보다 큰 경우 deq[r++] = c; //가장 오른쪽에다가 저장 } else { deq[--l] = c; //가장 왼쪽에다가 저장 } } for(int i=l; i
#include int main(void) { int n; scanf("%d", &n); int v[n]; //ex) v[1]은 제목 1 아래의 제목 2의 개수를 의미합니다. 즉 하위제목의 개수를 저장하는 배열입니다. int ans[n]; //답 (대입을 이용하니 초기화 하지 않아도 됩니다) int stack[n][2]; //스택 (대입을 이용하니 초기화 하지 않아도 됩니다) int cnt = 0; //스택의 position indicator int before = 0; for(int i=0; i
#include int main(void) { int n; scanf("%d", &n); char s[n+1]; scanf("%s", s); if(n&1) { //홀수 인 경우, 반드시 원하는 문자열을 만들 수가 없습니다. printf("-1"); return 0; } //스택 int cnt = 0, a=0, max=0; //cnt 스택의 끝에서 다음칸을 가리킵니다, a=현재 스택에서의 걸리는 날짜, max 최대 걸리는 날짜 for(int i=0; i 원하는 문자열을 만들수 가 없음 printf("%d", max); } 풀이 : 스택 스택을 이용해서 (), )( 가 되는 경우를 스택에서 제거해 줍니다. 이 과정에서 최소 며칠이 걸리는 지를 알려면, 스택에 하나씩 요소를 넣으면서, 요소의 개수가 최대가 될..
- Total
- Today
- Yesterday
- union
- find
- Krustal
- 최소 스패닝 트리
- DFS
- C언어
- Mo.s
- C++
- 오프라인 쿼리
- 스택
- 6198번
- 정렬
- 6198
- BFS
- 플로이드
- 세그먼트 트리
- 그리디
- 누적 합
- 1835
- 1835번
- 최대공약수
- 그래프
- 덱
- DP
- 카드
- 백준
- java
- 16120번
- 트리
- 누적합
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |