작성
·
346
·
수정됨
0
안녕하세요 선생님!
http://boj.kr/3c22c999557b40eb917d73182dcd2cc0
위의 코드는 통과한 코드인데 통과 후 선생님 코드와 비교해보면서 보다가 궁금한 점이 생겨 질문드립니다.
제 코드의 82 ~ 85번째 줄에서
if (nx == cx && ny == cy && chess[nx][ny] == 1) {
ka[i].d = nd;
continue;
}
이 부분을 넣은 이유는 아래의 경우 때문입니다.
4 3
0 0 0 0
0 2 1 2
0 0 0 0
0 0 0 0
2 3 2
1 3 3
3 3 3
이렇게 파랑 - 빨강 - 파랑 순으로 놓여있을 때
첫 번째 턴에서 (2, 3) 자리에 0 1 2 번째 말이 있게 되고 0번째 말의 방향이 변경됩니다.
그리고 다음 턴에서 0번째 말이 움직일 때 움직일 칸이 파란색 칸이기 때문에 현재 칸이 빨간색이더라도 말의 순서가 뒤집히면 안 됩니다.
82 ~ 85번째 줄을 넣지 않으면 이때 말의 순서가 뒤집혀서 2 1 0 순이 되는 문제점이 있었습니다.
선생님 코드에서는 이 부분을 직접적으로 예외처리 하지 않는 듯한데 어떻게 저 케이스에서 정상적으로 작동하는지 궁금합니다.
저거 찾느라 몇 시간을 쓰다 보니 저런 예외처리를 따로 안 해도 되는 방법이 있다면 좋을 것 같아서 질문드립니다.
답변 2
1
음.. 예외처리라는 말이 좀 이해가 안가는데요. 이 문제에서 yeon님이 말씀하신 케이스(파빨파)가 예외가 된다고 말씀하시는건가요?
그러면 파란색 경우 > 빨간색 경우 > 파란색 경우를 다음의 지문에 따라 처리하면 되지 않나요? 굳이 그 케이스를 따로 뺄 이유가 있으실까요?
빨간색인 경우에는 이동한 후에 A번 말과 그 위에 있는 모든 말의 쌓여있는 순서를 반대로 바꾼다.
A, B, C가 이동하고, 이동하려는 칸에 말이 없는 경우에는 C, B, A가 된다.
A, D, F, G가 이동하고, 이동하려는 칸에 말이 E, C, B로 있는 경우에는 E, C, B, G, F, D, A가 된다.
파란색인 경우에는 A번 말의 이동 방향을 반대로 하고 한 칸 이동한다. 방향을 반대로 바꾼 후에 이동하려는 칸이 파란색인 경우에는 이동하지 않고 가만히 있는다.
0
사실 82~85줄 코드가 없어도 파-빨-파 케이스에서 이동 후에
if (nx < 1 || ny < 1 || nx > n || ny > n || chess[nx][ny] == 2) {
ka[i].d = nd;
continue;
}
여기 continue문에 걸려서 방향만 바꾸고 다음 말로 넘어가야 한다고 생각합니다. 그런데 저기서 걸리지 않고 계속 진행이 되는 이유를 모르겠어서 그 케이스를 예외처리로 빼 버렸습니다.