본문 바로가기
Me/Algorithm

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

by 폴스업데이트 2021. 7. 31.
728x90

[3495] 아스키 도형


 

난이도: Gold 5

시도횟수: 1

www.acmicpc.net/problem/3495

문제

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

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

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

입력

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

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

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

 


제출한 코드

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;


int main() {
	int h, w;
	int dot_num=0;
	int area = 0;
	vector<string> grid;
	cin >> h >> w;
	for (int i = 0; i < h; i++) {
		string line;
		cin >> line;
		grid.push_back(line);
	}

	for (int i = 0; i < h; i++) {
		for (int j = 0; j < w; j++) {
			if (grid[i][j] != '.' && j < w) {

				j++;
				area++;
				while (grid[i][j] == '.'&&j<w) {
					j++;
					dot_num++;

				}
				area += dot_num;
				dot_num = 0;

			}
			
			dot_num = 0;
		}

	}
	cout << area;

	return 0;
}

알고리즘이 어려워서 골드라기 보다는 기하학적인 발상이 중요했던 문제

행렬에서 가로로 쭉 search하면 하나의 행에는 적어도 한 쌍의 세로가 있기 마련이다. 또는 아예 없거나.

만약 .가 아닌 문자가 입력되면 그 순간 그 다음 /까지의 . 개수를 센다.

그러면 (.의 개수 +1)이 그 구간에서의 넓이가 된다.

 

생각해보니 지금은 while과 if로 구현했는데 stack을 이용했다면 좀 더 직관적이고 이해하기 쉬운 코드가 됐을 것 같다.

 

빨리 알고리즘의 기초 들어서 좀 풀고 싶다. 근데 이번에 논설실이랑 겹쳐서 못들을듯 ㅠ

728x90

'Me > Algorithm' 카테고리의 다른 글

8. 백준 C++[11723] 집합  (0) 2021.08.05
7. 백준 C++[9658] 돌 게임 4  (0) 2021.08.03
5. 백준 C++[3048] 개미  (0) 2021.07.21
4. 백준 C++[1183] 약속  (0) 2021.07.15
3. 백준 Python[1654] 랜선 자르기  (0) 2021.02.25

댓글