본문 바로가기

C++/공부 정리

Direct offset 배열, 구조체, 2차원 배열에서 패턴찾기

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;
}