목록Algorithm/Cases-Study (76)
자이의 프로그래밍
역순으로 정렬해주고 k번만큼 더해주었다. #include #include #include #include using namespace std; int main() { int tc; cin >> tc; for (int T = 1; T > n >> k; vector v; for (int i = 0; i > tmp; v.push_back(tmp); } sort(v.rbegin(), v.rend()); int sum = 0; for (int i = 0; i < k; i++) { sum += v[i]; } cout
숫자를 이어붙였다. 맵의 범위를 벗어나면 다시 찾게 했고 총 7자리의 수를 찾았을 때 체크해주면서 찾은 수를 하나씩 더해주었다. #include #include using namespace std; int ch[10000100]; int arr[10][10]; int total = 0; int dx[] = { 1, 0, -1, 0 }; int dy[] = { 0, 1, 0, -1 }; void checking(int x, int y, int cnt, int val) { if (cnt == 7) { if (ch[val] != 1) { ch[val] = 1; total += 1; } return; } for (int i = 0; i < 4; i++) { int nx = x + dx[i]; int ny = y..
char로 문자형으로 배열을 받은 후에, 네 면을 서치하면서 16진수를 확인하며 int형 변수에 해당 값을 변환하며 넣어주었다. 그 이후에 네 면을 확인하는 것이 끝나면 큐의 맨 마지막 수로 시작할 수 있게끔 큐의 수 -1만큼 뒤에 붙여줍니다. #include #include #include #include using namespace std; int main() { int tc; cin >> tc; for (int T = 1; T > n >> K; queue q; for (int i = 0; i > tmp; q.push(tmp); } vector v; for (int i = 0; i < n / 4; i++) { for (int j = 0; j < 4; j..
모든 경우를 다 해보았다. 각각의 열에 대한 정보를 struct Node 를 통해 저장했다. 기본적으로 채워야 하는 첫째줄의 값과 마지막줄의 값은 base라는 수에 저장해주었다. 모든 경우의 수는 i 와 j 의 반복을 통해 해주었는데, i는 흰색, j는 파란색의 갯수이다. 파란색의 갯수는 최소한 한개는 존재해야 하기 때문에 반복을 1부터 해주었다. 흰색과 파란색의 갯수가 n개의 줄-2(첫째줄, 마지막줄 제외) 보다 크다면 break를 통해 새로 경우의 수를 해주었다. 빨간색은 n-2-(i+j)로 빨간 줄의 갯수를 구했으며 매번 최솟값을 찾아주었다. #include #include #include #include using namespace std; int arr[400][400]; int status[4..
일반적인 BFS로 진행했더니, 제한시간 초과가 나와서 메모이제이션을 통해 진행했다! 동일한 숫자를 return 했을 경우 더 작은 수로 갱신해서 출력해주었다. #include #include #include #include #include using namespace std; int arr[1010][1010]; int ans[1010][1010]; int dx[] = { 0, 1, 0, -1 }; int dy[] = { 1, 0, -1, 0 }; int st = 0; int dfs(int x, int y) { if (ans[x][y] != 0) return ans[x][y]; ans[x][y] = 1; for (int i = 0; i < 4; i++) { int nx = x + dx[i]; int ny..
주석문은 맵을 확인하려고 썼었다! 8개의 방향을 dx dy 배열에 저장했다. 자기자신과 다른 숫자를 만난 이후에 자기자신을 만났을 때만 벡터에 넣은 다른 숫자들을 모두 자신의 숫자로 바꿔주었다. 마지막 맵에서 0이 존재하면서 끝나는 경우도 있다! #include #include #include #include using namespace std; int arr[60][60]; int dx[] = { 0, 1, 0, -1, 1, 1, -1, -1 }; int dy[] = { 1, 0, -1, 0, 1, -1, 1, -1 }; int main() { int tc; cin >> tc; for (int T = 1; T > n >> m; arr[n / 2][n / 2] = 2; arr[n / 2][n / 2 + ..
큐를 이용해서 풀었다! 1부터 5까지 감소하는게 한 사이클이므로 cnt라는 변수를 통해 5이상이 되면 다시 1로 바꿔주었다. 앞에 있는 수를 cnt만큼 빼주고 다시 push하는 과정을 했다. #include #include using namespace std; int main(){ for(int T=1; T>tc; queue q; for(int i=0; i>a; q.push(a); } int cnt=1; while(1){ if(cnt>5) cnt=1; int x=q.front(); q.pop(); x=x-cnt; if(x
처음에 풀때는 자리를 바꿔서 가장 큰 수만 checking 함수에 넣어주었는데, 그렇게 하니 32888 2의 경우에 32888-> 82883 -> 88823 으로 나오는 오류가 있었다! 어쩔수없이 모든 변환의 수를 구한 뒤에, 최대 변환횟수는 10회라고 되어있으므로 10회/해당 숫자열의 길이만큼만 다음 변환으로 넘겨주었다. 내림차순으로 정리해서 매번 벡터에 넣어서 변환을 진행했다. #include #include #include #include #include using namespace std; int num, change; int maxmaximum=-1; void checking(int n, int times){ if(times==change){ maxmaximum=max(maxmaximum, n)..