23.08.18 계륵 일기

E woo·2023년 8월 18일

계륵 일기

목록 보기
19/31
post-thumbnail

C++ 입출력

지난번 계륵 일기에도 적었지만 하나씩 입력 받는 방법이 c++ 에서는
cin 을 통해서는 할 수 없기 때문에

scanf 를 사용해야 한다.

인데.. 그 포멧을 잘못 써서 문제 푸는데 시간이 걸렸다.

scanf("%1d", &arr[i][j]);

처럼 사용할 수 있고 string 으로 받아서 하나씩 처리해도 되긴 한다.

string s;

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

분할 정복

https://www.acmicpc.net/problem/1992

위의 문제는 처음 영역을 확인하고 계속 영역을 줄여가며 풀어야 하는 문제로

처음의 큰 문제를 작게 쪼개어 가며 구현을 하게 된다.

이처럼 문제를 푸는 방식을 분할 정복 이라고 하며 재귀함수 혹은 스택으로 구현할 수 있다.

string quard(int y, int x, int size)
{
    int b = arr[y][x];
    // cout << to_string(b);
    if (size == 1)
        return to_string(b);

    string ret = "";
    for (int i = y; i < y + size; i++)
    {
        for (int j = x; j < x + size; j++)
        {
            if (b != arr[i][j])
            {
                ret += '(';
                ret += quard(y, x, size / 2);
                ret += quard(y, x + size / 2, size / 2);
                ret += quard(y + size / 2, x, size / 2);
                ret += quard(y + size / 2, x + size / 2, size / 2);
                ret += ')';
                return ret;
            }
        }
    }
    return to_string(b);
}

이처럼 quard 라는 재귀함수로 처음의 사이즈의 절반씩 줄여가고 영역을 나누는 방식을 반복하여
문제를 해결하게 된다.

profile
뒘벼

0개의 댓글