본문 바로가기

코딩테스트

[C++] 방의 크기 구하기

숙제 3 (방 크기)

★ STACK 사용


이와같이건물의평면도가주어졌을, 건물내부에있는방의개수와방의크기를구하는로그램을작성하시오. 방의크기는위의예에서같이가로, 세로 칸으로 만들어진 공간수를 나타내며, 오른쪽에서 숫자를나타내는문자의개수와일치한다. 따라서, 위의 건물에는 8 방이 있으며, 방의 기는 1방부터 8방까지 각 각 차례로 53, 13, 6, 42, 4, 57, 2, 35이다.

 

#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;


int main(){
	stack<int> s1;  //x좌표 저장
	stack<int> s2; //y좌표 저장
	stack<int> dir; //dir 저장
	int num[100]={0x00,};
	int row,col;
	cin>>row>>col;
	char **arr;
	int n=0x00;

	int direction[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
	int d=0x00;
	int inx=0x00;
	int iny=0x00;
	int x,y;
	arr=new char*[col];
	for(int i=0;i<col;i++) arr[i]=new char[row+1];
	for(int i=0;i<col;i++){
		for(int j=0;j<row;j++) cin>>arr[i][j];}
	for(int i=1;i<col-1;i++){
		for(int j=1;j<row-1;j++){
			if(arr[i][j]!='.') continue;
			arr[i][j]='x';
			num[n]++;
			s1.push(i);
			s2.push(j);
			dir.push(0);
			while(!(s1.empty())){
				x=s1.top();
				y=s2.top();
				d=dir.top();
				s1.pop();
				s2.pop();
				d=0;
				while(d<4){
					inx=x+direction[d][0];
					iny=y+direction[d][1];
					if(arr[inx][iny]=='.'){
						num[n]++;
						arr[inx][iny]='x'; //이미 방이 포함되었다는 걸 x로
						s1.push(inx);
						s2.push(iny);
						
					}
					d++;
					
				}
			
			}
			n++;
			
		}
	}
	sort(num, num+100);
	cout<<n<<endl;
	for(int i=99;num[i]!=0&&num[i]>=0;i--) cout<<num[i]<<" ";
	cout<<endl;
	for(int i=0;i<col;i++) delete[] arr[i];
	delete[] arr;
	
	return 0;
}

 

 

'코딩테스트' 카테고리의 다른 글

[C++] MultiMax  (0) 2021.06.29
[C++] 괄호  (0) 2021.06.29
[C++] 절단 대각선 (Broken Diagonal)  (0) 2021.06.29
[C++] 1차원라이프(Life)게임  (0) 2021.06.29
[C++] 제일 작은 수 제거하기  (0) 2021.06.28