Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
Tags
- chatgpt #gpt #챗지피티 #ai
- 도커 #Docker #배포 #Spring #MySQL #백엔드배포
- /
- 도커 #docker #docker-compose.yml #도커컴포즈 #배포 #spring #mysql #docker-compose
Archives
- Today
- Total
개발자 데뷔!
[C/C++ 8.2] 알고리즘 - Direct 본문
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;
}
'알고리즘 & 자료구조 > 알고리즘 (Algo)' 카테고리의 다른 글
[C/C++ 8.6] 알고리즘 - 그래프(인접행렬) / DFS/ BFS (0) | 2022.04.23 |
---|---|
[C/C++ 8.4] 알고리즘 - Shift Left / Shift Right (0) | 2022.04.21 |
[C/C++ 8.3] 알고리즘 - 재귀/DFS/BFS (0) | 2022.04.19 |
[C/C++ 8.3] 알고리즘 - 재귀 (0) | 2022.03.17 |
[C/C++ 8.1] 알고리즘 - DAT (0) | 2022.03.16 |