| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 | 29 | 30 | 31 |
Tags
- python
- SSAFYcial
- 우테코
- IT 트렌드
- 코딩테스트
- SSAFY
- IT 동향
- 네트워크 관리사 2급 실기
- 네트워크 관리사 2급
- it 뉴스
- KT
- 카카오
- 프로그래머스
- 백준위
- 인앱결제
- 백준
- it 이슈
- 네트워크 관리사
- 신문 스크랩
- 싸피셜
- html
- 신문스크랩
- 코딩테스트 연습
- 싸피
- 구글
- java 객체지향 프로그래밍
- Java
- 코테
- SSAFY 7기
- 리얼클래스
Archives
- Today
- Total
개발자일걸요..?
1780번 종이의 개수 본문
728x90
반응형
문제링크 : www.acmicpc.net/problem/1780
1780번: 종이의 개수
N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1의 세 값 중 하나가 저장되어 있다. 우리는 이 행렬을 적절한 크기로 자르려고 하는데, 이때 다음의 규칙에 따라 자르려고 한다.
www.acmicpc.net

<알고리즘>
1) 입력받은 숫자를 이중 vector에 입력
2) quadTree 응용판을 이용해 정해진 범위가 병합이 가능한지 판정
2-1) 정해진 범위(원 사이즈 1/3크기)의 병합이 가능하면 answer에 begin input
2-2) 병합이 불가능하면 size를 더 작게해서 재도전
3) 9분할이 되었기에 함수 역시 각각의 범위를 가지고 9번 실행되어야함
메모리 : 69968KB 시간 : 1216ms
#include<iostream>
#include<vector>
#include<string>
using namespace std;
vector<int> answer;
void quadTreeVer2(vector<vector<int>> &p, int x, int y, int size) {
bool isCombine = true;
int begin = p[x][y];
for (int j = y; j < y + size; j++) {
for (int i = x; i < x + size; i++) {
if (p[i][j] != begin) {
isCombine = false;
break;
}
}
if (!isCombine) break;
}
if (isCombine) {
answer.push_back(begin);
return;;
}
size = (int)(size / 3);
quadTreeVer2(p, x, y, size);
quadTreeVer2(p, x+size, y, size);
quadTreeVer2(p, x+2*size, y, size);
quadTreeVer2(p, x, y+size, size);
quadTreeVer2(p, x + size, y + size, size);
quadTreeVer2(p, x + 2 * size, y + size, size);
quadTreeVer2(p, x, y + 2*size, size);
quadTreeVer2(p, x + size, y + 2 * size, size);
quadTreeVer2(p, x + 2 * size, y + 2 * size, size);
}
int main() {
int N = 0;
cin >> N;
vector<vector<int>> paper(N, vector<int>(N));
int a = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> a;
paper[i][j] = a;
}
}
quadTreeVer2(paper, 0, 0, N);
int minus = 0;
int zero = 0;
int plus = 0;
for (int i = 0; i < answer.size(); i++) {
if (answer[i] == -1)++minus;
else if (answer[i] == 0) ++zero;
else if (answer[i] == 1) ++plus;
}
cout << minus << "\n" << zero << "\n" << plus;
return 0;
}반응형
'알고리즘코딩 > Baekjoon Online Judge' 카테고리의 다른 글
| 9184번 신나는 함수 실행 (0) | 2021.03.03 |
|---|---|
| 1629번 곱셈 (0) | 2021.03.02 |
| 1992번 쿼드트리 (0) | 2021.03.01 |
| 2630번 색종이 만들기 (0) | 2021.03.01 |
| 10816번 숫자카드2 (0) | 2021.02.28 |
Comments