[C#] 낚시왕

소슬잎·2024년 10월 25일

백준 문제

https://www.acmicpc.net/problem/17143

1. 후기

구현 문제는 구현 문제인게 보인다. 그냥 텍스트가 너무 많다. 목표 시간은 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초 걸리는 코드 한 줄이...

2. 실행 결과

3. 코드

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);
    }
}
profile
그냥 바보

0개의 댓글