[백준 C++] 3495 아스키도형

이성훈·2022년 3월 28일
0

문제

창영이는 메모장에 '.', '\', '/'을 이용해서 도형을 그렸다. 각 문자는 그림에서 1*1크기의 단위 정사각형을 나타낸다.

'.'은 빈 칸을 나타내며, '/'는 정사각형의 왼쪽 아래 꼭짓점과 오른쪽 위 꼭짓점이 연결된 선분을, '\'은 왼쪽 위 꼭짓점과 오른쪽 아래 꼭짓점이 연결된 선분을 나타낸다.

창영이가 그린 도형의 넓이를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 h와 w가 주어진다. h는 그림의 높이, w는 너비이다. (2 ≤ h,w ≤ 100)

다음 h개 줄에는 창영이가 메모장에 그린 다각형이 주어진다.

창영이가 그린 다각형은 1개이고, 변과 변이 서로 교차하는 경우는 없고, 자기 자신과 접하는 경우도 없다.

출력

첫째 줄에 다각형의 넓이를 출력한다.

https://www.acmicpc.net/problem/3495

풀이

  1. 가로줄만보면, 대각선은 항상 짝수개 나온다.
  2. 따라서 홀수번째 대각선~ 짝수번째 대각선 사이의 정사각형갯수를 세고
  3. 마지막으로 모든 대각선타일의갯수 를 2로 나눈값이 답이다.

#define _CRT_SECURE_NO_WARNINGS 
#include <bits/stdc++.h>
int h, w, ** pic, area=0;

void init() {
	scanf("%d%d", &h, &w);
	pic = new int* [h];
	for (int i = 0; i < h; i++) {
		pic[i] = new int[w];
		char _;
		scanf("%c", &_); //줄바꿈문자지움
		for (int j = 0; j < w; j++) {
			scanf("%c", &_);
			if (_ == '/' || _ == '\\')
				pic[i][j] = 1;
			else
				pic[i][j] = 0;
		}
	}
}

void func() {
	//가로로 탐색해가며, 칠해진정사각형갯수를 찾음
	for (int i = 0; i < h; i++) { 
		int cnt = 0; 
		int crossCnt = 0;
		for (int j = 0; j < w; j++) {
			if (pic[i][j] == 1) {
				crossCnt++;
			if (crossCnt % 2 != 0)  //홀수번째 대각선일때
				cnt = 0;
			else  //짝수번째
				area += cnt;
			}
			else 
				cnt++;
		}
		area += crossCnt / 2;
	}
	printf("%d", area);
}

int main(void) {
	init();
	func();
	
	return 0;
}
profile
I will be a socially developer

0개의 댓글