#include #include using namespace std;int solution(string name) { int answer = 0; int len = name.size(); for (auto c : name) //다음 또는 이전 알파벳 { answer += min(c - 'A', 'Z' - c + 1); } // 기본 커서 이동 수 int move = len - 1; for (int i = 0; i 먼저 알파벳 변경 같은 경우는 간단하게 현재 알파벳에 따라 앞에서부터 바꾸는게 빠른지, 뒤에서부터 바꾸는게 빠른지 선택한다. 이제 커서 이동 수이다.기본적인 최대 커서 이동 수는 처음부터 오른쪽으로 쭉 이동하는 name...
#include #include using namespace std;const int MOD = 1000000007;long long dp[50001];int solution(int n) { if(n%2==1) return 0; //홀수는 불가 dp[0]=1; dp[2]=3; for(int i=4; i=0; j-=2) { dp[i] += dp[j]*2; } dp[i] %= MOD; } return dp[n];} 규칙을 통해 dp로 풀 수 있는 문제이다.먼저 블록 특성 상 홀수 값에 대해서는 타일을 완벽히 채우는 것이 아에 불가능하므로, 이 경우 바로 0을 리턴해준다. 이제 짝수의 경우만 체크하자..
#include #include using namespace std;long long cal(long long n){ long long result=1; for(long long i=2; i*i solution(long long begin, long long end) { vector answer; for(long long i=begin; i i의 약수 중, 자기 자신을 제외한 가장 큰 약수를 구하는 문제이다.예외처리로 첫 시작점은 0으로 해주고, 기본 값은 1이다.이후에 현재 n(begin~end) 값이 나눠진다면 우선 해당 값을 후보 값으로 지정하고, n/i 배수마다 값이 덮어씌워진 걸 생각하여, 현재 위치의 값은 현재 값의 약수만 올 수 있다는 것을 감안한 문제이다.단 배..
#include #include #include using namespace std;int visited[101];int solution(vector cards) { int answer = 0; vectorv; for(int i=0; i()); if(v.size()>=2)answer = v[0]*v[1]; return answer;} 문제가 다소 복잡해보이지만, 보이는 그대로 구현해주면 되는 문제이다.그룹을 찾아야 하므로, 현재 고른 카드가 중복이 나올때 까지 반복하여 카드를 오픈하며 그룹에 개수를 카운팅해준다.문제에 주어진 조건에 따라, 다음 오픈 카드는 현재 번호에 해당하는 카드를 오픈하며 개수를 카운팅하고 다시 방문하는 경우가 나올때까지 반복한다. 이렇게 추..
#include #include using namespace std;int solution(int n, vector> q, vector ans) { int answer = 0; for(int a=1; atmp = {a, b, c, d, e}; bool check = 1; for(int i=0; i 수의 범위가 크지 않아, 브루트포스로도 해결이 가능하다.오름차순 정렬이기에 5중 반복문을 통해 각기 다른 값을 저장하여 q의 값들과 비교가 가능하다.비교를 통해 겹치는 경우를 카운트해주고, 해당 카운트가 요구 카운트와 다르다면 패스하고 맞다면 최종 정답 카운트를 증가시킨다.
문제링크 : https://www.acmicpc.net/problem/11068#include using namespace std;const int MOD = 1000000007;bool isPanlindrome(int n){ for(int i=2; i> T; while(T--) { int N; cin >> N; if(isPanlindrome(N)) cout 입력받은 수에 대해서 2~64까지 각각의 진법으로 변환하여 계산하여 문자열에 저장하고,해당 문자열을 뒤집은 문자열과 비교해 같은가 아닌가를 체크한다. 같다면 1을 아니면 0을 출력해주면 된다.
#include #include #include #include #include using namespace std;bool visited[501][501];int dy[] = {1, -1, 0, 0};int dx[] = {0, 0, 1, -1};int N, M;void bfs(int y, int x, int& cnt, set& s, vector>& v){ queue> q; q.push({y, x}); visited[y][x] = true; cnt = 1; s.insert(x); while(!q.empty()) { auto [yy, xx] = q.front(); q.pop(); for(int i=0; i= N..
#include #include #include using namespace std;int solution(vector> targets) { int answer = 0; sort(targets.begin(), targets.end()); int i = 0; while (i 최소값을 찾기 위해 가장 많이 겹치는 구간을 찾아야 한다.따라서 우선 오름차순 정렬을 해주고, end 값을 기준으로 값을 체크할 필요가 있다. 현재 end 값을 기준으로, 다음 값의 start 값을 체크한다.만약 start가 end보다 작다면, 두 값은 겹치는 범위에 해당하므로 추가 미사일이 필요 없을 것이다.해당 start의 end 값이 직전 end 값보다 작다면 end 값을 새로 갱신하여 가장 좁은 공..
#include #include using namespace std;bool check(vectorboard, char c){ if(board[0][0] == c && board[1][1] == c && board[2][2] == c) return 1; //대각선 체크 if(board[0][2] == c && board[1][1] == c && board[2][0] == c) return 1; for(int i=0; i board) { int answer = 1; int oCnt = 0, xCnt = 0; for(auto i : board) { for(int j=0; j= 2) answer = 0; if(oWin && xWin) ans..

#include #include #include using namespace std;long long solution(int r1, int r2) { long long answer = 0; for(int i=1; i 원의 방정식을 응용한 문제다.먼저 원의 방정식은 다음과 같다. 이를 응용하여 내부 원의 반지름 r1과 외부 원의 반지름 r2를 참고하면 다음과 같은 식이 성립한다. 위 식을 토대로 계산하면 또 다음과 같음을 알 수 있다. 따라서 x축을 고정시켜놓고, 위 공식을 통해 최소 Y값, 최대 Y값을 구해주면 된다.그리고 가능한 정수 값을 찾는 것이기에 최소의 경우 올림처리를, 최대의 경우 내림처리를 해서 맞춰주어야한다.추가로 주의할 점은 x 이 경우에 이후 계산식이 무조건 음수로 s..
#include #include using namespace std;int answer = 0;int arr[13];bool check(int n){ for(int i=0; i 퀸의 경우 가로세로 또는 대각선으로 이동이 가능하다.따라서 위 3가지 방향에 대해 고려를 해야한다. 우선 행을 고정시키고, 여기서 열만 바꿔서 퀸을 배치시킬 것이다.해당 값을 토대로 행을 옮겨 놓을 예정인 값의 유효여부를 판단하고, 가능하면 이어서 dfs 탐색을 이어나간다. 행을 고정시켰기에, 행을 탐색할 필요는 없다.따라서 남은건 같은 열인지, 또는 대각선인지 체크하는 것이다.반복문을 통해 놓을 예정인 위치가 이미 값이 존재하는 지 여부를 통해 열을 체크한다.대각선의 경우 행의 차이와 열의 차이가 같은 지 계산식을 통해 대..
#include #include #include #include using namespace std;bool visited[51][51];int dy[] = {0, 0, -1, 1};int dx[] = {1, -1, 0, 0};void Lift(char target, vector& storage, int n, int m){ vector> del; memset(visited, false, sizeof(visited)); for(int i=0; i>q; q.push({i, j}); visited[i][j]=1; while(!q.empty()) { ..
문제링크 : https://www.acmicpc.net/problem/2705#include using namespace std;const int MOD = 1000000007;int dp[1001];int cal(int n){ if(n> T; memset(dp, -1, sizeof(dp)); while(T--) { cin >> N; cout 주어진 파티션에 대해 왼쪽 절반과 오른쪽 절반이 재귀적인 팰린드롬인지 체크해야한다.따라서 입력받은 n을 기준으로 절반만 체크하며 절반에 가능한 값이 있으면 대칭으로 사용이 가능하기에 가능한 가짓수를 더한다. 재귀 과정에서 시간초과 방지를 위해 이미 값이 존재하면 바로 반환해주도록 한다.그리고 기본적으로 dp[n]=1을..
문제링크 : https://www.acmicpc.net/problem/28069#include using namespace std;const int MOD = 1000000007;int main() { int N, K; cin >> N >> K; vectordp(N+1, INT_MAX); dp[0]=0; for(int i=0; i 이동 방법은 문제에 주어진 것처럼 2가지이다.(계단 한 칸 이동 or i+i/2 번째 계단으로 순간이동)따라서 해당 행동을 토대로 dp 식을 구성해준다. 먼저 dp는 최대값으로 초기화하고, 최소값을 통해 값을 갱신해나간다.이때 i+1과 i+i/2의 값이 N이 초과하지 않도록 범위를 제한해주어야 한다.둘 다 행동이 하나이므로 dp[i]+1과 비교하게 되..