Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Star/조현태: Difference between revisions

From ZeroWiki
imported>qa22ahj
No edit summary
 
(Table transclusion repair v1)
 
(One intermediate revision by one other user not shown)
Line 6: Line 6:
약간 느리다!!  
약간 느리다!!  
빠르게 할 방법이 전혀 생각 안나는건 아니지만.. 오늘은 바쁜 일이 있어서 ^^ 나가봐야하는 관계로..
빠르게 할 방법이 전혀 생각 안나는건 아니지만.. 오늘은 바쁜 일이 있어서 ^^ 나가봐야하는 관계로..
나~~~~~~~~~~중에 언젠가 시간나고 할일없으면 속도 개선해서 올리겠다.^^
나12:46, 27 March 2026 (UTC)12:46, 27 March 2026 (UTC)중에 언젠가 시간나고 할일없으면 속도 개선해서 올리겠다.^^
....... 일이있다는 핑계로 귀차니즘을 무마하는....켁;; (생각하기 귀차너~)
....... 일이있다는 핑계로 귀차니즘을 무마하는....켁;; (생각하기 귀차너~)
바빠도 음악넣어주는 정도의 센스~!
바빠도 음악넣어주는 정도의 센스~!
<embed src="http://zerowiki.dnip.net/~undinekr/lunia_ost1.mp3">
<!-- MONIWIKI HTML BLOCK START -->
=== 소스코드 ===
<embed src="http://zerowiki.dnip.net/~undinekr/lunia_ost1.mp3">
<!-- MONIWIKI HTML BLOCK END -->
[[DeadLink]]
=== 소스코드 ===
  #include &lt;iostream&gt;
  #include &lt;iostream&gt;
  #include &lt;map&gt;
  #include &lt;map&gt;
Line 48: Line 51:
   
   
  map&lt;SavePoint, int&gt;points;
  map&lt;SavePoint, int&gt;points;
  vector&lt;SavePoint&gt; lines[12];
  vector&lt;SavePoint&gt; lines&#91;12&#93;;
  int bigNumber[12];
  int bigNumber&#91;12&#93;;
   
   
  vector&lt;SavePoint&gt; calculatePoint[10];
  vector&lt;SavePoint&gt; calculatePoint&#91;10&#93;;
   
   
  bool isCanPut = FALSE;
  bool isCanPut = FALSE;
Line 73: Line 76:
  if (isCanPut &amp;&amp; minimumNumber &lt; sum)
  if (isCanPut &amp;&amp; minimumNumber &lt; sum)
  return FALSE;
  return FALSE;
  for (register int i = 0; i &lt; (int)calculatePoint[bigNumber[number]].size(); ++i)
  for (register int i = 0; i &lt; (int)calculatePoint&#91;bigNumber&#91;number&#93;&#93;.size(); ++i)
  {
  {
  for (register int j = 0; j &lt; (int)lines[number].size(); ++j)
  for (register int j = 0; j &lt; (int)lines&#91;number&#93;.size(); ++j)
  {
  {
  if (calculatePoint[bigNumber[number]][i] == lines[number][j])
  if (calculatePoint&#91;bigNumber&#91;number&#93;&#93;&#91;i&#93; == lines&#91;number&#93;&#91;j&#93;)
  {
  {
  IsItCan(number + 1, sum);
  IsItCan(number + 1, sum);
Line 84: Line 87:
  }
  }
  }
  }
  for (register int i = 0; i &lt; (int)lines[number].size(); ++i)
  for (register int i = 0; i &lt; (int)lines&#91;number&#93;.size(); ++i)
  {
  {
  if (bigNumber[number] &lt;= points[lines[number][i]])
  if (bigNumber&#91;number&#93; &lt;= points&#91;lines&#91;number&#93;&#91;i&#93;&#93;)
  {
  {
  bool isInSame = FALSE;
  bool isInSame = FALSE;
  for (register int j = 0; j &lt; 10 &amp;&amp; FALSE == isInSame; ++j)
  for (register int j = 0; j &lt; 10 &amp;&amp; FALSE == isInSame; ++j)
  {
  {
  for (register int k = 0; k &lt; (int)calculatePoint[j].size(); ++k)
  for (register int k = 0; k &lt; (int)calculatePoint&#91;j&#93;.size(); ++k)
  {
  {
  if (calculatePoint[j][k] == lines[number][i])
  if (calculatePoint&#91;j&#93;&#91;k&#93; == lines&#91;number&#93;&#91;i&#93;)
  {
  {
  isInSame = TRUE;
  isInSame = TRUE;
Line 102: Line 105:
  if (FALSE == isInSame)
  if (FALSE == isInSame)
  {
  {
  calculatePoint[bigNumber[number]].push_back(lines[number][i]);
  calculatePoint&#91;bigNumber&#91;number&#93;&#93;.push_back(lines&#91;number&#93;&#91;i&#93;);
  IsItCan(number + 1, sum + bigNumber[number]);
  IsItCan(number + 1, sum + bigNumber&#91;number&#93;);
  calculatePoint[bigNumber[number]].pop_back();
  calculatePoint&#91;bigNumber&#91;number&#93;&#93;.pop_back();
  }
  }
  }
  }
Line 126: Line 129:
  }
  }
   
   
  const int START_POINT_Y[4] = {0, 1, 2, 2};
  const int START_POINT_Y&#91;4&#93; = {0, 1, 2, 2};
  const int END_POINT_Y[4] = {6, 6, 7, 8};
  const int END_POINT_Y&#91;4&#93; = {6, 6, 7, 8};
   
   
  const int START_POINT_Z[4] = {1, 1, 1, 0};
  const int START_POINT_Z&#91;4&#93; = {1, 1, 1, 0};
   
   
  void GetXYZ(int calculateNumber, int i, int j, int k, int&amp; x, int&amp; y, int&amp; z, int&amp; number)
  void GetXYZ(int calculateNumber, int i, int j, int k, int&amp; x, int&amp; y, int&amp; z, int&amp; number)
Line 178: Line 181:
  for (register int i = 0; i &lt; 12; ++i)
  for (register int i = 0; i &lt; 12; ++i)
  {
  {
  cin &gt;&gt; bigNumber[i];
  cin &gt;&gt; bigNumber&#91;i&#93;;
  }
  }
   
   
  for (register int i = 2; i &lt; 6; ++i)
  for (register int i = 2; i &lt; 6; ++i)
  {
  {
  int j = START_POINT_Y[i - 2];
  int j = START_POINT_Y&#91;i - 2&#93;;
  int k = START_POINT_Z[i - 2];
  int k = START_POINT_Z&#91;i - 2&#93;;
  int x, y, z, number;
  int x, y, z, number;
  while (j &lt; END_POINT_Y[i - 2])
  while (j &lt; END_POINT_Y&#91;i - 2&#93;)
  {
  {
  for (register int calculateNumber = 0; calculateNumber &lt; 3; ++calculateNumber)
  for (register int calculateNumber = 0; calculateNumber &lt; 3; ++calculateNumber)
  {
  {
  GetXYZ(calculateNumber, i, j, k, x, y, z, number);
  GetXYZ(calculateNumber, i, j, k, x, y, z, number);
  if (!(4 &gt; i &amp;&amp; j == START_POINT_Y[i - 2]))
  if (!(4 &gt; i &amp;&amp; j == START_POINT_Y&#91;i - 2&#93;))
  {
  {
  if (points.end() == points.find(SavePoint(x, y, z)))
  if (points.end() == points.find(SavePoint(x, y, z)))
  points[SavePoint(x, y, z)] = bigNumber[number];
  points&#91;SavePoint(x, y, z)&#93; = bigNumber&#91;number&#93;;
  else if (points[SavePoint(x, y, z)] &gt; bigNumber[number])
  else if (points&#91;SavePoint(x, y, z)&#93; &gt; bigNumber&#91;number&#93;)
  points[SavePoint(x, y, z)] = bigNumber[number];
  points&#91;SavePoint(x, y, z)&#93; = bigNumber&#91;number&#93;;
  lines[number].push_back(SavePoint(x, y, z));
  lines&#91;number&#93;.push_back(SavePoint(x, y, z));
  }
  }
  if (!(4 &lt;= i &amp;&amp; j == END_POINT_Y[i - 2] - 1))
  if (!(4 &lt;= i &amp;&amp; j == END_POINT_Y&#91;i - 2&#93; - 1))
  {
  {
  ChangeXYZ(x, y, z, calculateNumber);
  ChangeXYZ(x, y, z, calculateNumber);
  if (points.end() == points.find(SavePoint(x, y, z)))
  if (points.end() == points.find(SavePoint(x, y, z)))
  points[SavePoint(x, y, z)] = bigNumber[number];
  points&#91;SavePoint(x, y, z)&#93; = bigNumber&#91;number&#93;;
  else if (points[SavePoint(x, y, z)] &gt; bigNumber[number])
  else if (points&#91;SavePoint(x, y, z)&#93; &gt; bigNumber&#91;number&#93;)
  points[SavePoint(x, y, z)] = bigNumber[number];
  points&#91;SavePoint(x, y, z)&#93; = bigNumber&#91;number&#93;;
  lines[number].push_back(SavePoint(x, y, z));
  lines&#91;number&#93;.push_back(SavePoint(x, y, z));
  }
  }
  }
  }
Line 217: Line 220:
  if (0 == i % 4 || 3 == i % 4)
  if (0 == i % 4 || 3 == i % 4)
  {
  {
  Swap(lines[i][0], lines[i][5]);
  Swap(lines&#91;i&#93;&#91;0&#93;, lines&#91;i&#93;&#91;5&#93;);
  Swap(lines[i][1], lines[i][6]);
  Swap(lines&#91;i&#93;&#91;1&#93;, lines&#91;i&#93;&#91;6&#93;);
  Swap(lines[i][2], lines[i][7]);
  Swap(lines&#91;i&#93;&#91;2&#93;, lines&#91;i&#93;&#91;7&#93;);
  }
  }
  else
  else
  {
  {
  Swap(lines[i][0], lines[i][7]);
  Swap(lines&#91;i&#93;&#91;0&#93;, lines&#91;i&#93;&#91;7&#93;);
  }
  }
  }
  }
Line 234: Line 237:
----
----
[[Star]]
[[Star]]

Latest revision as of 12:46, 27 March 2026

Star/조현태

느낀점 및 소감

모처럼 아침에 일찍일어나서.. 아침운동삼아 풀어보려고 했던게 화근..T.T 복잡해 보였던 만큼... 복잡했다~!! 이게뭐닝.. 그래서.............. 약간 느리다!! 빠르게 할 방법이 전혀 생각 안나는건 아니지만.. 오늘은 바쁜 일이 있어서 ^^ 나가봐야하는 관계로.. 나12:46, 27 March 2026 (UTC)12:46, 27 March 2026 (UTC)중에 언젠가 시간나고 할일없으면 속도 개선해서 올리겠다.^^ ....... 일이있다는 핑계로 귀차니즘을 무마하는....켁;; (생각하기 귀차너~) 바빠도 음악넣어주는 정도의 센스~! <embed src="http://zerowiki.dnip.net/~undinekr/lunia_ost1.mp3"> DeadLink

소스코드

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

using namespace std;

#define FALSE 0
#define TRUE 1

struct SavePoint{
	int x;
	int y;
	int z;
	SavePoint(int inputX, int inputY, int inputZ)
	{
		x = inputX;
		y = inputY;
		z = inputZ;
	}
	bool operator == (const SavePoint& target) const
	{
		return x == target.x && y == target.y && z == target.z;
	}
	bool operator < (const SavePoint& target) const
	{
		if (x == target.x && y == target.y && z < target.z)
			return true;
		if (x == target.x && y < target.y)
			return true;
		if (x < target.x)
			return true;
		return false;
	}
};

map<SavePoint, int>points;
vector<SavePoint> lines[12];
int bigNumber[12];

vector<SavePoint> calculatePoint[10];

bool isCanPut = FALSE;
int minimumNumber = 0;

int Calculate(int number);

bool IsItCan(int number = 0, int sum = 0)
{
	if (12 == number)
	{
		if (FALSE == isCanPut)
		{
			minimumNumber = sum;
        	isCanPut = TRUE;
		}
		else if (minimumNumber > sum)
			minimumNumber = sum;
		return TRUE;
	}
	if (isCanPut && minimumNumber < sum)
		return FALSE;
	for (register int i = 0; i < (int)calculatePoint[bigNumber[number]].size(); ++i)
	{
		for (register int j = 0; j < (int)lines[number].size(); ++j)
		{
			if (calculatePoint[bigNumber[number]][i] == lines[number][j])
			{
				IsItCan(number + 1, sum);
			}

		}
	}
	for (register int i = 0; i < (int)lines[number].size(); ++i)
	{
		if (bigNumber[number] <= points[lines[number][i]])
		{
			bool isInSame = FALSE;
			for (register int j = 0; j < 10 && FALSE == isInSame; ++j)
			{
				for (register int k = 0; k < (int)calculatePoint[j].size(); ++k)
				{
					if (calculatePoint[j][k] == lines[number][i])
					{
						isInSame = TRUE;
						break;
					}
				}
			}
			if (FALSE == isInSame)
			{
				calculatePoint[bigNumber[number]].push_back(lines[number][i]);
				IsItCan(number + 1, sum + bigNumber[number]);
				calculatePoint[bigNumber[number]].pop_back();
			}
		}
	}
	if (isCanPut)
		return TRUE;
	return FALSE;
}

int GetMinimum()
{
	return minimumNumber;
}

int GetMaximum()
{
	int sum = 0;
	for (map<SavePoint, int>::iterator i = points.begin(); i != points.end(); ++i)
		sum += (*i).second;
	return sum;
}

const int START_POINT_Y[4] = {0, 1, 2, 2};
const int END_POINT_Y[4] = {6, 6, 7, 8};

const int START_POINT_Z[4] = {1, 1, 1, 0};

void GetXYZ(int calculateNumber, int i, int j, int k, int& x, int& y, int& z, int& number)
{
	if (0 == calculateNumber)
	{
		x = i; y = j; z = k;
		number = i - 2;
	}
	else if (1 == calculateNumber)
	{
		x = 7 - k; y = i; z = j;
		number = i + 2;
	}
	else if (2 == calculateNumber)
	{
		x = 7 - j; y = 7 - k; z = i;
		number = i + 6;
	}
}

void ChangeXYZ(int& x, int& y, int& z, int calculateNumber)
{
	if (0 == calculateNumber)
	{
		++z;
	}
	else if (1 == calculateNumber)
	{
		--x;
	}
	else if (2 == calculateNumber)
	{
		--y;
	}
}

void Swap(SavePoint& one, SavePoint& another)
{
	SavePoint temp = one;
	one = another;
	another = temp;
}

void main()
{
	printf("5 7 8 9 6 1 9 0 9 8 4 6 <- 요게 기본. 이대로 처보아요~/ \n");
	for (register int i = 0; i < 12; ++i)
	{
		cin >> bigNumber[i];
	}

	for (register int i = 2; i < 6; ++i)
	{
		int j = START_POINT_Y[i - 2];
		int k = START_POINT_Z[i - 2];
		int x, y, z, number;
		while (j < END_POINT_Y[i - 2])
		{
			for (register int calculateNumber = 0; calculateNumber < 3; ++calculateNumber)
			{
				GetXYZ(calculateNumber, i, j, k, x, y, z, number);
				if (!(4 > i && j == START_POINT_Y[i - 2]))
				{
					if (points.end() == points.find(SavePoint(x, y, z)))
						points[SavePoint(x, y, z)] = bigNumber[number];
					else if (points[SavePoint(x, y, z)] > bigNumber[number])
						points[SavePoint(x, y, z)] = bigNumber[number];
					lines[number].push_back(SavePoint(x, y, z));
				}
				if (!(4 <= i && j == END_POINT_Y[i - 2] - 1))
				{
					ChangeXYZ(x, y, z, calculateNumber);
					if (points.end() == points.find(SavePoint(x, y, z)))
						points[SavePoint(x, y, z)] = bigNumber[number];
					else if (points[SavePoint(x, y, z)] > bigNumber[number])
						points[SavePoint(x, y, z)] = bigNumber[number];
					lines[number].push_back(SavePoint(x, y, z));
				}
			}
			++j;
			++k;
		}
	}
	for (register int i = 0; i < 10; ++i)
	{
		if (0 == i % 4 || 3 == i % 4)
		{
			Swap(lines[i][0], lines[i][5]);
			Swap(lines[i][1], lines[i][6]);
			Swap(lines[i][2], lines[i][7]);
		}
		else
		{
			Swap(lines[i][0], lines[i][7]);
		}
	}

	if (IsItCan())
		cout << GetMinimum() << " " << GetMaximum() << endl;
	else
		cout << "NO SOLUTION" << endl;
}

Star