[백준/C++] 17143번 낚시왕 (반례 케이스)

2023. 2. 11. 00:01🧡 Programming/💻 코딩 테스트

문제 자체는 어렵지 않은데 코딩을 할 때 좀 잘 생각해야 하는 문제이다. 

 

시뮬레이션 문제이고 낚시왕이 1번 열의 한 칸 왼쪽에서 오른쪽까지 이동하면 멈추므로 낚시왕의 위치를 기준으로 시뮬레이션을 실행하면 된다. 

 

특히 상어의 위치에 대해서 잘 생각 해야 하는 문제이다. 

 

죽은 상어를 먹고 있지 않은 지 생각해야 한다. 

 

또한, 새로 이동한 상어가 전에 있던 상어의 위치로 옮겨 갈 때(?) 위치 정보가 올바르게 저장되는 지도 잘 따져보자.

 

나는 개인적으로 어떤 정보를 담고있는 물체(상어)라면 struct를 사용하는 것을 애용한다. 

한 번에 모든 정보를 담기 쉽고 접근성이 좋기 때문이다. 

#define _CRT_SECURE_NO_WARNINGS
#define ABS(A,B) A>B? A-B: B-A
#include <stdio.h>
#include <vector>
#include <queue>
#include <algorithm>
#include <cstring>
int dx[4] = { 0,0,1,-1 };
int dy[4] = { -1,1,0,0 };
int map[105][105];
int Y, X, M;
struct info { int y, x, sp, dir, size, alive; };
std::vector<info> shark;
int changeDir(int a) {
	if (a == 0) return 1;
	else if (a == 1) return 0;
	else if (a == 2) return 3;
	else return 2;
}
int main() {
	scanf("%d %d %d", &Y, &X, &M);
	int r, c, s, d, z;
	for (int i = 0; i < M; i++) {
		scanf("%d %d %d %d %d", &r, &c, &s, &d, &z);
		if (d == 1 || d == 2) { s = s % ((Y - 1) * 2); }
		else if (d == 3 || d == 4) { s = s % ((X - 1) * 2); }
		shark.push_back({ r,c,s,d - 1,z,true });
		map[r][c] = z;
	}

	int time = 1;
	int ans = 0;
	if (shark.size() == 0) {
		printf("0");
		return 0;
	}

	while (time <= X) {

		for (int y = 1; y <= Y; y++) {
			if (map[y][time] != 0) {
				ans += map[y][time];
				for (int i = 0; i < shark.size(); i++) {
					if (!shark[i].alive) continue;
					if (shark[i].y == y && shark[i].x == time) {
						shark[i].alive = false;
						break;
					}
				}
				break;
			}
		}

		//std::vector<info> nxt_shark;
		memset(map, 0, sizeof(map));
		for (int i = 0; i < shark.size(); i++) {
			if (!shark[i].alive) continue;

			int ny = shark[i].y, nx = shark[i].x;
			for (int tt = 1; tt <= shark[i].sp; tt++) {
				ny = shark[i].y + dy[shark[i].dir];
				nx = shark[i].x + dx[shark[i].dir];
				if (ny > Y || nx > X || ny < 1 || nx < 1) {
					shark[i].dir = changeDir(shark[i].dir);
					ny = shark[i].y + dy[shark[i].dir];
					nx = shark[i].x + dx[shark[i].dir];
				}
				shark[i].y = ny; shark[i].x = nx;
			}
			shark[i].y = ny; shark[i].x = nx;
			//nxt_shark.push_back({ ny,nx,shark[i].sp,shark[i].dir,shark[i].size });

			if (map[ny][nx] == 0) map[ny][nx] = shark[i].size;
			else {
				if (map[ny][nx] < shark[i].size) {//원래있던애죽임
					for (int j = 0; j < shark.size(); j++) {
						if (shark[j].alive && shark[j].size == map[ny][nx]) {
							shark[j].alive = false;
							break;
						}
					}
					map[ny][nx] = shark[i].size;
				}
				else if (map[ny][nx] > shark[i].size) {//내가죽음
					shark[i].alive = false;
				}
			}

		}

		time++;
	}
	printf("%d", ans);
	return 0;
}

백준에 반례정리 글을 올린 적이 있는데 현재 좋아요가 13개 있다😊(뿌듯)

 

반례 확인하시 분들은 아래 더보기를 확인 해 주세요

더보기

in:
10 10 2
1 9 8 2 1
5 10 7 4 2

out:
0

in:
4 2 2
2 2 3 1 1
4 2 3 1 2

out:
2

in:
2 5 1
1 5 1 3 1

out:
1


100 7 7
3 2 2 3 9
3 3 1 3 3
3 5 1 4 7
3 6 2 4 6
2 4 1 2 8
1 4 2 2 4
4 4 1 1 5
   
correct answer = 0;


in:
5 5 1
1 4 10 3 1

out:
0