1080번: 행렬

첫째 줄에 행렬의 크기 N M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 행렬 A가 주어지고, 그 다음줄부터 N개의 줄에는 행렬 B가 주어진다.

www.acmicpc.net

#include<stdio.h>
typedef unsigned char uc;
typedef unsigned short us;
static const int MAX_SIZE = 2501;

int main()
{
	int i, j, k;
	us N, M;
	scanf("%hu %hu", &N, &M);
	short size = N * M;

	int result = 0;
	uc a[MAX_SIZE];
	uc b[MAX_SIZE];


	for (i = 0; i < size; ++i)
	{
		scanf("%1d", &a[i]);
		/*scanf(" %c", &a[i]);
		a[i] -= 48;*/
	}
	for (i = 0; i < size; ++i)
	{
		scanf("%1d", &b[i]);
		/*scanf(" %c", &b[i]);
		b[i] -= 48;*/
	}
	

	if (N < 3 || M < 3)
	{
		for (i = 0; i < size; ++i)
		{
			if (a[i] != b[i])
			{
				printf("-1");
				return 0;
			}
		}
		printf("0");
		return 0;
	}


	for (i = 0; i <= N - 3; ++i)	
	{
		for (j = M * i; j <= M * (i + 1) - 3; ++j)
		{
			if (a[j] != b[j])
			{
				a[j + (M * 0)] = !a[j + (M * 0)]; a[j + (M * 0) + 1] = !a[j + (M * 0) + 1]; a[j + (M * 0) + 2] = !a[j + (M * 0) + 2];
				a[j + (M * 1)] = !a[j + (M * 1)]; a[j + (M * 1) + 1] = !a[j + (M * 1) + 1]; a[j + (M * 1) + 2] = !a[j + (M * 1) + 2];
				a[j + (M * 2)] = !a[j + (M * 2)]; a[j + (M * 2) + 1] = !a[j + (M * 2) + 1]; a[j + (M * 2) + 2] = !a[j + (M * 2) + 2];
				++result;
			}
		}

		if (a[M - 2] != b[M - 2] || a[M - 1] != b[M - 1])
		{
			result = -1;
			break;
		}
	}

	for (i = size - 1; size - (M * 2) < i; --i)
	{
		if (a[i] != b[i])
		{
			result = -1;
			break;
		}
	}

	printf("%d", result);
	return 0;
}

 

약 30분동안 고민했지만 로직이 생각나지 않았던 문제.. 나에게는 너무 어려웠다..


||사용 기법

  • 그리디

 


||풀면서 느낀 것

  • 여러 Input값을 생각 못하고 테스트 케이스만 통과되면 제출하는 버릇이 있다.

그래서 그런지 여러 예외 처리를 하지 못하는 모습을 보이고 있다.

반례 또한 스스로 생각해야 하는데 질문 게시판에서 찾아보게되더라 =~=

이런 다양한 Input값을 통한 예외, 반례 이런걸 스스로 생각 하는 습관을 들일것이다.

 

  • 올바른 자료형 채택

이번에는 자료형을 무작정 int가 아닌 제한된 범위에 맞는 자료형을 맞추려 시도했다.

근데 꼼꼼히 생각하지 않았는지 이 때문에 여러 문제가 생기고 시간이 많이 소요됐다.

특히 배열의 최대 사이즈가 2500인데 unsigned char로 잡는 바람에 로직이 다 맞음에도 틀렸다. 시발

 

  • 좀 더 꼼꼼한 설계

위와 비슷한 맥락이다. 항상 문제를 파악하고 설계를 하고 손코딩을 해보지만 설렁설렁한다는 느낌이 있어서

이번에 시간이 많이 소요되었다. 이번에 반복문에서 out of range, out of bound 도 많이 났었고

인덱스 규칙도 하나를 빼먹거나 해서 좀 꼼꼼하게 설계를 해야겠다.

 


||새로 알게 된것

  • byte라는 타입은 C++ 17에 추가 되었으며(std::byte) 산술 연산이 불가능하다.

이번에 알맞은 자료형을 사용하려고 하면서 byte를 사용해봤는데 산술연산이 불가능했다.

나중에 연산이 안되는 점을 이용할 수 도 있겠다.

연산을 하려면 char종류나 uint8을 사용하면 되겠다.

 


||나아 진것

  • 문제 파악

예전에는 난독증 마냥 읽어도 무슨말인지 모르는 경우가 많았는데 

최근에는 문제 해석은 잘 되는듯 하다!

'코딩 테스트 > 알고리즘 풀이' 카테고리의 다른 글

[백준 - 9012] 괄호  (0) 2022.07.31
[백준 - 9093] 단어 뒤집기  (0) 2022.07.31
[백준 - 1715] 카드 정렬하기  (0) 2022.07.28
[백준 - 2751] 수 정렬하기2  (0) 2022.07.27
[백준 - 10610] 30  (0) 2022.07.27

+ Recent posts