전체 글 299

[BOJ] 1766번: 문제집

https://www.acmicpc.net/problem/1766 위상 정렬 공부할 때 대표적으로 풀어보는 문제인 것으로 생각된다. indegree가 0인 것부터 출력해주는데 그 목록 중에 가능하면 쉬운 것부터 풀어야 하므로 우선 순위 큐를 이용해 해줘야 한다. #include #include #include #include using namespace std; void topo(int vertex, int edge) { vector ad; ad.resize(vertex); vector indegrees(vertex, 0); while (edge--) { int a, b; scanf("%d %d", &a, &b); ad[a - 1].push_back(b - 1); indegrees[b - 1]++; } ..

온라인저지 2018.07.27

[BOJ] 2504번: 괄호의 값

https://www.acmicpc.net/problem/2504 나는 이런 문제가 나올 때마다 내 코딩 실력에 너무 자괴감이 든다... 열심히 해야지... 그 간단한 temp 변수 하나를 생각 못해서 뻘짓을 하고 있었다니!!! 말 그대로 tmp는 괄호가 닫힐 때까지 임시로 값을 저장해 주는 변수다. #include #include using namespace std; char s[31]; int val, tmp = 1; stack stk; int main() { scanf("%s", s); for (int i = 0; s[i]; ++i) { switch (s[i]) { case '(': tmp *= 2; stk.push('('); break; case ')': if (stk.empty()) return..

온라인저지 2018.07.27

[BOJ] 5845번: Perimeter

https://www.acmicpc.net/problem/5845 문제: 밀집이 이어지게 주어지는데 그것의 둘레의 길이를 구하라. 안에 구멍이 생기는 것은 무시한다. 해결: dfs를 가지고 해결할 수 있는데 둘레의 길이를 구해야 하므로 오른손 법칙을 프로그램에 적용시킨다고 생각하면 된다. 그래서 밀집의 좌표에서 시작하는 게 아니라 옆에서부터 벽을 짚고 간다는 느낌으로 생각해야 한다. 그리고 핵심은 바로 set이다. 왜냐면 좌표가 10^6까지 주어지는데 10^12짜리 배열은 선언 자체를 할 수 없기 때문에 set이라는 유용한 도구를 사용해서 좌표를 가지고 놀 수 있게 된다. 내가 허튼짓을 했던 것은 구멍인지 확인하는 함수를 구현하는데 대각선 포함 8방향을 다 봐야 하는데 상하좌우만 보게 해서 문제를 계속 ..

온라인저지 2018.07.27

[BOJ] 10540번: KLOPKA

https://www.acmicpc.net/problem/10540 모기를 잡기 위해 필요한 정사각형 박스의 최소 넓이를 구하는 문제다. 그래서 모든 x, y를 돌면서 max_x - min_x와 max_y - min_y 중 더 큰 수의 제곱이 답이 된다. #include #include using namespace std; int main() { int n, MaxX = -987654321, MaxY = -987654321, MinX = 987654321, MinY = 987654321; scanf("%d", &n); for (int i = 0, a, b; i < n; ++i) { scanf("%d %d", &a, &b); MaxX = max(MaxX, a); MinX = min(MinX, a); Max..

온라인저지 2018.07.27

[BOJ] 13900번: 순서쌍의 곱의 합

https://www.acmicpc.net/problem/13900 아... 그냥 재귀 함수로 돌아도 될 텐데 문제 풀 때 이상하게 규칙 찾느라 이렇게 풀었다. 2, 3, 4면 2 * 3 + 3 * 4 + 2 * 4 -> 2(3 + 4) + 3 * 4 이렇게 묶어서 생각했더니 아래 코드가 나왔다. 16ms를 받았는데 더 짧고 빠르게 할 수 있다. #include #include using namespace std; int n; int number[100001]; long long sum = 0; long long sx = 0; int main() { scanf("%d", &n); for (int i = 0; i < n; ++i) scanf("%d", &number[i]); sort(number, numb..

온라인저지 2018.07.27

[BOJ] 11508번: 2+1 세일

https://www.acmicpc.net/problem/11508 어차피 가격 제일 낮은 건 3개 묶은 거에서 공짜이므로 미리 정렬을 시켜놓고 순차적으로 확인하자. (예전에 짠 코드라 sort를 직접 구현했다..) #include #include int price[100001]; void quickSort(int arr[], int left, int right); int main(void) { int n, sum = 0; scanf("%d", &n); for (int i = 0; i < n; ++i) scanf("%d", &price[i]); quickSort(price, 0, sizeof(price) / sizeof(price[0]) - 1); for (int i = 0; i < n; ++i) { s..

온라인저지 2018.07.27

[BOJ] 9095번: 1, 2, 3 더하기

https://www.acmicpc.net/problem/9095 dp[k]: k를 1,2,3의 합으로 나타낼 수 있는 경우의 수 dp[k] = dp[k - 1] + dp[k - 2] + dp[k - 3] k - 1에서 +1을 해서 k를 만들 수 있고 나머지 k-2,k-3도 같은 방식으로 만들 수 있다. #include int memo[11]; int f(int k) { if (memo[k]) return memo[k]; return memo[k] = f(k - 1) + f(k - 2) + f(k - 3); } int main() { int n; scanf("%d", &n); memo[1] = 1; memo[2] = 2; memo[3] = 4; while (n--) { int input; scanf("%..

온라인저지 2018.07.27

[BOJ] 3029번: 경고

https://www.acmicpc.net/problem/3029 입력받은 시간을 모두 초로 바꾼 후, 터질 시간이 현재 시간보다 작을 경우 다음 날이라는 말이므로 24시간을 초로 바꾼 86400초 - 현재 시간 + 터질 시간이 기다려야 하는 시간이다. #include int main() { int ct[3], tt[3]; scanf("%2d:%2d:%2d\n%2d:%2d:%2d", &ct[0], &ct[1], &ct[2], &tt[0], &tt[1], &tt[2]); int cts = ct[0] * 3600 + ct[1] * 60 + ct[2]; int tts = tt[0] * 3600 + tt[1] * 60 + tt[2]; int ans = (cts < tts) ? tts - cts : 86400 -..

온라인저지 2018.07.27

[BOJ] 3042번: 트리플렛

https://www.acmicpc.net/problem/3042 이전 포스트가 CCW였는데 사실 이 문제를 풀기 위해 복습한 것이었다. CCW를 안다면 상당히 쉽게 풀 수 있는 문제였다. 핵심은 ccw이긴 해도 좌표만 따로 저장하는 것도 나름의 스킬인 것 같다. 그러면 더 쉬우니까... 그래서 알파벳들이 있는 x, y 좌표를 3개 잡고 ccw를 확인해서 그 값이 0이면 기록을 증가시키면 된다! #include int n; char A[100][101]; int x[26], y[26], m; int CCW(int x1, int y1, int x2, int y2, int x3, int y3) { int temp = x1 * y2 + x2 * y3 + x3 * y1; temp -= (x2 * y1 + x3 ..

온라인저지 2018.07.27

[BOJ] 11758번: CCW

https://www.acmicpc.net/problem/11758 문제 그대로 CCW를 구현하는 문제다. 나는 CCW가 뭐 대단히 어려운 거라고 생각했고 그로 인해 좀 꺼려졌는데 이번에 기회가 있어서 다시 보니 그냥 아마 중학교 3학년 때 삼각형 넓이 구하는 공식 해서 '신발끈 공식'을 배운 적이 있었는데 그거였다. 물론 증명은 못하지만... 쓸 수는 있어서 기쁘다. 넓이가 양수면 반시계 방향, 음수면 시계 방향, 0이면 일직선(세 점이)인 것이다. 외우기도 쉬운게 CCW 뜻 자체가 counter clockwise: 반시계이기 때문에 ccw값이 양수면 반시계라는 게 외우기 쉽다. #include int ccw(int x1, int y1, int x2, int y2, int x3, int y3) { in..

온라인저지 2018.07.27