본문 바로가기

골드90

[백준 1915] 가장 큰 정사각형 [C] 풀이 dp[i][j]를 기준으로, dp[i][j-1], dp[i-1][j-1], dp[i-1][j]가 모두 0이 아닌 정수일 때, 이들의 최솟값에 1을 더한 값이 dp[i][j]를 기준으로 만들어지는 정사각형의 한 변의 길이이다. 가장 큰 dp[i][j]값을 max에 담아, max의 제곱을 출력해주면 된다. 소스코드 #include int dp[1001][1001]; int min(int a, int b, int c){ if (a < b && a < c) return a; return b < c ? b : c; } int main(){ int n, m; scanf("%d %d", &n, &m); for (int i = 1; i 2021. 8. 16.
[백준 1644] 소수의 연속합 [C] 풀이 연속된 소수의 합이므로, 소수로만 이루어진 배열에서 투 포인트를 적용하면 된다. 에라토스테네스의 체로 소수가 아닌 것들을 구분하여 소수로만 이루어진 배열을 만들고, 투 포인트 방식으로 풀이했다. 소스코드 #include #include #include #define MAX 4000001 bool not_prime[MAX]; int sum_prime[MAX/10]; int main(){ int N; scanf("%d", &N); int sq = sqrt(N); for (int i = 2; i 2021. 8. 15.
[백준 1300] K번째 수 [C] 풀이 i * j로 구성된 N x N크기의 배열의 수들을 작은 오름차순으로 나열했을 때, K번째 수가 무엇인지 알아내는 문제다. N = 3, K = 7일 때, K번째 수는 다음과 같다. K 1 2 3 4 5 6 7 i*j 1 2 2 3 4 4 6 즉 임의의 수 mid에 대해 i*j 2021. 8. 14.
[백준 2234] 성곽 [C] 풀이 1과, 2의 답은 방 마다 bfs를 사용해 탐색하면 쉽게 구할 수 있다. 3의 답은 방의 각 칸에서 모든 방향으로 벽을 부셔보고 bfs를 사용해 탐색하면 되는데, 매번 방문한 장소를 초기화해주고, 벽을 뚫었다가 탐색이 끝나면 다시 막아주어야 한다. 방향의 순서는 문제에 주어진대로 bit값의 shift연산과 관련이 있으므로 서, 북, 동, 남 순서대로 탐색했다. 소스코드 #include #include #include #define MAX 50 int n, m, graph[MAX][MAX], rear; bool visited[MAX][MAX]; typedef struct{ int x, y; }Point; Point queue[MAX*MAX], d[4] = {{0,-1}, {-1,0}, {0,1}, {.. 2021. 8. 14.
[백준 4355] 서로소 [C] 풀이 "백준 11689, GCD(n, k) = 1"를 이용해 풀이했다. 시간초과는 발생하지 않으니 그냥 0을 입력받을 때까지 반복하면된다. 소스코드 #include int main(){ long long n; while (1){ scanf("%lld", &n); if (!n) break; long long euler = n; for (long long p = 2; p*p 2021. 8. 11.
[백준 11689] GCD(n, k) = 1 [C] 풀이 Euclidean algorithm을 사용해 풀이할 수 있지만, 최대 10^12의 수들에 대해 계산을 해야하므로 시간제한에 걸린다. Euler product formula을 사용해 쉽게 풀이할 수 있다. 나누어 떨어지는 소인수(p)를 찾아 Euler product formula에 적용시키면 된다. p-1 / p (= 1- 1/p)를 n에 곱해주어야 한다. p로 먼저 나눈 후 p-1을 곱해주자. for (long long p = 2; p*p 2021. 8. 11.