본문 바로가기
algorithm/SW Expert Academy

단순 2진 암호코드 - 1240

by 에어컨조아 2020. 1. 11.

문제 : https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV15FZuqAL4CFAYD

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

코드 : 

#include <iostream>
#include <vector>
#include <limits>
//#include <cstdlib>
#include <stdio.h>

using namespace std;


int num[50][100] = { 0 };
int v0[7] = { 0,0,0,1,1,0,1 };
int v1[7] = { 0,0,1,1,0,0,1 };
int v2[7] = { 0,0,1,0,0,1,1 };
int v3[7] = { 0,1,1,1,1,0,1 };
int v4[7] = { 0,1,0,0,0,1,1 };
int v5[7] = { 0,1,1,0,0,0,1 };
int v6[7] = { 0,1,0,1,1,1,1 };
int v7[7] = { 0,1,1,1,0,1,1 };
int v8[7] = { 0,1,1,0,1,1,1 };
int v9[7] = { 0,0,0,1,0,1,1 };
vector<int*> arr;
int result = INT32_MAX;

void calc(int* v)
{
	int total = 0;
	int sum = 0;
	//홀수 합
	for (int i = 0; i < 7; i += 2)
	{
		sum += v[i];
		total += v[i];
	}
	sum *= 3;
	//짝수 합
	for (int i = 1; i < 7; i += 2)
	{
		sum += v[i];
		total += v[i];
	}

	if ((sum + v[7]) % 10 == 0)
	{
		total += v[7];
		if (result > total)
		{
			result = total;
		}
	}
}
void solution(int si, int sj, int n, int m)
{
	for (int i = 1; i <= 3; i++) // 1앞에 0이 올 경우
	{
		int v[8] = { 0 };
		int vi = 0;
		for (int j = sj - i; j < m; j += 7) // 가로 7자리씩 재단
		{
			bool check;
			for (size_t c = 0; c < arr.size(); c++) // 0~9까지 숫자
			{
				check = true;
				for (int k = 0; k < 7; k++) // 7자리 확인
				{
					if (arr[c][k] != num[si][j + k])
					{
						check = false;
						break;
					}
				}
				if (check)
				{
					v[vi++] = c; // 암호값 저장
					break;
				}
				
			}
		}
		if (vi == 8) // 정상적으로 다 들어갔다고 판단
		{
			calc(v);
		}
	}
}

int main()
{
	int T;
	cin >> T;

	arr.push_back(v0);
	arr.push_back(v1);
	arr.push_back(v2);
	arr.push_back(v3);
	arr.push_back(v4);
	arr.push_back(v5);
	arr.push_back(v6);
	arr.push_back(v7);
	arr.push_back(v8);
	arr.push_back(v9);

	int t = 0;
	while (t < T)
	{
		int N, M;
		cin >> N >> M;

		bool check = true;
		int index_i = 0;
		int index_j = 0;
		result = INT32_MAX;
		for (int i = 0; i < N; i++)
		{
			for (int j = 0; j < M; j++)
			{
				scanf_s("%1d", &num[i][j]);
				/*char c;
				cin >> c;
				num[i][j] = atoi(&c);*/
				if (num[i][j] == 1 && check)
				{
					index_i = i;
					index_j = j;
					check = false;
				}
			}
			cout << "";
		}

		solution(index_i, index_j, N, M);

		t++;
		if (result == INT32_MAX)
		{
			result = 0;
		}
		cout << "#" << t << " " << result << "\n";
	}
	return 0;
}

어렵지는 않는 문제였음. 

다만 당황했던건 당연히 입력이 띄어쓰기되서 들어올줄 알았는데 아니여서 잠시 당황했다는...

댓글