https://www.acmicpc.net/problem/17143
구현 문제는 구현 문제인게 보인다. 그냥 텍스트가 너무 많다. 목표 시간은 40분이었는데 한 30분 더 초과한 느낌이라 슬프다.
상어 클래스를 열심히 만든거 같고 뿌듯해서 올렸는데, 지금보니까 정작 솔루션 부분 코드는 개판으로 만든거 같아서 별루인듯.
여담으로 뭐가 틀렸는지 30분이나 찾고 있었는데
if (tempShark[pos.Item1, pos.Item2].z < shark.z)
{
tempShark[pos.Item1, pos.Item2].isDead = true;
tempShark[pos.Item1, pos.Item2] = shark;
}
else
{
// 이 부분
shark.isDead = true;
}
상어 도착해서 잡아먹는거만 생각하고 상어가 도착해서 잡아 먹히는건 생각 안해놓은게 문제였음... 추가하는데 5초 걸리는 코드 한 줄이...
using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Collections;
class Baekjoon
{
enum DIR
{
UP = 1,
DOWN = 2,
RIGHT = 3,
LEFT = 4
}
public int rMax;
public int cMax;
private class Shark
{
public static int cMax;
public static int rMax;
public int r;
public int c;
public int s;
public int z;
public bool isDead = false;
public DIR d;
public Shark(int r, int c, int s, int d, int z)
{
this.r = r;
this.c = c;
this.s = s;
this.z = z;
switch (d)
{
case 1: this.d = DIR.UP; break;
case 2: this.d = DIR.DOWN; break;
case 3: this.d = DIR.RIGHT; break;
case 4: this.d = DIR.LEFT; break;
}
}
public (int, int) MoveOneStep()
{
MoveOneStepCustom(s);
return (r, c);
}
public void MoveOneStepCustom(int speedTmp)
{
if (d == DIR.UP)
{
if (speedTmp <= r)
{
r -= speedTmp;
}
else
{
var tmep = speedTmp - r;
r = 0;
d = DIR.DOWN;
MoveOneStepCustom(tmep);
}
}
else if (d == DIR.DOWN)
{
if (r + speedTmp < rMax)
{
r += speedTmp;
}
else
{
var temp = speedTmp - (rMax - r - 1);
r = rMax - 1;
d = DIR.UP;
MoveOneStepCustom(temp);
}
}
else if (d == DIR.LEFT)
{
if (speedTmp <= c)
{
c -= speedTmp;
}
else
{
var tmep = speedTmp - c;
c = 0;
d = DIR.RIGHT;
MoveOneStepCustom(tmep);
}
}
else
{
if (c + speedTmp < cMax)
{
c += speedTmp;
}
else
{
var temp = speedTmp - (cMax - c - 1);
c = cMax - 1;
d = DIR.LEFT;
MoveOneStepCustom(temp);
}
}
}
}
private void Solution(int r, int c, int sharkLen, Shark[] sharks)
{
var answer = 0;
for (var fishingKingIndex = 0; fishingKingIndex < c; fishingKingIndex++)
{
Shark closeShark = null;
foreach (var shark in sharks)
{
if (shark.isDead) continue;
if (shark.c == fishingKingIndex)
{
if (closeShark == null)
{
closeShark = shark;
}
else if (closeShark.r > shark.r)
{
closeShark = shark;
}
}
}
if (closeShark != null)
{
closeShark.isDead = true;
answer += closeShark.z;
}
var tempShark = new Shark[r, c];
foreach (var shark in sharks)
{
if (shark.isDead) continue;
var pos = shark.MoveOneStep();
if (tempShark[pos.Item1, pos.Item2] == null)
{
tempShark[pos.Item1, pos.Item2] = shark;
}
else
{
if (tempShark[pos.Item1, pos.Item2].z < shark.z)
{
tempShark[pos.Item1, pos.Item2].isDead = true;
tempShark[pos.Item1, pos.Item2] = shark;
}
else
{
shark.isDead = true;
}
}
}
}
Console.WriteLine(answer);
}
static void Main(string[] args)
{
var tmp = Console.ReadLine()!.Split(' ').Select(int.Parse).ToArray();
var sharks = new Shark[tmp[2]];
Shark.rMax = tmp[0];
Shark.cMax = tmp[1];
for (var i = 0; i < tmp[2]; i++)
{
var data = Console.ReadLine()!.Split(' ').Select(int.Parse).ToArray();
sharks[i] = new Shark(data[0] - 1, data[1] - 1, data[2], data[3], data[4]);
}
new Baekjoon().Solution(tmp[0], tmp[1], tmp[2], sharks);
}
}