Language Grammar/C++

2024 - 10- 31 C++ 코딩테스트 10주완성 D+55

Jang_^ 2024. 10. 31. 16:34
복습

복습을 습관화안해서 그런지 밀린 숙제들이 많다..!!

 

그리고 오랜만에 보니.. 로직은 기억나는데, 코드가 기억나질않는다 아무래도 내꺼가 될려면 복습은 필수인 것 같다!!

 

복습한 내용을 살펴보자

 

백준 2234 문제 - 성곽

 

오늘은 시간이 별로 많지않아서.. 하나밖에 못하였다. 

 

실습코드

 

#include <bits/stdc++.h>

using namespace std;

int a[54][54],visited[54][54],N,M,cnt = 1,ret = -987654321;
int dy[4] = {0,-1,0,1},dx[4] = {-1,0,1,0};
vector<int> v;

int go(int y,int x)
{
    int ret = 1;
    visited[y][x] = cnt;

    for(int i =0; i < 4; i++)
    {        
        if(!(a[y][x] & (1 << i)))
        {
            int ny = y + dy[i];
            int nx = x + dx[i];

            if(ny < 0 || ny >= N || nx < 0 || nx >= M || visited[ny][nx]) continue;
            
            ret += go(ny,nx);
            
        } 
    }
    return ret;
}

int main()
{
    cin >> M >> N;

    for(int i =0; i < N; i++)
    {
        for(int j=0; j < M; j++)
        {
            cin >> a[i][j];
        }
    }

    for(int i =0; i < N; i++)
    {
        for(int j =0; j < M; j++)
        {
            if(!visited[i][j]) 
            {
                v.push_back(go(i,j));
                cnt++;
            }
        }
    }
    for(int i=0; i < N; i++)
    {
        for(int j =0; j < M; j++)
        {
            if(i < N-1 && (visited[i][j] != visited[i+1][j])) ret = max(ret,v[visited[i][j]-1] + v[visited[i+1][j]-1]);

            if(j < M-1 && (visited[i][j] != visited[i][j+1])) ret = max(ret,v[visited[i][j] -1] + v[visited[i][j+1] -1]);
        }
    }

    if(ret == -987654321) return 0;

    else 
    {
        sort(v.begin(),v.end());
        cout << v.size() << endl <<v.back() << endl << ret;
    }
}