ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 이것이 코딩테스트다 - 4) 구현
    알고리즘 2021. 1. 21. 20:05

     

     

    깃허브에 올리는게 11일만이라서 너무 민망...😂

    죄책감 어쩔 것이여...😭

     

     

    아예 안한건 아니고 자바기초를 다시 보고 스프링 강의를 시작해서 그런거다. (그러하다)

     

    알고리즘도 빼지 말고 다시 달리자!

     

     

    4.1) 상하좌우

    #include <iostream>
    #include <vector>
    #include <cstring>
    #include <algorithm>
    #include <climits>
    #include <string>
    
    using namespace std;
    
    int n;
    string A;
    int x = 1;
    int y = 1;
    
    int dx[4] = { 0,0,-1,1 };
    int dy[4] = { -1,1,0,0 };
    
    char movetypes[4] = { 'L', 'R', 'U', 'D' };
    
    int main() {
    
    	cin >> n;
    	cin.ignore();//버퍼 비우기
    
    	getline(cin, A);
    	for (int i = 0; i < A.length(); i++)
    	{
    		int nx;
    		int ny;
    		for (int j = 0; j < 4; j++)
    		{
    			if (A[i] == movetypes[j])
    			{
    				nx = x + dx[j];
    				ny = y + dy[j];
    			}
    		}
    		if (nx <1 || nx > n || ny <1 || ny > n)
    			continue;
    		x = nx;
    		y = ny;
    	}
    	cout << "(" << x << "," << y << ")" << endl;
    
    
    
    
    
    
    
    
    	/* 처음에 짠 코드
    	int n;
    	string A;
    	int Now[2] = { 1, 1 };
    	cin >> n;
    	cin >> A;
    	for (int i = 0; i < A.length(); i++)
    	{
    		if (A[i] == 'L')
    		{
    			if (Now[1] - 1 < 1)
    				continue;
    			Now[1] -= 1;
    		}
    		else if (A[i] == 'R')
    		{
    			if (Now[1] + 1 < n)
    				continue;
    			Now[1] += 1;
    		}
    		else if (A[i] == 'U')
    		{
    			if (Now[0] - 1 < 1)
    				continue;
    			Now[0] -= 1;
    		}
    		else
    		{
    			if (Now[0] + 1 < n)
    				continue;
    			Now[0] += 1;
    		}
    	}
    	cout << "(" << Now[0] << "," << Now[1] << ")" << endl;
    	*/
    	return 0;
    }
    

     

     

     

    4.2) 시각

    #include <iostream>
    #include <vector>
    #include <cstring>
    #include <algorithm>
    #include <climits>
    #include <string>
    
    using namespace std;
    
    int h, cnt;
    
    bool Check(int h, int m, int s)
    {
    	if (h % 10 == 3 || m / 10 == 3 || m % 10 == 3 || s / 10 == 3 || s % 10 == 3)
    		return true;
    	return false;
    }
    
    
    int main() {
    	cin >> h;
    	for (int i = 0; i <= h; i++)
    	{
    		for (int j = 0; j < 60; j++)
    		{
    			for (int k = 0; k < 60; k++)
    			{
    				if (Check(i, j, k))
    					cnt++;
    			}
    		}
    	}
    	cout << cnt << endl;
    
    
    	return 0;
    }
    

     

     

     

    4.3) 왕실의 나이트

    #include <iostream>
    #include <vector>
    #include <cstring>
    #include <algorithm>
    #include <climits>
    #include <string>
    
    using namespace std;
    
    
    int dx[8] = { 2, -2, 2, -2, 1, -1, 1, -1 };
    int dy[8] = { -1, -1, 1, 1, 2, 2, -2, -2 };
    
    
    
    int main() {
    	int cnt = 0;
    	string Now;
    	cin >> Now;
    	int x = (int)Now[0] - 97;
    	int y = (int)Now[1] - 49;
    
    	for (int i = 0; i < 8; i++)
    	{
    		int nx = x + dx[i];
    		int ny = y + dy[i];
    		if (nx < 0 || ny < 0 || nx>7 || ny>7)
    			continue;
    		cnt++;
    	}
    	cout << cnt << endl;
    
    
    
    	return 0;
    }

     

     

     

    4.4) 게임 개발

    이 부분은 예제문제가 더 있으면 확인 가능할 텐데, 내가 푼 방법으로도 정답이 나오긴 했다. 

    정답을 보니 같은 의미인 것 같아서 굳이 수정하지 않았다. 

    #include <iostream>
    #include <vector>
    #include <cstring>
    #include <algorithm>
    #include <climits>
    #include <string>
    
    using namespace std;
    
    
    int dx[4] = { 0, 1, 0, -1 };//북, 동, 남, 서
    int dy[4] = { -1, 0, 1, 0 };
    
    
    
    int main() {
    	int n, m, cnt = 1;
    	cin >> n >> m;
    
    	int x, y, direction;
    	cin >> x >> y >> direction;//현재위치 정보와 방향을 입력받는다. 
    
    	int Land[51][51];//땅의 정보를 받을 공간
    
    	for (int i = 0; i < n; i++)
    	{
    		for (int j = 0; j < m; j++)
    			cin >> Land[i][j];
    	}
    	Land[x][y] = 1;//시작한 공간은 방문한 공간으로 다시 갈 수 없으므로 바다로 만든다. 
    
    	while (true)
    	{
    		bool flag = false;
    		for (int i = 0; i < 4; i++)//4방향으로 
    		{
    			direction -= 1;// 방향을 왼쪽으로 돌린다. 
    			if (direction < 0) direction += 4;
    			int nx = x + dx[direction];
    			int ny = y + dy[direction];
    			if (Land[nx][ny] == 0)//만약 왼쪽으로 돌린 방향으로 갈 수 있다면
    			{
    				x = nx; //이동한 후에 
    				y = ny;
    				flag = true;// 이동하는데 성공했다는 표시를 남기고 
    				Land[nx][ny] = 1;//방문한 곳으로 표시한다. 
    				cnt++;
    				break;
    			}
    		}
    		if (!flag)//만약 이동하지 못했다면 
    		{
    			if (Land[x - dx[direction]][y - dy[direction]] != 0) break;//뒤쪽으로 이동해보는데 이동할 수 없다면 그대로 종료한다. 
    			else {//만약 이동이 가능하다면 뒤쪽으로 이동하고 다시 시작한다. 
    				x -= dx[direction];
    				y -= dy[direction];
    				Land[x - dx[direction]][y - dy[direction]] = 1;//간 곳은 방문 표시해준다. 
    				cnt++;
    			}
    		}
    	}
    	cout << cnt << endl;
    
    	return 0;
    }

     

     

     

    ✨방향문제가 나오면 방향 배열을 짜서 더하는 쪽으로 간다. 

     

     

     

     

     

Designed by Tistory.