Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- Stack 이란
- 백준 1406
- 백준 2447
- 해시 구현
- 해시구현
- 구현
- qorwns
- 스택의 특징
- 백준 17471
- 5397
- AVL 시간 복잡도
- heap
- 풀이
- 백준 5397
- 별 찍기 10
- 게리멘더링2
- 백준 17822
- 백준 1158
- 버킷 정렬
- 1764
- c#
- C/C++ 구현
- ㅣ풀이
- 원판 돌리기
- 시간 복잡도
- dfs
- 조세퍼스 순열
- 자료구조
- 백준
- 백준 17779
Archives
- Today
- Total
홍시홍의 프로그래밍
[백준 1780] 종이의 개수 본문
분류
분할 정복
요구사항
1. 9칸으로 나누었을때 가장 작게 나누어지는 조각 찾기
2. 각 조간의 갯수 구하기
풀이
나는 어려운데 정답률이 상당히 높다
문제 풀이의 흐름은
검사 -> 분할으로 진행된다
검사는 현재 나눈 칸이 동일한 값으로 이루어 져있는지 검사하는 단계
분할은 동일한 값이 아니라면, 9칸으로 나누어서 다시 진행하는 것이다
분할하는 것이 힘들었다
9칸을 어떻게 나눌것인가
풀이는 직접 그려보고 index 번호 적어보니깐 어떻게 나눌지 보이기 시작했다
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
#include <math.h>
#include <string.h>
#include <queue>
using namespace std;
int map[2200][2200];
int n;
int ans[3];
bool check(int r, int c, int nowsize) {
int nownum = map[r][c];
for (int i = r; i < r + nowsize; i++) {
for (int j = c; j < c + nowsize; j++) {
if (map[i][j] != map[r][c]) return false;
}
}
return true;
}
void solve(int r, int c, int nowsize) {
if (check(r, c, nowsize)) {
ans[map[r][c] + 1]++;
return;
}
else {
int nextsize = nowsize / 3;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
solve(r + nextsize*i, c + nextsize*j, nextsize);
}
}
}
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
scanf("%d", &map[i][j]);
solve(0, 0, n);
cout << ans[0] << endl;
cout << ans[1] << endl;
cout << ans[2] << endl;
}
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준 17090] 미로 탈출하기 (0) | 2020.05.27 |
---|---|
[백준 14891] 톱니바퀴 (0) | 2020.05.26 |
[백준 18808] 스티커 붙이기 (0) | 2020.05.25 |
[백준 3568] iSharp (0) | 2020.05.18 |
[백준 14888] 연산자 끼워넣기 (0) | 2020.05.18 |
Comments