문제링크 : https://www.acmicpc.net/problem/12849#include using namespace std;const int MOD = 1000000007;long long dp[8], arr[8];//정보, 전산, 신양, 진리, 학생, 형남, 환경, 미래int main() { int D; cin >> D; dp[0] = 1; // 정보과학관에서 시작 while (D--) { arr[0] = dp[1] + dp[7]; // 정보 - 전산, 미래 arr[1] = dp[0] + dp[2] + dp[7]; // 전산 - 정보, 신양, 미래 arr[2] = dp[1] + dp[3] + dp[6] + dp[7]..
문제링크 : https://www.acmicpc.net/problem/10422#include using namespace std;typedef long long ll;#define MOD 1000000007long long arr[5001];int main() { ios::sync_with_stdio(false); cin.tie(NULL); int T, N; cin >> T; arr[0]=1; //빈 문자열 for(int i=2; i> N; cout 우선 올바른 괄호 문자열은 특성상 짝수만 가능하다.그리고 구역을 2개 나눠서 생각할 필요가 있다.일단 간단하게 초기값을 알아보면 다음과 같다.N = 2()N = 4()(), (()) N = 4인 케이스를 보면,..
#include #include #include #include using namespace std;int getTime(string time){ return stoi(time.substr(0, 2)) * 60 + stoi(time.substr(3, 2));}bool cmp(vectora, vectorb){ return a[1] solution(vector> plans) { vector answer; stack>pause; sort(plans.begin(), plans.end(), cmp); for(int i=0; i=playtime) { answer.push_back(name); //과제 수행 rema..
#include #include using namespace std;int arr[4] = {10, 20, 30, 40};vectorv;int sign, price; //가입자 및 금액void dfs(vector> users, vector emoticons){ if(v.size()==emoticons.size()) //할인율 모두 결정 { int tmp_sign = 0; int tmp_price = 0; for(int i=0; i= users[i][1]) tmp_sign++; //구매 금액이 일정량 이상이면 이모티콘 가입 else tmp_price+=tmp; //아니면 매출액에 저장 } if (tm..
#include #include #include using namespace std;int solution(vector> relation) { int answer = 0; int row = relation.size(); //튜플 int col = relation[0].size(); //속성 vectorv; for(int i=1; is; for(int j=0; j 비트마스킹을 또한 조합 생성으로 풀 수 있는 문제이다.먼저 속성의 조합 경우의 수를 따져야한다.예제의 케이스를 보면 학번, 이름, 전공, 학년 4가지에 대해서의 조합이므로 2^4로 총 16가지이다.이를 비트마스킹으로 표현하면 1따라서 첫 반복문의 i는 학번, 이름, 전공, 학년의..
문제링크 : https://www.acmicpc.net/problem/1253#include using namespace std;typedef long long ll;int main() { ios::sync_with_stdio(false); cin.tie(NULL); int N, result = 0; cin >> N; vectorv(N); for(int i=0; i> v[i]; sort(v.begin(), v.end()); for(int i=0; i v[l]+v[r]) l++; else r--; } } cout 투 포인터를 활용한 문제이다.투 포인터 사용을 위해 우선 입력받은 값들을 정렬시키고 시작한다. 해당 문제에서..
#include #include #include using namespace std;int solution(vector diffs, vector times, long long limit) { int l = 1, r = *max_element(diffs.begin(), diffs.end()); int answer = 0; while(l level { int prev_time = (i > 0) ? times[i - 1] : 0; total += (prev_time + times[i]) * (diffs[i] - mid); } } if(total > lim..
#include #include #include using namespace std;long long solution(int k, int d) { long long answer = 0; for(long long x = 0; x d의 범위가 크기 때문에 단순 이중 반복문으로 풀면 시간초과가 나는 문제이다.어차피 좌표의 개수를 알기 위해서는 x나 y값중 하나만 알아도 되기에 x축을 고정시키고 나머지 가능한 y값의 개수를 구하는 방식을 사용한다. 먼저 계산식에 따라 x^2+y^2따라서 이는 y^2 우리는 양수 쪽 범위만 필요하고, 최대 값을 찾아서 간격을 나누면 현재 x에 대해 가능한 y 값들을 알 수 있게 된다.따라서 y = sqrt(d^2-x^2)의 값을 먼저 구해준다. 이렇게 구한 y ..

using namespace std;#include long long solution(int w,int h) { long long answer = 1; answer = (long long)w*h - (w+h) + gcd(w, h); return answer;} 문제의 예제 기준 그림을 보면 잘려진 패턴이 4개 반복된다.이는 예제의 W(8), H(12)의 최대공약수 값이다.따라서 각 잘려진 패턴의 가로 세로 길이 또한 W/최대공약수, H/최대공약수를 한 (2, 3)이다. 해당 (2, 3) 형태의 직사각형에서 잘려나간 정사각형을 살펴보면 (2+3)-1의 형태인 것을 알 수 있다.근데 해당 패턴이 4개 즉, W와 H의 최대공약수 만큼 반복되기에 일단 아래의 식을 얻을 수 있다...
#include #include using namespace std;int arr[3][3] = {{1, 1, 1}, {5, 1, 1}, {25, 5, 1}}; //다이아, 철, 돌int getIndex(string minerals){ if(minerals[0] == 'd') return 0; else if(minerals[0] == 'i') return 1; else return 2;}void dfs(vectorpicks, vectorminerals, int idx, int total, int& answer){ if(idx >= minerals.size() || (picks[0]==0 && picks[1]==0 && picks[2]==0)) //곡괭이 모두 사용 or 광물 모두 캠..