코드#include #include #include #include #include using namespace std;typedef long long ll;int res;string s, n;void FASTIO() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);}int main() { FASTIO(); cin >> n; s = n; // 비교할 값 저장 while (1) { if (n.length() == 1) { string m = "0"; m += n; // 문자열 앞에 더해주어야 함 n = m; } int tmp = 0; string stmp; for (int i = 0; i 풀이문제에 있는 조건을 그대로..
C++
코드#include #include #include #include #include using namespace std;bool isfour, isthree, istwo, iscon;int a[15], b[5], four, three, two, cnum;string ca, cb;void FASTIO() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);}int main() { FASTIO(); for (int i = 0; i > ca >> cb; int num = stoi(cb); a[num]++; if (ca == "R") { b[0]++; } else if (ca == "B") { b[1]++; } else if..
코드1 (next_permutaion 사용)#include #include using namespace std;int n, a[10], res;int main() { cin >> n; for (int i = 0; i > a[i]; sort(a, a + n); do { int tmp = 0; for (int i = 0; i 코드2 (순열 구현)#include using namespace std;int n, a[10], res;void permutation(int n, int r, int depth) { if (r == depth) { int tmp = 0; for (int i = 0; i > n; for (int i = 0; i > a[i]; permutation(n, n, 0); cout 풀이n의..
코드#include #include #include #include #include using namespace std;const int INF = 987654321;int T, n, m, t, s, g, h, a, b, d, x;vector> adj[2003];vector wh, res;int distS[2003], distG[2003], distH[2003]; // s, g, h에서 각각의 최단 거리void INPUT() { cin >> n >> m >> t; cin >> s >> g >> h; for (int i = 0; i > a >> b >> d; adj[a].push_back({b, d}); adj[b].push_back({a, d}); } ..
코드#include #include #include #include #include using namespace std;int n, m,a,b, visited[103],res=987654321,resnum;vector adj[103];// bfsint bfs(int x) { fill(visited, visited + 103, 0); queue q; q.push(x); visited[x] = 1; while (!q.empty()) { int pn = q.front(); q.pop(); for (int i : adj[pn]) { if (!visited[i]) { visited[i] = visited[pn] + 1; q.push(i); } } } int tmp = 0; for (int..
코드#include using namespace std;const int INF = 987654321;int n,m,b, a[503][503], res = INF, max_h = -1, min_h = 257,oh;// 높이 0 ~ 256, 칸의 크기 500*500// 브루트포스로 풀 수 있을 듯// 땅 높이 가장 높은 거, 낮은 거 계산// 그 사이에 높이를 설정하고, 낮으면 더하고 높으면 깎기// 다 돌렸는데 블록이 음수로 나오면 적용 Xvoid go() { int tmp = min_h; // 최저점부터 탐색 while(tmp != (max_h + 1)) { int blockcnt = b; // 블록의 개수 int tmptime = 0; // 걸린 시간 for(int i = 0; i a[i..
코드#include using namespace std;int n, a[130][130], white, blue;// 길이만큼 전부 체크// 만약에 해당 부분이 색종이로 채워지지 않으면// 4등분해서 확인 (좌상 우상 좌하 우하)bool check(int x, int y, int len, int num) { for(int i = 0; i > n; for(int i = 0; i > a[i][j]; } } go(0, 0, n); cout 풀이종이는 모두 2^x의 길이를 가지고 있다. 주어지는 n도 2,4,8,16,32,64,128 중 하나이며 분할정복으로 쉽게 해결할 수 있다. go 함수를 처음 실행하면 전체 길이를 검사한다. 만약 종이 크기가 맞다면 색종이 개수를 증가시키고 종료한다. 그게 아니라면 길이..
코드#include #include #include using namespace std;typedef long long ll;ll n,dp[11][1003],res;// dp테이블은 [마지막 숫자][숫자의 길이]를 의미ll go(int len, string s) { if(len == n) return 1; // 목표 길이에 도달했으므로 1 반환 ll &ret = dp[s[len - 1] - '0'][len]; if(ret != 0) return ret; // i가 마지막 숫자보다 크거나 같은 경우 for(int i = 0; i = s[len - 1] - '0') { ret += go(len + 1, s + to_string(i)) % 10007; } } return ret % 10007;}int m..
코드#include #include #include #include using namespace std;int n;int timetable[10003], indegree[10003], result[10003];vector adj[10003];int main() { cin >> n; // 입력 처리 for (int i = 1; i > time >> count; timetable[i] = time; // 작업에 걸리는 시간 저장 for (int j = 0; j > pre_task; adj[pre_task].push_back(i); // 선행 작업 관계 설정 indegree[i]++; // 해당 작업의 선행 작업 개수 증가..
코드#include #include #include #include #include #include using namespace std;struct edge { int x, y, cnt;};const int dx[] = { 0, 0, 1, -1 };const int dy[] = { 1, -1, 0, 0 };int n, res, visited[53][53];string s;char a[53][53];int bfs() { deque dq; dq.push_back({ 0, 0, 0 }); visited[0][0] = 1; while (!dq.empty()) { int px = dq.front().x; int py = dq.front().y; int cnt = dq.front().cnt; if (px =..