백준

백준2160 - 그림비교

개발하는꼬마 2019. 8. 26. 00:16

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

 

2160번: 그림 비교

N(2≤N≤50)개의 그림이 있다. 각각의 그림은 5×7의 크기이고, 두 가지 색으로 되어 있다. 이때 두 가지의 색을 각각 ‘X’와 ‘.’으로 표현하기로 하자. 이러한 그림들이 주어졌을 때, 가장 비슷한 두 개의 그림을 찾아내는 프로그램을 작성하시오. 두 개의 그림에서 다른 칸의 개수가 가장 적을 때, 두 개의 그림이 가장 비슷하다고 하자. 예를 들어 위와 같은 두 개의 그림이 주어졌을 때, 색칠한 부분이 서로 다르게 된다. 위의 그림은 5개의 칸이 서

www.acmicpc.net

클래스를 이용하여 푼 문제이다. 객체의 5 X 7 공간을 두 개씩 비교하여 최솟값을 출력한다. 

 

#include <iostream>
using namespace std;

int a, b; //서로 다른 곳의 갯수가 최소인 공간의 좌표 a, b
int small = 10000; //다른 곳의 수

//5 X 7 공간의 정보를 담은 클래스
class box {
public:
	char mat[5][7]; //5 X 7 공간의 정보
	box() {} //생성자
	void init() { //5 X 7 공간 입력 함수
		for (int i = 0; i < 5; i++) {
			for (int j = 0; j < 7; j++) {
				cin >> mat[i][j];
			}
		}
	}
};

//다른 곳을 찾아주는 함수, 최솟값이 갱신되면 true반환 그렇지 못하면 false 반환
bool diff(box m1, box m2) {
	int cnt = 0;
	for (int i = 0; i < 5; i++) {
		for (int j = 0; j < 7; j++) {
			if (m1.mat[i][j] != m2.mat[i][j]) {
				cnt++;
			}
		}
	}
	if (small > cnt) {
		small = cnt;
		return true;
	}
	return false;
}



int main() {
	int n;
	box* ptr;

	cin >> n;
	ptr = new box[n]; //n개의 좌표 동적할당

	for (int i = 0; i < n; i++) {
		ptr[i].init();
	}

	//k와 l의 공간을 입력받아 서로 다른 공간을 비교
	for (int k = 0; k < n - 1; k++) {
		for (int l = k + 1; l < n; l++) {
			for (int i = 0; i < 5; i++) {
				for (int j = 0; j < 7; j++) {
					if (diff(ptr[k], ptr[l])) {
						a = k + 1;
						b = l + 1;
					}
				}
			}
		}
	}

	cout << a << ' ' << b;
}