목록Algorithm (151)
자이의 프로그래밍
1의 자리의 숫자이면 그 숫자만큼, 10의 자리의 숫자이면 9+2*(해당숫자-9) 만큼, 100의 자리의 숫자이면 1*9*1+2*9*10+3*(해당숫자-99)인 원리를 이용해서 풀었다 #include #include #include #include #include using namespace std; int main() { int num; cin >> num; int temp = num; int cnt = 0; while (temp > 0) { cnt++; temp = temp / 10; } int total = 0; int minimum = 0; int stand = 9; for (int k = 1; k
dp과정으로 왼쪽과 위쪽에 있는 블럭 중 큰것에 본인의 블럭을 더해서 갱신해주는 식으로 계산해주었습니다. #include #include #include #include #include using namespace std; int arr[1010][1010]; int countmax[1010][1010]; int main() { int r, c; cin >> r >> c; for (int i = 0; i > arr[i][j]; } } for (int i = 0; i < r; i++) { for (int j = 0; j < c; j++) { if (i == 0 && j == 0) countmax[i][j] = arr[i][..
BFS로 해결했습니다. 범위를 벗어나지 않게 체크해주면서 다 확인해주었습니다. #include #include #include #include #include #include using namespace std; int before[10100]; char checked[10100]; int main(){ int n; cin >> n; for (int i = 0; i > m >> o; memset(checked, 'a', sizeof(checked)); memset(before, 0, sizeof(before)); queue q; q.push(m); checked[m] = 'b'; while (!q.empty()) { int x = q.front(); q.p..
BFS 로 풀었고 직전에 방문한 칸과 횟수를 저장하는 배열 두 개를 사용해서 문제를 해결했습니다. #include #include #include #include #include using namespace std; int times[100100]; int visited[1001000]; int main(){ int n, m; cin >> n >> m; queue q; times[n] = 1; q.push(n); while (!q.empty()) { int x = q.front(); q.pop(); if (x == m) break; if (x - 1 >= 0 && times[x - 1] == 0) { q.push(x - 1); times[x - 1] = times[x] + 1; visited[x - 1]..
기본값은 100에서 + 혹은 -만 눌러서 나올 수 있는 길이로 정했습니다. 그 후에 0부터 10000전까지 확인하면서 제일 최소의 횟수를 갱신해주었습니다. #include #include using namespace std; bool broken[15]; int possible(int c){ if(c==0){ if(broken[c])return 0; else return 1; } else{ int len=0; while(c>0){ if(broken[c%10])return 0; c/=10; len+=1; } return len; } } int main(){ int ans; cin>>ans; int error; cin>>error; for(int i=0; i>a; broken[a]=true; } int n=..
처음에 m과 x가 같은 경우, n과 y가 같은 경우를 생각을 못해서 제대로 답이 나오질 않았다! 해당 숫자를 x를 기준으로 하여 x가 m보다 작다면 나눴을 때 나머지가 무조건 x이므로 기본 시작 숫자를 x로 잡았다. 같은 경우에는 나머지가 0이므로 기본 시작 숫자는 0이 된다. 그리고 m만큼씩 늘려가면 해당 숫자는 무조건 m으로 나눴을 때 나머지가 기본 시작 숫자(0 또는 x)가 된다. 따라서 나눴을 때 나머지가 y의 기본 숫자가 되는지만 탐색해주었다. #include #include using namespace std; int ch[40010]; int main(){ int tc; cin>>tc; for(int T=1; T>m>>n>>x>>y; int xnum, ynum; if(m==x) xnum=0;..
주변 8칸에 지뢰가 없는 것들을 큐에 넣어서 먼저 터트렸고 그 이후에도 남아있는 것들은 그냥 갯수를 세어가면서 풀었다. #include #include #include #include #include #include using namespace std; char arr[310][310]; int ch[310][310]; int dx[] = { 1, 0, -1, 0, 1, 1, -1, -1 }; int dy[] = { 0, 1, 0, -1, 1, -1, 1, -1 }; int main() { int tc; cin >> tc; for (int T = 1; T > n; for (int i = 0; i > arr[i][j]; }..
문제에서 요구하는대로 풀진 않았고 0->1로 바뀌는 횟수만큼? 예를 들어 0011이면 00->1로 바뀌는 순간 그 뒷부분에 대해 뒤집어야 하므로 그 부분을 else if 문에 넣었고 처음 수가 1인 경우에도 뒤집기? 를 진행해줘야 하기 때문에 문자열 끝까지 보면서 다음과 같이 풀었다. #include #include #include #include #include #include using namespace std; char s[60]; int main() { int tc; cin >> tc; for (int T = 1; T > s; int cnt = 0; char before = '-1'; for (int i = 0; i