본문 바로가기

Algorithm

6109. 추억의 2048게임

반응형

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWbrg9uabZsDFAWQ&categoryId=AWbrg9uabZsDFAWQ&categoryType=CODE

 

SW Expert Academy

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

swexpertacademy.com

 

다른 공과 부딪혔을 때 같은 크기가 아닌경우 그 이후 좌표에 공이 들어가야 하는데 그 이후 좌표가 자신의 기존 좌표랑 다른 경우에만 수행 따라서 부딪히고 크기 다른데 그 이후좌표가 자신과 같다면 그냥 break

 

#include<iostream>
#include<string.h>
#include<string>
using namespace std;


string str;
int arr[20][20];
bool visit[20][20];
int N;

void up()
{
	memset(visit, 0, sizeof(visit));
	for (int j = 0; j < N; j++)
	{
		for (int i = 0; i < N; i++)
		{
			if (arr[i][j])
			{
				int idx = i - 1;
				bool flag = false;
				while (idx >= 0)
				{
					if (arr[idx][j])
					{
						flag = true;
						if (arr[idx][j] == arr[i][j] && !visit[idx][j])
						{
							visit[idx][j] = true;
							arr[idx][j] *= 2;
							arr[i][j] = 0;
							break;
						}
						else 
						{
							if (idx + 1 != i)
							{
								arr[idx + 1][j] = arr[i][j];
								arr[i][j] = 0;
							}
							break;
						}
					}
					else
					{
						idx--;
					}
					
				}
				idx++;
				if (!flag && idx != i)
				{
					arr[idx][j] = arr[i][j];
					arr[i][j] = 0;
				}
			}
		}
	}
}

void down()
{
	memset(visit, 0, sizeof(visit));
	for (int j = 0; j < N; j++)
	{
		for (int i = N-1; i >= 0; i--)
		{
			if (arr[i][j])
			{
				int idx = i + 1;
				bool flag = false;
				while (idx < N)
				{
					if (arr[idx][j])
					{
						flag = true;
						if (arr[idx][j] == arr[i][j] && !visit[idx][j])
						{
							visit[idx][j] = true;
							arr[idx][j] *= 2;
							arr[i][j] = 0;
							break;
						}
						else 
						{
							if (idx - 1 != i)
							{
								arr[idx - 1][j] = arr[i][j];
								arr[i][j] = 0;
							}
							break;
						}
					}
					else
					{
						idx++;
					}
					
				}
				idx--;
				if (!flag && idx != i)
				{
					arr[idx][j] = arr[i][j];
					arr[i][j] = 0;
				}
			}
		}
	}
}

void left()
{
    memset(visit, 0, sizeof(visit));
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < N; j++)
		{
			if (arr[i][j])
			{
				int idx = j - 1;
				bool flag = false;
				while (idx >= 0)
				{
					if (arr[i][idx])
					{
						flag = true;
						if (arr[i][idx] == arr[i][j] && !visit[i][idx])
						{
							visit[i][idx] = true;
							arr[i][idx] *= 2;
							arr[i][j] = 0;
							break;
						}
						else 
						{
							if (idx + 1 != j)
							{
								arr[i][idx + 1] = arr[i][j];
								arr[i][j] = 0;
							}
							
							break;
						}
					}
					else
					{
						idx--;
					}
					
				}
				idx++;
				if (!flag && idx != j)
				{
					arr[i][idx] = arr[i][j];
					arr[i][j] = 0;
				}
			}
		}
	}
}

void right()
{
    memset(visit, 0, sizeof(visit));
	for (int i = 0; i < N; i++)
	{
		for (int j = N-1; j >= 0; j--)
		{
			if (arr[i][j])
			{
				int idx = j + 1;
				bool flag = false;
				while (idx < N)
				{
					if (arr[i][idx])
					{
						flag = true;
						if (arr[i][idx] == arr[i][j] && !visit[i][idx])
						{
							visit[i][idx] = true;
							arr[i][idx] *= 2;
							arr[i][j] = 0;
							break;
						}
						else 
						{
							if (idx - 1 != j)
							{
								arr[i][idx - 1] = arr[i][j];
								arr[i][j] = 0;
							}
							break;
						}
					}
					else
					{
						idx++;
					}
					
				}
				idx--;
				if (!flag && idx != j)
				{
					arr[i][idx] = arr[i][j];
					arr[i][j] = 0;
				}
			}
		}
	}
}

int main(int argc, char** argv)
{
	int test_case;
	int T;

	cin >> T;
	/*
	   여러 개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
	*/
	for (test_case = 1; test_case <= T; ++test_case)
	{
		cin >> N >> str;

		for (int i = 0; i < N; i++)
		{
			for (int j = 0; j < N; j++)
			{
				cin >> arr[i][j];
			}
		}

		if (str == "up")
		{
			up();
		}
		else if (str == "down")
		{
			down();
		}
		else if (str == "left")
		{
			left();
		}
		else if (str == "right")
		{
			right();
		}

		cout << "#" << test_case << endl;
		for (int i = 0; i < N; i++)
		{
			for (int j = 0; j < N; j++)
			{
				cout << arr[i][j] << " ";
			}
			cout << endl;
		}
	}
	return 0;//정상종료시 반드시 0을 리턴해야합니다.
}
반응형

'Algorithm' 카테고리의 다른 글

4301. 콩 많이 심기  (0) 2020.04.29
4050. 재관이의 대량 할인  (0) 2020.04.28
5432. 쇠막대기 자르기  (0) 2020.04.26
2019 KAKAO BLIND RECRUITMENT실패율  (0) 2020.04.24
6731. 홍익이의 오델로 게임  (0) 2020.04.24