ps 일기

250821 연습

azber 2025. 8. 21. 10:49

요즘 팀연습을 안 하고 랜덤디펜스를 하는 중이다.

 

다사다난한 랜덤디펜스였다. 랜덤디펜스 하면서 문제풀이와 관련해서 몇 가지 생각을 하게 되었다.

 

시간이 상대적으로 느껴진다

  • 대략적인 문제 풀이를 떠올릴 때는 시간이 굉장히 느리게 간다. 문제 풀이 생각하다가 아 진짜 큰일났다 싶어서 시계 보면 10분만 흘려가있다.
  • 문제 풀이의 구체화를 할 때는 시간이 정말 빠르게 흘러간다. 복잡한 풀이의 구체화를 할 때는 20분이 호다닥 간다.
  • 문제 풀이의 구체화를 잘 했으면 구현을 하는데는 시간이 오래 걸리지 않는다. 코딩이 오래 걸리는 이유는 중간에 계획이 틀어져서 그렇다
  • 디버깅하는 시간, 풀이가 틀려서 갈아엎는 시간은 정말정말 빨리간다. 0분이면 해결되었을 것이 20~30분 가니까 시간이 아깝다. Costly Binary Search를 이 시간 때문에 말아먹었다.

풀이 검증의 중요성

앞에서 말했듯이, 갈아엎는 시간이 정말 크다. 그래서 원큐에 모든 것을 다 확정하고 가는 것이 좋다. 풀이 만들면서 대충 될 것 같은데 증명은 잘 모르겠는 것들은 시간을 잡고 증명을 하는 것이 좋다. 시간복잡도도 대략적으로 하고 넘어가지 말고 일일히 계산해주는게 좋다.

구현 구체화

이제는 하나의 flow 그래프를 만들게 되었다. 각 컴포넌트가 만드는 값들을 적고, 필요한 함수들을 적었다. 

scpc 2차 예선 3번 갈어엎기 전 풀이

보통은 1페이지~2페이지 초반 안에 깔끔하게 정리가 된다. 위와 같은 경우는 갈아엎기 전 풀이로, 170줄 짜다가 솔브 수를 보고 이상함을 깨달아서 다른 풀이를 생각하기 시작했다.

코드가 100줄 넘어가면 눈디버깅은 어렵다

랜덤디펜스 하면서 보면 코드가 길어졌을 때 눈으로 틀린 점을 찾은 경우는 거의 없고, 대충 만든 예제가 틀려서 역추적해서 찾는 경우가 더 많았다. icpc때는 프린트 디버깅을 해야 되는데 어떻게 해야 될지 아직 해답을 찾지 못했다. 문제마다 좀 큰 예제를 직접 만드는 것도 나쁘지 않은 선택지인 것 같다. 풀이를 만들 때 구현을 최대한 간단하게 하고 가는 것도 좋은 것 같다.

마무리

랜덤디펜스 전략 관련해서 이야기를 좀 했다. 대회 때 구현을 조금 더 잘하는 나로 성장했으면 좋겠다.