Programming/Baekjoon

백준 1063 c++ [킹]

fishersheep 2022. 5. 4. 15:08
반응형
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <queue>
#include <stack>

using namespace std;

int map[8][8];	//체스판
string str, str2, od;	//킹의위치입력, 돌의위치입력, 움직이는정보
int n;	//움직이는횟수
vector<pair<int, int>>v(2);	//킹,돌의 좌표저장할 vector


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

	cin >> str >> str2 >> n;

	for (int i = 0; i < str.length(); i++)	//킹의위치 저장, 좌표상 0,0 은 체스판으로 8,a
	{
		if (i == 0)
		{	
			int idx = 0;
			for (char j = 'A'; j <= 'H'; j++)	//가로좌표값 , A B C -> 0 1 2 ...
			{
				if (str[i] == j)
					v[0].second = idx;
				
				idx++;
			}
		}
		else
		{	
			int temp = str[i] - '0';	//세로좌표값, 입력값이 1이면 -> 좌표상 7 
			v[0].first = 8 - temp;
		}
	}

	for (int i = 0; i < str2.length(); i++)	//돌의위치 저장
	{
		if (i == 0)
		{
			int idx = 0;
			for (char j = 'A'; j <= 'H'; j++)
			{
				if (str2[i] == j)
					v[1].second = idx;

				idx++;
			}
		}
		else
		{
			int temp = str2[i] - '0';
			v[1].first = 8 - temp;
		}
	}
	

	for (int i = 0; i < n; i++)	//움직이는정보에 따라 킹과 돌의 위치 이동
	{
		cin >> od;

		if (od == "R")	//오른쪽
		{	
			if (v[0].second + 1 < 8)	//킹이 이동했을때 범위를 벗어나지않는다면
			{
				v[0].second++;	//킹위치변경

				if (v[0].first == v[1].first && v[0].second == v[1].second)	//킹과 돌의 위치가 같아진다면
				{
					if (v[1].second + 1 < 8)	//돌의위치가 범위를 벗어나지않는다면 돌의 위치 변경
						v[1].second++;
					else
						v[0].second--;	//돌의위치가 범위를 벗어난다면 킹위치 원상복구
				}
			}
		}
		else if (od == "L")	//왼쪽
		{
			if (v[0].second - 1 >= 0)
			{
				v[0].second--;

				if (v[0].first == v[1].first && v[0].second == v[1].second)
				{
					if (v[1].second - 1 >= 0)
						v[1].second--;
					else
						v[0].second++;
				}
			}
		}
		else if (od == "B")	//아래
		{
			if(v[0].first + 1 < 8)
			{
				v[0].first++;

				if (v[0].first == v[1].first && v[0].second == v[1].second)
				{
					if (v[1].first + 1 < 8)
						v[1].first++;
					else
						v[0].first--;
				}
			}
		}
		else if (od == "T")	//위로
		{
			if (v[0].first -1 >= 0)
			{
				v[0].first--;

				if (v[0].first == v[1].first && v[0].second == v[1].second)
				{
					if (v[1].first -1  >= 0)
						v[1].first--;
					else
						v[0].first++;
				}
			}
		}
		else if (od == "RT")	//오른쪽위대각선
		{
			if (v[0].first - 1 >= 0 && v[0].second+1<8)
			{
				v[0].first--;
				v[0].second++;

				if (v[0].first == v[1].first && v[0].second == v[1].second)
				{
					if (v[1].first - 1 >= 0 && v[1].second + 1 < 8)
					{
						v[1].first--;
						v[1].second++;
					}
					else
					{
						v[0].first++;
						v[0].second--;
					}
				}
			}
		}

		else if (od == "LT")	//왼쪽위대각선
		{
			if (v[0].first - 1 >= 0 && v[0].second - 1 >= 0)
			{
				v[0].first--;
				v[0].second--;

				if (v[0].first == v[1].first && v[0].second == v[1].second)
				{
					if (v[1].first - 1 >= 0 && v[1].second - 1 >= 0)
					{
						v[1].first--;
						v[1].second--;
					}
					else
					{
						v[0].first++;
						v[0].second++;
					}
				}
			}
		}

		else if (od == "RB")	//오른쪽아래대각선
		{
			if (v[0].first + 1 < 8 && v[0].second + 1 < 8)
			{
				v[0].first++;
				v[0].second++;

				if (v[0].first == v[1].first && v[0].second == v[1].second)
				{
					if (v[1].first + 1 < 8 && v[1].second + 1 < 8)
					{
						v[1].first++;
						v[1].second++;
					}
					else
					{
						v[0].first--;
						v[0].second--;
					}
				}
			}
		}

		else if (od == "LB")	//왼쪽아래대각선
		{
			if (v[0].first + 1 < 8 && v[0].second - 1 >= 0)
			{
				v[0].first++;
				v[0].second--;

				if (v[0].first == v[1].first && v[0].second == v[1].second)
				{
					if (v[1].first + 1 < 8 && v[1].second - 1 >= 0)
					{
						v[1].first++;
						v[1].second--;
					}
					else
					{
						v[0].first--;
						v[0].second++;
					}
				}
			}
		}
		
	}

	vector<string>strVec(2);

	for (int i = 0; i < 2; i++)	//현재좌표값을 다시 알파벳과 숫자로 변환
	{	
		char chTemp = 'A';

		for (int j=0;j<8;j++)
		{
			if (v[i].second == j)
				strVec[i] += chTemp;

			chTemp++;
		}

		int nuTemp = 8 - v[i].first;

		strVec[i] += to_string(nuTemp);

	}

	for (int i = 0; i < 2; i++)	//결과출력
		cout << strVec[i] << '\n';

	return 0;
}

 

후기

한번에 풀긴 풀었는데 시간도 좀 걸리고 너무 지저분하게 푼 것 같았다. 다른사람의 코드를 참고해서 효율적인 방법을 찾아봐야겠다. 

반응형

'Programming > Baekjoon' 카테고리의 다른 글

백준 16943 c++ [숫자재배치]  (0) 2022.05.05
백준 1527 c++ [금민수의개수]  (0) 2022.05.04
[백준] 2667 단지번호붙이기 c++  (0) 2022.05.03
[백준] 7569 토마토 c++  (0) 2022.05.03
[백준] 7576 토마토 c++  (0) 2022.05.02