ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 - 낚시왕 (17143) [C++]
    문제 풀이/백준 2023. 3. 26. 20:34
    반응형

     이 문제는 시뮬레이션 문제로 주어진 순서에 맞춰 구현하면 되지만, 구현이 매우 어렵다. 이 문제에서 가장 어려운 부분은 상어가 움직이는 것인데, 한 상어가 움직인 후 바로 맵에 저장하면 다음 상어가 움직임에서 잘못된 결과가 나오게 된다. 그러므로 모든 상어의 다음 좌표를 따로 저장해둔 뒤, 그 배열을 순회하면서 상어를 맵에 올려놓는 방식으로 구현하면 정답이 나오게 된다. 맵의 경우 구조체로 상어를 만든 뒤, 그 구조체의 2차원 배열로 구현했다.

     

    #include <iostream>
    #include <queue>
    using namespace std;
    
    #define MAX 100
    
    #define UP 1
    #define DOWN 2
    #define RIGHT 3
    #define LEFT 4
    
    typedef struct _shark
    {
    	int y;
    	int x;
    	int speed;
    	int direction;
    	int size;
    } shark;
    
    typedef struct _coor
    {
    	int y;
    	int x;
    	int direction;
    } coor;
    
    int r, c, m;
    shark board[MAX + 1][MAX + 1];
    
    coor up(int, int, int);
    coor down(int, int, int);
    coor right(int, int, int);
    coor left(int, int, int);
    
    coor up(int y, int x, int speed)
    {
    	coor result;
    
    	int tempY = y;
    
    	while (true)
    	{
    		if (speed == 0)
    		{
    			break;
    		}
    		if (tempY == 1)
    		{
    			break;
    		}
    
    		speed--;
    		tempY--;
    	}
    
    	if (speed > 0)
    	{
    		return down(tempY, x, speed);
    	}
    
    	result = { tempY, x, UP };
    
    	return result;
    }
    
    coor down(int y, int x, int speed)
    {
    	coor result;
    
    	int tempY = y;
    
    	while (true)
    	{
    		if (speed == 0)
    		{
    			break;
    		}
    		if (tempY == r)
    		{
    			break;
    		}
    
    		speed--;
    		tempY++;
    	}
    
    	if (speed > 0)
    	{
    		return up(tempY, x, speed);
    	}
    
    	result = { tempY, x, DOWN };
    
    	return result;
    }
    
    coor right(int y, int x, int speed)
    {
    	coor result;
    
    	int tempX = x;
    
    	while (true)
    	{
    		if (speed == 0)
    		{
    			break;
    		}
    		if (tempX == c)
    		{
    			break;
    		}
    
    		speed--;
    		tempX++;
    	}
    
    	if (speed > 0)
    	{
    		return left(y, tempX, speed);
    	}
    
    	result = { y, tempX, RIGHT };
    
    	return result;
    }
    
    coor left(int y, int x, int speed)
    {
    	coor result;
    
    	int tempX = x;
    
    	while (true)
    	{
    		if (speed == 0)
    		{
    			break;
    		}
    		if (tempX == 1)
    		{
    			break;
    		}
    
    		speed--;
    		tempX--;
    	}
    
    	if (speed > 0)
    	{
    		return right(y, tempX, speed);
    	}
    
    	result = { y, tempX, LEFT };
    
    	return result;
    }
    
    shark move(shark temp)
    {
    	int y = temp.y;
    	int x = temp.x;
    	board[y][x] = { 0,0,0,0,0 };
    
    	int direction = temp.direction;
    	coor next;
    
    	switch (direction)
    	{
    	case UP:
    		next = up(y, x, temp.speed);
    		break;
    	case DOWN:
    		next = down(y, x, temp.speed);
    		break;
    	case RIGHT:
    		next = right(y, x, temp.speed);
    		break;
    	case LEFT:
    		next = left(y, x, temp.speed);
    		break;
    	}
    
    	temp.direction = next.direction;
    	temp.y = next.y;
    	temp.x = next.x;
    	
    	return temp;
    }
    
    int main()
    {
    	ios_base::sync_with_stdio(0);
    	cin.tie(0);
    
    	cin >> r >> c >> m;
    
    	for (int i = 0; i < m; i++)
    	{
    		int a, b, c, d, e;
    
    		cin >> a >> b >> c >> d >> e;
    
    		shark temp = { a, b, c, d, e };
    		board[a][b] = temp;
    	}
    
    	int result = 0;
    	// 1. 이동
    	for (int sec = 1; sec <= c; sec++)
    	{
    		// 2. 상어 잡기
    		for (int y = 1; y <= r; y++)
    		{
    			if (board[y][sec].y != 0)
    			{
    				result += board[y][sec].size;
    				board[y][sec] = { 0, 0, 0, 0, 0 };
    				break;
    			}
    		}
    		
    		vector<shark> temp;
    		// 3. 상어 이동
    		for (int y = 1; y <= r; y++)
    		{
    			for (int x = 1; x <= c; x++)
    			{
    				if (board[y][x].y != 0)
    				{
    					temp.push_back(move(board[y][x]));
    				}
    			}
    		}
    
    		for (auto i : temp)
    		{
    			if (board[i.y][i.x].y != 0)
    			{
    				if (i.size > board[i.y][i.x].size)
    				{
    					board[i.y][i.x] = i;
    				}
    			}
    			else
    			{
    				board[i.y][i.x] = i;
    			}
    		}
    	}
    
    	cout << result << '\n';
    
    	return 0;
    }
    반응형

    '문제 풀이 > 백준' 카테고리의 다른 글

    백준 - 9019 [C++]  (0) 2023.07.18
    백준 - 게리맨더링 2 (17779) [C++]  (0) 2023.03.27
    백준 - 톱니바퀴 (14891) [C++]  (0) 2023.03.26
    백준 - 2048 (Easy) (12100) [C++]  (2) 2023.03.25
    백준 - 뱀 (3190) [C++]  (0) 2023.03.25
Designed by Tistory.