개발자 데뷔!

[C/C++ 8.2] 알고리즘 - Direct 본문

알고리즘 & 자료구조/알고리즘 (Algo)

[C/C++ 8.2] 알고리즘 - Direct

물꼮이 2022. 3. 16. 13:03

 

2차원 배열 맵에서, 
상-하-좌-우 방향으로 움직이고,
벽 및 장애물에 의한 움직임을 막기위한
알고리즘

 

 


 

Direct 사용

//Level 19

//1번
int main() {				//Direct 제일 기본 문제
	int Direct[4][2] = { 0,-1,1,0,0,1,-1,0 };			// 좌표 값 정리해둔 배열
	int arr[3][3] = { 3,5,4,1,1,2,1,3,9 };
	int y, x;
	int sum = 0;
	cin >> y >> x;
	for (int t = 0; t < 4; t++) {
		int cy = y + Direct[t][0];
		int cx = x + Direct[t][1];
		if (cy < 0 || cx < 0 || cy>3 || cx>3)			//범위 벗어나면 짤
			continue;					// 이번 차례는 통과시키고 다음 차례 반복문으로 넘어감 ㅎ
		sum += arr[cy][cx];
	}
	cout << sum;
		return 0;
}

 

 

Direct 방향 배열 선언 

1. 상하좌우

int Direct[4][2] = { 0,-1,1,0,0,1,-1,0 };

2. 대각선 

int Direct[4][2] = { 1,-1,1,1,-1,1,-1,-1 };

 

 

 

 

 

 


예제

Direct 8방 방향으로 폭탄 떨어뜨리기 

//8번
void bomb(char arr[4][5],int y, int x) {
	int Direct[8][2] = { 1,-1,1,0,1,1,0,1,-1,1,-1,0,-1,-1,0,-1 };
	for (int t = 0; t < 8; t++) {
		int cy = y + Direct[t][0];
		int cx = x + Direct[t][1];
		if (cy < 0 || cx < 0 || cy >= 4 || cx >= 5)
			continue;
		arr[cy][cx] = '#';
	}
}
int main() {
	char map[4][5] = { '_' };  // 이렇게 해도 '_'로 초기화 안됨
	//이렇게 일일이 _ 문자 넣어주기
	for (int i = 0; i < 4; i++) {
		for (int j = 0; j < 5; j++) {
			map[i][j] = '_';
		}
	}
	int y, x;
	for (int i = 0; i < 2; i++) {	// 폭탄 2번 떨어뜨림
		cin >> y >> x;
		bomb(map, y, x);			//배열은 함수에 넣어서, 함수내에서 요소를 바꾸어도, 주소값을 전달해주기 때문에 main에서의 배열도 그대로 바뀜
	}
	for (int i = 0; i < 4; i++) {
		for (int j = 0; j < 5; j++) {
			cout << map[i][j] << " ";
		}
		cout << endl;
	}
	return 0;
}

 

 

Direct에 좌표 입력받아, 해당좌표를 2차원 배열map 에 표시하기

//5번
int main() {
	int input[4][2];	// 좌표 입력 받을 용도				
	int vect[4][3] = { 0 };
	for (int i = 0; i < 4; i++) {
		for (int j = 0; j < 2; j++) {
			cin >> input[i][j];
		}
	}
	//해당 좌표에 다른 숫자 넣기  1. 좌표값 배열에 입력 + 2.Direct 합침
	for (int t = 0; t < 4; t++) {
		int cy = input[t][0];
		int cx = input[t][1];
		vect[cy][cx] = 5;
	}
	for (int i = 0; i < 4; i++) {
		for (int j = 0; j < 3; j++) {
			cout << vect[i][j]<<" ";
		}
		cout << endl;
	}
	return 0;
}

 

기본 map 에 조각 pattern이 있는지 확인

//6번					//  Direct 를 2차원 배열에 응용 !! pattern이 있는지 확인하는 로직
int check(char map[3][4], char pattern[2][2]) {	//기본 map & //조각 pattern 확인
	int Direct[4][2] = { 0,0,0,1,1,0,1,1 };		//Direct 설정해서 풀기 (pattern의 요소들의 좌표 )
	int cnt = 0;
	// map 에서 하나씩 돌며 찾아보기
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 4; j++) {
			//pattern이 있다면, 개수세기 cnt++
			int flag = 0;
			//Direct로 접근해 , pattern의 요소와 하나씩 비교하기
			for (int t = 0; t < 4; t++) {
				int cy = i + Direct[t][0];
				int cx = j + Direct[t][1];
				//범위를 벗어나면 반드시 flag 를 1로 하고 !!!! ** break 해서 반복문 나가 flag 유지 **
				if (cy < 0 || cx < 0 || cy >= 3 || cx >= 4) {
					flag = 1;						//조심 !!! flag 바꾸고 break도 반드시 해줘야함 !!!
					break;
				}
				if (map[cy][cx] != pattern[Direct[t][0]][Direct[t][1]])		//여기 유심히 보기 !!!
					flag = 1;	//다른게 있을 때,
			}
			if (flag == 0)
				cnt++;
		}
	}
	return cnt;
}
int main() {
	char map[3][4] = { 'A','B','G','K','T','T','A','B','A','C','C','D' };
	char pattern[2][2];
	for (int i = 0; i < 2; i++) {
		for (int j = 0; j < 2; j++) {
			cin >> pattern[i][j];
		}
	}
	if (check(map, pattern) == 0)
		cout << "미발견";
	else
		cout << "발견(" << check(map, pattern) << "개)";
	return 0;
}

 

직접 받아 바로 입력하기 

//9번
int returnsum(int arr[4][5], int y, int x, int size_y, int size_x) {
	int sum = 0;
	// Direct 좌표배열 대신 for문으로 받는 방법						// 이거 잘 정리 !!!!
	for (int i = 0; i < size_y; i++) {
		for (int j = 0; j < size_x; j++) {
			int cy = y + i;
			int cx = x + j;
			if (cy < 0 || cx < 0 || cy>3 || cx>4)	//범위 벗어나면 sum값에 추가 안함
				continue;
			sum += arr[cy][cx];
		}
	}
	return sum;
}