[백준] 2630번: 색종이 만들기 C++로 풀어보기

2023. 7. 30. 22:26·Algorithm/Baekjoon(C++)

2630번 설명

생각

재귀를 사용하면 될 것 같다.

1. 사각형을 4분면으로 나눠서 거기서부터 루프를 돌면서 0인지 1인지 확인한다.

2. bool 변수를 두개 만든다. 하나는 루프를 돌 때 한 번이라도 1이 나오면 false(흰색 사각형이 아니라는 뜻), 또 하나는 루프를 돌 때 한 번이라도 0이 아니면 false(파란색 사각형이 아니라는 뜻.)이다.

3. 그리고 재귀를 사용해서 흰색 혹은 파란색 사각형을 찾을 때까지 계속 탐색한다.

4. 두 bool 변수 중 하나라도 true가 나오면 사각형을 찾은 것이므로 재귀를 그만둔다.

5. 파란색 사각형이면 파란색 사각형의 개수를 나타내는 변수에 1을 더하고, 흰색 사각형이면 흰색 사각형의 개수를 나타내는 변수에 1을 더한다.

6. 모든 과정이 다 끝나면 하얀색 색종이의 개수와 파란색 색종이의 개수를 출력한다.

 

 

코드
#include <bits/stdc++.h>
using namespace std;
int bluecnt = 0;
int whitecnt = 0;

vector <vector<int>> v; // 벡터 선언

void find(int x, int y, int n) {
	bool blue = true; // 파란색 사각형인지 나타내는 bool 변수
	bool white = true; // 흰색 사각형인지 나타내는 bool 변수

	
	for (int i = x; i < x+n; i++) {
		for (int j = y; j < y+n; j++) {
			if (v[i][j] != 1) { // 1을 나타내지 않는다면
				blue = false; // 파란색 사각형이 아니다
			}
			else {
				white = false; // 1을 나타낸다면 흰색 사각형이 아니다.
			}
		}
	}

	if (blue == true) { // 파란색 사각형이면
		bluecnt++; // bluecnt에 1을 더한다.
		return;
	}
	else if (white == true) { // 하얀색 사각형이면
		whitecnt++; // whitecnt에 1을 더한다.
		return;
	}
	
	if (n > 1) { // 아직 사각형이 나타나지 않았으면 재귀를 돌린다.
		find(x, y, n / 2);
		find(x, y + n / 2, n / 2);
		find(x + n / 2, y, n / 2);
		find(x + n / 2, y + n / 2, n / 2);
	}
	else {
		return;
	}
	

}

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	
	int n;
	cin >> n;

	// vector<vector <int>> v(n, vector<int>(n, 0)); <- 이렇게 하면 틀린다..
	v = vector<vector<int>>(n, vector<int>(n, 0)); // 벡터 0으로 초기화

	for (int i = 0; i < n; i++) { // 숫자 입력
		for (int j = 0; j < n; j++) {
			int x;
			cin >> x;
			v[i][j] = x;
		}
	}

	bluecnt = 0;
	whitecnt = 0;
	
	find(0, 0, n); 

	cout << whitecnt << "\n"; // 출력
	cout << bluecnt;
	
}

 

결과

2630번 결과

벡터를 2차원으로 만드는 것이 익숙하지 않아서 살짝 애를 먹었다. 익숙해지자.

그리고 재귀도 많이 써봐야겠다.

저작자표시 비영리 변경금지 (새창열림)

'Algorithm > Baekjoon(C++)' 카테고리의 다른 글

[백준] 10989번: 수 정렬하기 3 C++로 풀어보기  (1) 2023.08.05
[백준] 15665번: N과 M (11) C++로 풀어보기  (0) 2023.07.31
[백준] 7562번: 나이트의 이동 C++로 풀어보기  (1) 2023.07.28
[백준] 11050번: 이항 계수 1 C++로 풀어보기  (1) 2023.07.27
[백준] 2798번: 블랙잭 C++로 풀어보기  (0) 2023.07.24
'Algorithm/Baekjoon(C++)' 카테고리의 다른 글
  • [백준] 10989번: 수 정렬하기 3 C++로 풀어보기
  • [백준] 15665번: N과 M (11) C++로 풀어보기
  • [백준] 7562번: 나이트의 이동 C++로 풀어보기
  • [백준] 11050번: 이항 계수 1 C++로 풀어보기
퀵차분
퀵차분
Web Developer 🥐
  • 퀵차분
    QC's Devlog
    퀵차분
  • 전체
    오늘
    어제
    • 분류 전체보기 (177) N
      • Frontend (31) N
      • Fedify (4)
      • Study (42)
        • NestJS (2)
        • Node.js (3)
        • Modern JS Deep Dive (13)
        • SQL (1)
        • Network (1)
        • 프롬프트 엔지니어링 (4)
        • 인공지능 (9)
        • 시스템프로그래밍 (11)
        • 선형대수학 (1)
      • Intern (4)
      • KUIT (21)
      • Algorithm (48)
        • Baekjoon(C++) (26)
        • Programmers(JavaScript) (22)
      • 우아한테크코스(프리코스) (4)
      • Project (9)
        • crohasang_page (2)
        • PROlog (4)
        • Nomadcoder (2)
      • 생각 (4)
      • Event (7)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    오블완
    타입스크립트
    react
    KUIT
    티스토리챌린지
    시스템프로그래밍
    next.js
    typescript
    자바스크립트
    인공지능
    프로그래머스 자바스크립트
    fedify
    백준
    프론트엔드
    음악추천
    알고리즘
    리액트
    프로그래머스
    HTML
    javascript
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
퀵차분
[백준] 2630번: 색종이 만들기 C++로 풀어보기

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.