오늘은 코포가 터져버리는 바람에 앳코더에서 연습을 했다.
총 6문제 중 A,B,C,D를 풀었고, E,F를 못풀어 아쉬움이 많지만, 그래도 내 실력을 최대한 발휘했다.
A번
그냥 문자열 안에 다른 문자가 있는지 묻는 문제이다.
쉽게 O(n)으로 풀 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <bits/stdc++.h> #define MEM 1000 #define sanic ios_base::sync_with_stdio(0) using namespace std; int t,n; string s; int main() { sanic; cin >> s; for(int i=0; i<s.size(); i++) if(s[i]=='A') n++; if(!n || n==s.size()) cout << "No"; else cout << "Yes"; } | cs |
B번
빨간 공, 파란공이 무한히 있는데, 파란공 n개, 빨간공 m개로 배열할 것이다. t번째 공까지 포함해서 처음부터 t번째 공까지의 파란 공의 개수를 구하라는 문제이다.
t가 10^18이니 O(n)으로도 벅찰 것이다.
우리는 항상 파란 공, 빨간 공이 규칙적으로 놓인다는 것을 안다.
파란공 n개, 빨간공 m개가 놓일 때 한 주기가 반복된다고 가정하자.
한 주기당 파란 공은 n개씩 놓인다. 그렇다면 t보다 작은 정수 중 (n+m)으로 나누어지는 최대의 수를 tM이라고 할때, 해는 이렇다.
tM/(n+m) + (t%(n+m)>n ? n:t%(n+m))
실제 프로그램을 짤 땐 tM을 굳이 안 구해도 된다.
이유는 (정수/정수)는 나머지를 버리고 그의 정수 부분만 뽑아내기 때문이다.
1 2 3 4 5 6 7 8 9 10 11 12 | #include <bits/stdc++.h> #define MEM 1000 #define sanic ios_base::sync_with_stdio(0) using namespace std; long long t,n,m; string s; int main() { sanic; cin >> t >> n >> m; cout << t/(n+m)*n+(t%(n+m)>n ? n:t%(n+m)); } | cs |
C번
임의의 수 t가 어떤 수 a,b에 대해 [t0.08]=a와 [t0.1]=b를 만족하는 t를 찾으라는 문제이다.
t가 최대가 될수 있는 경우는 100*100=10000이기 때문에 완전탐색으로 풀 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <bits/stdc++.h> #define MEM 1000 #define sanic ios_base::sync_with_stdio(0) using namespace std; long long t,n,m; string s; int main() { sanic; cin >> n >> m; for(int i=1; i<=10000; i++){ int a=i*0.08; int b=i*0.1; if(n==a && m==b){ cout << i; return 0; } } cout << -1; } | cs |
D번
문자열을 입력받고, 각 퀴리에 따라 변형한 문자열을 출력하라는 문제이다.
deque 자료구조를 써서 구현을 하였다.
자세한 구현은 이렇다.
1번 쿼리 :
상태 변수 r을 만들어준다. 이때 r은 뒤집어져 있는가를 확인하는 역할을 한다.
r은 0,1중 하나이므로 상황에 따라 바꾸어 준다.
2번 쿼리 :
r에 따라 deque 자료구조의 앞,뒤 중 알맞은 곳에 삽입하면 된다.
출력 :
이것도 r에 따라 시작의 여부가 결정된다.
r=0 :
뒤집어져 있지 않다는 뜻. 그러므로 앞에서부터 출력.
r=1 :
뒤집어져 있다는 뜻. 그러므로 뒤에서부터 출력.
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 32 33 34 35 36 37 38 39 40 41 42 43 44 | #include <bits/stdc++.h> #define MEM 1000 #define sanic ios_base::sync_with_stdio(0) using namespace std; long long t,r; string s; deque<char> q; int main() { sanic; cin >> s; for(int i=0; i<s.size(); i++) q.push_back(s[i]); cin >> t; while(t--){ int q3; cin >> q3; if(q3==1) r = (r+1)%2; else{ int q1; char q2; cin >> q1 >> q2; if(q1==1){ if(r)q.push_back(q2); else q.push_front(q2); } else{ if(r)q.push_front(q2); else q.push_back(q2); } } } if(r) while(!q.empty()){ cout << q.back(); q.pop_back(); } else while(!q.empty()){ cout << q.front(); q.pop_front(); } } | cs |
코딩공부 같이하고 싶은 사람은 백준의 "그룹입니다" 그룹에 신청해주세요.
https://www.acmicpc.net/group/6712
_DynamicCube