본문 바로가기
SWE/코테

[성실코딩 27일차] 백준 #1347 미로 만들기

by S나라라2 2018. 11. 27.
반응형

어려운 문제 아닌데 꼼꼼하게 조건 확인하고 실수하지 말기!


#include < iostream >
#include < string >

#define SZ 101
#define INF 987654321

using namespace std;

int map[SZ][SZ] = { 0, };
int r = 50, c = 50;
int d = 0; //남쪽 
			// 남서북동 0 1 2 3
			// R : d=(d+1)%4;
			// L : d=(d-1)%4; if(d==-1) d=3;
int main(void) {
	
	// 시작위치 (50,50) 이동 가능 표시
	map[r][c] = 1;

	// 입력
	int n;
	cin >> n;
	string str;
	cin >> str;

	// 문자열에서 가리키는 이동가능한 위치들 다 표시
	for (int i = 0; i < n; i++) {
		switch (str[i]) // 문자열에서 문자 하나씩 처리
		{
		case 'F': 
			// 현재 바라보는 방향에 따라 이동 다르게
			switch (d)
			{
			case 0: // 남
				r = r + 1;
				break;
			case 1: // 서
				c = c - 1;
				break;
			case 2: // 북
				r = r - 1;
				break;
			case 3: // 동
				c = c + 1;
				break;
			}
			break;
		case 'R':
			d = (d + 1) % 4;
			break;
		case 'L':
			d = (d - 1) % 4;
			if (d == -1) d = 3;
			break;
		}
		map[r][c] = 1; // 이동가능함 표시
	}
	
	// 직사각형의 가장 왼쪽 상단의 시작위치 찾기
	// 직사각형의 가로, 세로 크기 찾기
	int sp_x = INF, sp_y = INF;  // 시작위치 
	int ep_x = -1, ep_y = -1; // 끝 위치
	for (int x = 0; x < SZ; x++) {
		for (int y = 0; y < SZ; y++) {
			if (map[x][y] == 1) {
				if (sp_x > x) { // 시작 위치 
					sp_x = x;
				}
				if (sp_y > y) {
					sp_y = y;
				}

				if (ep_x < x) { // 끝 위치 
					ep_x = x;
				}
				if (ep_y < y) { 
					ep_y = y;
				}
				
				
			}
		}
	}

	// 미로 출력하기 map[][]==1 : . 
	//				 map[][]==0 : #
	for (int x = sp_x; x <= ep_x; x++) {
		for (int y = sp_y; y <= ep_y; y++) {
			if (map[x][y]==1) {
				cout << ".";
			}
			else {
				cout << "#";
			}
		}
		cout << endl;
	}


	return 0;
}
반응형