Forming a Magic Square

108번뇌·2021년 8월 23일
0

https://www.hackerrank.com/challenges/magic-square-forming/problem


#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;

// Driven Program


int  find_magic_square(vector<int> vTemp)
{
    int arrTemp[3][3];


    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            arrTemp[i][j] = vTemp[3 * i + j];
        }
    }

    int iCom(0);
    for (int i = 0; i < 3; i++)
    {
        iCom += arrTemp[0][i];
    }

    
    for (int i = 1; i < 3; i++)//Row
    {
        int iTemp(0);
        for (int j = 0; j < 3; j++)
        {
            iTemp += arrTemp[i][j];
        }

        if (iCom != iTemp)    return 0;
    }

    for (int i = 0; i < 3; i++)//Col
    {
        int iTemp(0);
        for (int j = 0; j < 3; j++)
        {
            iTemp += arrTemp[j][i];
        }
        if (iCom != iTemp)    return 0;
    }

    int iTemp(0);
    for (int i = 0; i < 3; i++)
    {
        iTemp += arrTemp[i][i];//
    }
    if (iCom != iTemp)    return 0;


    int iTemp1(0);
    for (int i = 0; i < 3; i++)//
    {
        iTemp1 += arrTemp[2 - i][i];
    }
    if (iCom != iTemp1)    return 0;


    return 1;
}

int cal_min(vector<int> vinput,vector<int> vcompare)//
{
    int iTemp(0);
    for (int i = 0; i < vcompare.size();i++)
    {
        iTemp += abs(vinput[i] - vcompare[i]);
    }

    return iTemp;
}


int main()
{
    vector<int> vinput;
    for(int i=0; i<3; i++)
    {
        for(int j=0; j<3; j++)
        {
            int iTemp; cin>>iTemp; vinput.push_back(iTemp);
        }
    }
    
    vector<int> vTemp;
    for (int i = 1; i <= 9; i++)
    {
        vTemp.push_back(i);
    }
    
    vector<vector<int>> vvTemp;
   do
    {
        if (1 == find_magic_square(vTemp))
        {
            vvTemp.push_back(vTemp);
        }
    } while (next_permutation(vTemp.begin(), vTemp.end()));

    int Answer(999999999);
    
    for (int i = 0; i < vvTemp.size(); i ++)
    {
        Answer = min(Answer, cal_min(vinput, vvTemp[i]));
    }

    cout << Answer << endl;



    return 0;
}

해커랭크 미디엄 처음 풀어봄.
이 문제 풀 때 한글 주석 달면 넌아스키코드라고 계속 알람나옴. 한글달면안됨.

[연습코드]


using namespace std;
#include <vector>
#include <algorithm>
#include <iostream>
// Driven Program


int  find_magic_square(vector<int> vTemp)
{
	int arrTemp[3][3];


	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			arrTemp[i][j] = vTemp[3 * i + j];
		}
	}

	int iCom(0);
	for (int i = 0; i < 3; i++)
	{
		iCom += arrTemp[0][i];
	}

	
	for (int i = 1; i < 3; i++)//Row
	{
		int iTemp(0);
		for (int j = 0; j < 3; j++)
		{
			iTemp += arrTemp[i][j];
		}

		if (iCom != iTemp)	return 0;
	}

	for (int i = 0; i < 3; i++)//Col
	{
		int iTemp(0);
		for (int j = 0; j < 3; j++)
		{
			iTemp += arrTemp[j][i];
		}
		if (iCom != iTemp)	return 0;
	}

	int iTemp(0);
	for (int i = 0; i < 3; i++)
	{
		iTemp += arrTemp[i][i];//대각형태 1;
	}
	if (iCom != iTemp)	return 0;


	int iTemp1(0);
	for (int i = 0; i < 3; i++)//대각형태 2
	{
		iTemp1 += arrTemp[2 - i][i];
	}
	if (iCom != iTemp1)	return 0;


	return 1;
}

int cal_min(vector<int> vinput,vector<int> vcompare)//2차원 벡터 두개 비교하는 함수입니다.
{
	int iTemp(0);
	for (int i = 0; i < vcompare.size();i++)
	{
		iTemp += abs(vinput[i] - vcompare[i]);
	}

	return iTemp;
}


int main()
{
	// Taking matrix in vector in rowise to make
	// calculation easy
	vector<int> vinput = { 5,3,4,1,5,8,6,4,2 };



	vector<vector<int>> vvTemp;
	//vector<vector<int>> vvTemp2;


	//for (int i = 0; i < 3; i++)
	//{
	//	vector<int> vinput;
	//	for (int j = (3*i); j < (3*i)+3; j++)
	//	{
	//		vinput.push_back(j);
	//	}
	//	vvTemp1.push_back(vinput);
	//}

	vector<int> vTemp;
	for (int i = 1; i <= 9; i++)
	{
		vTemp.push_back(i);
	}


	do
	{
		if (1 == find_magic_square(vTemp))
		{
			vvTemp.push_back(vTemp);
		}
	} while (next_permutation(vTemp.begin(), vTemp.end()));

	int Answer(999999999);
	
	for (int i = 0; i < vvTemp.size(); i ++)
	{
		Answer = min(Answer, cal_min(vinput, vvTemp[i]));
	}

	cout << Answer << endl;



	return 0;
}

[이문제 통해서]
1.
do
{
}while(next_permutation(vTemp.begin(),vTemp.end()));
순열조합 처리하기 까먹지말기

profile
내일 아침 눈을 떳을 때, '기대되는 오늘 하루를 만들기 위해' 나는 오늘도 생각하고 고민한다.

0개의 댓글