(C++) 백준 2160 - 그림 비교

코딩너구리·2025년 10월 15일

코딩 문제 풀이

목록 보기
34/266

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

문제

> 두 가지 색으로 이루어진 5x7크기의 그림 N개가 있다.
> 두 가지의 색을 x와 .으로 표현하자.
> 다른 칸의 개수가 가장 적을 때 가장 비슷하다고 하자. 가장 비슷한 두 개의 그림을 찾아내라.

접근

각 그림을 입력받아 표로 생성한 후 가능한 경우를 모두 비교한다. 그 중 차이가 가장 적은 그림을 비교한다.
최종비교 후 출력한다.

문제해결

> 3차원 벡터로 그림의 번호, 행과 열로 입력받아 각 그림을 정의한다.
> 각각의 그림을 중복되는 비교 없이 비교한다.
> 같지않은 부분이 있으면 cnt값을 누적하고 가장 차이가 큰 경우와 비교하며 차이의 최소값을 갱신한다.
> 최소값이 갱신되면 해당 그림의 번호를 저장하고 최종적으로 차이가 가장 적은 그림을 출력한다.

코드

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);

	int N;
	cin >> N;
	int rst = 35;
	int arr[2] = { 1, 2 };
	vector<vector<vector<char>>> picture(N, vector<vector<char>>(5, vector<char>(7)));
	for (int i = 0; i < N; i++) {
		for (int r = 0; r < 5; r++) {
			string str;
			cin >> str;
			for (int c = 0; c < 7; c++) {
				picture[i][r][c] = str[c];
			}
		}
	}
	for (int i = 0; i < N-1; i++)
	{
		for (int j = i+1; j < N; j++)
		{
			int cnt = 0;
			for (int r = 0; r < 5; r++)
			{
				for (int c = 0; c < 7; c++)
				{
					if (picture[i][r][c] != picture[j][r][c])
					{
						cnt++;
					}
				}
			}
			if (cnt < rst)
			{
				rst = cnt;
				arr[0] = i+1;
				arr[1] = j+1;
			}
		}
	}
	cout << arr[0] << " " << arr[1] << '\n';
}

후기

다중 반복문 처리가 복잡하고 처리 순서에 대해 어려웠다.
계속 틀리길래 반복문 처리나 입력 처리가 문제일 줄 알았지만 결과값 그림을 저장하는 arr 배열의 초기값에 문제가 있었다. 사소한 예외를 꼼꼼히 보자

0개의 댓글