시뮬레이션 문제입니다.
어떻게 움직여야하는 지는 문제 꼼꼼히 읽어보면 아실테니
그것보다는 푸시면서 신경써야할 예외케이스에 대해 말하겠습니다.
1. DFS로 푸시든 BFS로 푸시든 매 상태의 2차원 그래프는 서로 분리되어 있어야 합니다.
그냥 매 깊이 갈 때 마다 copy를 하시든, 아니면 가공하고 다시 원상복귀를 하시든
매 상태는 구분되어야 합니다.
즉 탐색하고 빠져나오면 다시 원래 상태에서 다음 탐색을 시작해야된다는 의미입니다.
이게 머릿속에서 꼬이시면 시뮬레이션은 답이 없습니다.
2. 물고기들이 이동하는 시점을 처리할 때 각 물고기는 한 번만 이동해야 합니다.
저 같은 경우는 그냥 2차원 배열 다 뒤지면서 숫자 작은 것부터 이동시켰는데요.
//BAD case
for (int num = 1; num <= 16; ++num)
{
for (int i = 0; i < MAP_SIZE; ++i)
{
for (int j = 0; j < MAP_SIZE; ++j)
{
if (map[i][j].num == num)
{
}
}
}
}
이 때 이동 여부를 표시하는 bool isChanged 같은 플래그가 없다면 문제가 될 수 있습니다.
예를 들어, 1번 물고기가 (1,1)에 있다가 (2,2)로 간 경우,
제가 푼 방식으로는 2차원 배열을 다 뒤지기 때문에 (1,1) 갔다가 나중에 (2,2)가서
숫자가 1인 물고기가 또 있으니 얘가 또 움직이도록 할 것입니다.
이런 식으로 자신이 푼 방식에 대해 문제점을 빨리 캐치하셔야 합니다.
//GOOD case
for (int num = 1; num <= 16; ++num)
{
boolean isChanged = false;
for (int i = 0; i < MAP_SIZE; ++i)
{
for (int j = 0; j < MAP_SIZE; ++j)
{
if (map[i][j].num == num && isChanged == false)
{
isChanged == true;
}
}
}
}
코드: github.com/cottory/algorithm/blob/master/BOJ/BOJ19236.cc
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ]18223번: 민준이와 마산 그리고 건우 (0) | 2020.09.21 |
---|---|
[BOJ]4485번: 녹색 옷 입은 애가 젤다지? (0) | 2020.09.18 |
[BOJ]9205번: 맥주 마시면서 걸어가기 (0) | 2020.09.13 |
[BOJ]1389번: 케빈 베이컨의 6단계 법칙 (0) | 2020.09.12 |
[BOJ]1613번: 역사 (0) | 2020.09.11 |