Direct 코딩 기법
한 좌표를 입력받고 위, 아래, 오른쪽, 왼쪽 합을 구하라.
direct라는 offset 배열을 사용하여 합을 구함
#include <iostream>
using namespace std;
int arr[4][4] = {
1, 1, 1, 1,
2, 2, 2, 2,
3, 3, 3, 3,
4, 4, 4, 4
}, direct[4][2] = {-1, 0, 1, 0, 0, -1, 0, 1};
int main()
{
int y, x, sum = 0;
cin >> y >> x;
for(int i=0; i<4; i++)
{
int dy = y + direct[i][0];
int dx = x + direct[i][1];
if(dy < 0 || dx < 0 || dy > 3 || dx > 3)
continue;
sum += arr[dy][dx];
}
cout << sum;
return 0;
}
대각선 위, 아래, 오른쪽, 왼쪽 구하기(direct offset 배열 사용)
#include <iostream>
using namespace std;
int arr[3][3] = {
3, 7, 4,
1, 1, 5,
4, 2, 9
}, direct[4][2] = {-1, -1 , 1, -1, -1, 1, 1, 1};
int main()
{
int y, x, sum =0;
cin >> y >> x;
for(int i=0; i<4; i++)
{
int dy = y + direct[i][0];
int dx = x + direct[i][1];
if(dy < 0 || dx < 0 || dy > 2 || dx > 2)
continue;
sum += arr[dy][dx];
}
cout << sum;
return 0;
}
위, 아래, 왼쪽, 오른쪽에서 최솟값 찾기
#include <iostream>
using namespace std;
int arr[4][3] = {
4, 5, 2,
1, 1, 9,
4, 2, 5,
1, 1, 2
}, direct[4][2] = {-1, 0, 1, 0, 0, -1, 0, 1};
int main()
{
int y, x, min = 21e8;
cin >> y >> x;
for(int i=0; i<4; i++)
{
int dy = y + direct[i][0];
int dx = x + direct[i][1];
if(dy < 0 || dx < 0 || dy > 3 || dx > 2)
continue;
if(min > arr[dy][dx])
{
min = arr[dy][dx];
}
}
cout << min;
return 0;
}
특정 죄표 주변에 A가 몇개 있는지 서치하기
#include <iostream>
using namespace std;
char arr[3][6] = {
"ABTAC",
"CCAAA",
"AAGGA"
}, direct[8][2] = {-1, -1, -1, 0, -1, 1, 0, -1, 0, 1, 1, -1, 1, 0, 1, 1};
int main()
{
int y, x, cnt = 0;
cin >> y >> x;
for(int i=0; i<8; i++)
{
int dy = y + direct[i][0];
int dx = x + direct[i][1];
if(dy < 0 || dx < 0 || dy > 2 || dx > 4) continue;
if(arr[dy][dx] == 'A')
cnt++;
}
cout << cnt;
return 0;
}
구조체
#include <iostream>
using namespace std;
struct Node
{
int a, b, c[4];
};
int main()
{
Node da = {10, 20, {3, 3, 3, 3}};
Node db = {50, 70, {4, 4, 4, 4}};
// da.c = {3, 3, 3, 3} 이런 식으로 값을 넣는 것은 error이다.
/*
마치
int vect[4];
vect = {4, 4, 4, 4} 와 같은 꼴이기 때문이다
*/
cout << da.c[3] << ' ' << db.c[3];
return 0;
}
구조체 배열에 값 채우기
#include <iostream>
using namespace std;
struct Node
{
int a, b;
};
Node vect[7];
int main()
{
for(int i=0; i<7; i++)
{
vect[i] = {i+1, i +2};
}
for(int i=0; i<7; i++)
{
cout << vect[i].a << ' ' << vect[i].b << '\n';
}
return 0;
}
2차원 배열 비교
같은 크기의 배열 비교
#include <iostream>
using namespace std;
int a[2][3] = {1, 2, 3, 4, 5, 6}, b[2][3] = {1, 2, 3, 4, 9, 6};
int isSame()
{
for(int i=0; i<2; i++)
{
for(int j=0; j<3; j++)
{
if(a[i][j] != b[i][j])
return 1;
}
}
return 0;
}
int main()
{
if(isSame())
{
cout << "다름";
}
else
cout << "같음";
return 0;
}
다른 크기의 배열 비교
#include <iostream>
using namespace std;
int map[5][4] = {0, 1, 2, 3,
0, 1, 2, 3,
0, 1, 2, 3,
3, 3, 3, 4,
3, 5, 3, 4
}, a[3][2] = {1, 2, 1, 2, 3, 3};
int isSame(int y, int x)
{
for(int i=0; i<3; i++)
{
for(int j=0; j<2; j++)
{
if(a[i][j] != map[i+y][j+x])
return 1;
}
}
return 0;
}
int main()
{
int flag = 0, y = 0, x = 0;
for(int i=0; i<3; i++)
{
for(int j=0; j<3; j++)
{
if(!isSame(i, j))
{
flag = 1;
y = i;
x = i;
break;
}
}
if(flag == 1)
{
cout << "발견: " << y << ' ' << x;
break;
}
}
return 0;
}
문자로 된 다른 크기 배열 비교
#include <iostream>
using namespace std;
char map[3][5] = {"ABCD", "EFGH", "IJKL"}, pt[2][4] = {"BCD", "FGH"};
int isSame(int y, int x)
{
for(int i=0; i<2; i++)
{
for(int j=0; j<3; j++)
{
if(pt[i][j] != map[i+y][j+x])
return 0;
}
}
return 1;
}
int main()
{
for(int i=0; i<2; i++)
{
for(int j=0; j<2; j++)
{
if(isSame(i, j))
{
cout << "발견";
return 0;
}
}
}
cout << "미발견";
return 0;
}
'C++ > 공부 정리' 카테고리의 다른 글
함수 오버로딩, public & private (0) | 2021.10.04 |
---|---|
클래스, 재귀함수 (0) | 2021.10.01 |
문자열 속 패턴 찾기, DAT(Direct Address Table) (0) | 2021.09.19 |
비트배열과 다중 카운트 (0) | 2021.09.16 |
length() 사용하지 않고 문자열 길이 구하여 배열 속 요소 카운트하기 (0) | 2021.09.15 |