본문 바로가기

분류 전체보기

(89)
2024-03-03 -돌 게임 3(9657, 백준) 간단한 DP문제였다. 돌게임1과 똑같이 풀면 된다. 그냥 마지막 돌을 가져간 사람이 이김으로, 마지막 돌을 1로 두고 마지막 돌애서부터 1개 또는 3개 또는 4개 전의 돌중 하나라도 가져가면 지게 됨으로 0으로 두는 식으로 점화식을 세우면 O(N)만에 풀 수 있다. 이 문제도 수학으로 풀릴까 궁굼하다. 다음번에 돌게임 시리즈를 올려봐야겠다. >점화식> s1 >> s2; if (st.find(s1) == st.end()) st.insert(s1), mp.insert({ s1, idx++ }); if (st.find(s2) == st.end()) st.insert(s2), mp.insert({ s2, idx++ }); vec.push_back({ s1, s2 }); } for..
백준(Baekjoon)문제 풀이 - 10942 팰린드롬?(C++) 팰린드롬? 문제 https://www.acmicpc.net/problem/10942 주어진 배열의 (s, e)구간이 팰린드롬인지 판단하는 프로그램을 작성하는 문제. 입출력 형식 첫째 줄에 수열의 크기 N (1 ≤ N ≤ 2,000)이 주어진다. 둘째 줄에는 홍준이가 칠판에 적은 수 N개가 순서대로 주어진다. 칠판에 적은 수는 100,000보다 작거나 같은 자연수이다. 셋째 줄에는 홍준이가 한 질문의 개수 M (1 ≤ M ≤ 1,000,000)이 주어진다. 넷째 줄부터 M개의 줄에는 홍준이가 명우에게 한 질문 S와 E가 한 줄에 하나씩 주어진다. 총 M개의 줄에 걸쳐 홍준이의 질문에 대한 명우의 답을 입력으로 주어진 순서에 따라서 출력한다. 팰린드롬인 경우에는 1, 아닌 경우에는 0을 출력한다. 7 1 2..
2024-03-02 -돌 게임(9655, 백준) 간단한 DP문제였다. 그냥 마지막 돌을 가져간 사람이 이김으로, 마지막 돌을 1로 두고 마지막 돌애서부터 1개 또는 3개 전의 돌을 가져가면 지게 됨으로 0으로 두는 식으로 점화식을 세우면 O(N)만에 풀 수 있다. 처음에는 수학적으로 접근하다가 N범위가 적은걸 보고 그냥 DP돌렸다. 수학으로도 풀린다는 소문이있다. >점화식= 1; i--) { if (dp[i + 1] == 0) dp[i] = 1; else if (dp[i + 1] == 1) dp[i] = 0; if (i x) { ans++; s = arr[i]; } else s += arr[i]; } return ans; } int main() { long long i, j; scanf("%lld %lld", &n, &m)..
2024-03-01 -피보나치 수의 확장(1788, 백준) 간단한 DP문제였다. 피보나치수를 음수까지 확장시켜 계산하는 문제였는데, 간단히 문제에 나와있는데로 구현하면 맞는다. >점화식 0) { P_fibo[0] = 0; P_fibo[1] = 1; for (i = 2; i
2024-02-29 -벽 부수고 이동하기 3(16933, 백준) 벽부수고이동하기와 같은 로직을 사용한다. dis[i][j][k][t] = 좌표 (i, j) 까지 k번 벽을부수며 갈때 t(밤, 낮구분)시간까지 흐른 시간으로 나타내며, BFS로 그래프 전체를 탐색하며 답을 찾을 수 있다. 더보기 #include #include #include using namespace std; int n, m, k; int map[1010][1010]; int dis[1010][1010][15][5]; int dx[5] = { 0, 0, 1, -1 }; int dy[5] = { 1, -1, 0, 0 }; struct dat { int x, y, br, time; }; void BFS(int x, int y) { int i, j; queue ..
2024-02-28 -분수의 합(1735, 백준) 두 분수를 입력받아 두 분수의 합을 기약분수의 형태로 나타내는 문제이다. 우선, 두분수를 통분시킨후, 만들어진 분수의 분자, 분모를 가지고 GCD를 돌리면 되는 간단한 문제이다.(기약분수 -> 서로소 = GCD 가 1인경우) 더보기 #include int a, b; int c, d; int GCD(int x, int y) { if (y == 0) return x; else return GCD(y, x % y); } int main() { int i, j; scanf("%d %d", &a, &b); scanf("%d %d", &c, &d); int x = (a * d) + (c * b); int y = d * b; while (1) { int gc; if (x > y) gc ..
2024-02-27 -자리배정(10157, 백준) N범위가 1000임으로 그냥 구현하면 된다. 정말 힘든 구현문제라고 생각한다. x, y변수를 잡아주어, x, y를 증가, 감소시켜가며 사각형을 채운뒤 k번째 좌표값을 출력하였다. 자꾸 이상한데 수가 덮어져서 한참 디버깅했다. 미리 조건들을 써놓고 코딩하면 좋을듯 하다. 더보기 #include int map[1010][1010]; int main() { int i, j; int C, R, K; scanf("%d %d %d", &C, &R, &K); int cnt = 1; int x = 1, y = 1; int now_cnt = 0, now_dis = 1, dis = 1; if (C * R < K) { printf("0"); return 0; } while (1) { if (K..
2024-02-26 -로프(2217, Baekjoon) 간단한 그리디 문제였다. n개의 로프를 사용하여 가장 높은 무게를 들려면, 자신보다 들 수 있는 중량이 큰 로프의 수 곱하기 자신이 들 수 있는 중량의 크기가 가장 큰 로프를 고르면된다. 정렬을 이용하여 간단히 풀었다. 더보기 #include #include #include using namespace std; int n; vector vec; int main() { int i, ans = -2e9; scanf("%d", &n); for(i=0;i