[백준/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
'🧡 Programming > 💻 코딩 테스트' 카테고리의 다른 글
[백준/C++] 17142 연구소3 (BFS) (0) | 2023.02.18 |
---|---|
[백준/C++] 14500 테트로미노 (DFS) (0) | 2023.02.15 |
[SWEA/C++] 4615 재미있는 오셀로 게임 (DFS, 쉽고 짧은 코드) (0) | 2023.02.12 |
[ 백준/C++] 17472 다리만들기2 (삼성A형 기출문제,BFS,DFS 이용하기) (0) | 2023.02.12 |
[백준/C++] 7576번 토마토 (BFS기초문제, 방문체크 순서, vector 사용하면 안되는 이유) (0) | 2023.02.11 |