[17143] 낚시왕

2 minute read

풀이

  1. 5개의 int로 구성된 tuple로 풀었더니 너무 느리다. struct를 사용해서 풀이를 작성하자.
typedef struct _shark{
    int y;
    int x;
    int speed;
    int dir;
    int size;
    bool alive;
} Shark;
  1. tuple(int,int,int)map[101][101]로 하니까 매번 tie(a,b,c)를 해줘야해서 너무 느리다. int map[i][j]에는 크기가 k인 물고기가 위치한다고 배열을 저장하자.

  2. 아주 맘에 드는 풀이 https://www.acmicpc.net/source/14212010

내 코드

정답이지만, 3시간 만에 맞췄고, 느리다. ㅠㅠ tuple 개느리네 하.

#include <cstdio>
#include <vector>
#include <tuple>
#include <algorithm>
#include <cstring>
using namespace std;
#define UP 1
#define DOWN 2
#define RIGHT 3
#define LEFT 4
int dx[] = { -1,1,0,0};
int dy[] = { 0,0,1,-1};
int r = 0, c = 0, m = 0;
int x = 0, y = 0, s = 0, d = 0, z = 0;
long long ans = 0;

tuple<int, int, int> map[101][101];
bool check[101][101];

void printShark(void) {
	for (int i = 1; i <= r; i++) {
		for (int j = 1; j <= c; j++) {
			if (check[i][j]) printf("1 ");
			else printf("0 ");
		}
		printf("\n");
	}
}

int main(void) {
	scanf("%d%d%d", &r, &c, &m);
	for (int i = 0; i < m; i++) {
		scanf("%d%d%d%d%d", &x, &y, &s, &d, &z);
		map[x][y] = make_tuple(s, d, z);
		check[x][y] = true;
	}
	//사람의 위치
	int ts = 0, td = 0, tz = 0;
	for (int man = 1; man <= c; man++) {
		//printf("상어 잡기 전\n");
		//printShark();
		//가까운 상어 잡기
		for (int row = 1; row <= r; row++) {
			if (check[row][man]) {
				tie(ts, td, tz) = map[row][man];
				ans += tz;
				check[row][man] = false;
				map[row][man] = tuple<int, int, int>();
				break;
			}
		}
		//printf("상어 잡은 후\n");
		//printShark();
		//상어 움직이기
		int nx = 0, ny = 0;
		vector<tuple<int, int, int, int, int> > v;
		vector<tuple<int, int, int, int, int> >::iterator it;
		for (int row = 1; row <= r; row++) {
			for (int col = 1; col <= c; col++) {
				if (check[row][col]) {
					tie(ts, td, tz) = map[row][col];
					map[row][col] = tuple<int, int, int>();
					check[row][col] = false;
					nx = row; ny = col;
					//printf("%d, %d에서 ", nx, ny);
					//printf(" ts %d마큼 움직여서  ", ts);
					//움직여야하는 만큼
					for (int idx = 0; idx < ts; idx++) {
						//방향 바꾸기
						if (nx + dx[td - 1] <1 || nx + dx[td - 1] > r) {
							if (td == UP) td = DOWN;
							else td = UP;
						}
						if (ny + dy[td - 1] <1 || ny + dy[td - 1] > c) {
							if (td == LEFT) td = RIGHT;
							else td = LEFT;
						}
						//움직이기
						nx += dx[td - 1];
						ny += dy[td - 1];
					}
					//printf("%d, %d으로 \n", nx, ny);
					v.push_back(make_tuple(nx,ny,ts,td,tz));
				}
			}
		}

		//전체 초기화
		for (int i = 1; i <= r; i++) {
			for (int j = 1; j <= c; j++) {
				map[i][j] = tuple<int, int, int>();
				check[i][j] = false;
			}
		}
		//상어 위치 그리기
		for (it = v.begin(); it != v.end(); it++) {
			tie(nx, ny, ts, td, tz) = *it;
			if(!check[nx][ny]) map[nx][ny] = make_tuple(ts, td, tz);
			else {
				int as = 0, ad = 0, az = 0;
				tie(as, ad, az) = map[nx][ny];
				if (tz > az) {
					map[nx][ny] = make_tuple(ts, td, tz);
				}
			}
			check[nx][ny] = true;
		}
		//printf("움직인 후\n");
		//printShark();
	}
	printf("%lld\n", ans);
	return 0;
}