인프런 커뮤니티 질문&답변

yeon _leaf님의 프로필 이미지

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

7-O

7-O 질문입니다.

작성

·

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

큰돌님의 프로필 이미지
큰돌
지식공유자

2022. 12. 12. 13:45

음.. 예외처리라는 말이 좀 이해가 안가는데요. 이 문제에서 yeon님이 말씀하신 케이스(파빨파)가 예외가 된다고 말씀하시는건가요?

그러면 파란색 경우 > 빨간색 경우 > 파란색 경우를 다음의 지문에 따라 처리하면 되지 않나요? 굳이 그 케이스를 따로 뺄 이유가 있으실까요?

  • 빨간색인 경우에는 이동한 후에 A번 말과 그 위에 있는 모든 말의 쌓여있는 순서를 반대로 바꾼다.

    • A, B, C가 이동하고, 이동하려는 칸에 말이 없는 경우에는 C, B, A가 된다.

    • A, D, F, G가 이동하고, 이동하려는 칸에 말이 E, C, B로 있는 경우에는 E, C, B, G, F, D, A가 된다.

  • 파란색인 경우에는 A번 말의 이동 방향을 반대로 하고 한 칸 이동한다. 방향을 반대로 바꾼 후에 이동하려는 칸이 파란색인 경우에는 이동하지 않고 가만히 있는다.

0

yeon _leaf님의 프로필 이미지
yeon _leaf
질문자

2022. 12. 12. 14:27

사실 82~85줄 코드가 없어도 파-빨-파 케이스에서 이동 후에

if (nx < 1 || ny < 1 || nx > n || ny > n || chess[nx][ny] == 2) {
	ka[i].d = nd;
	continue;
} 

여기 continue문에 걸려서 방향만 바꾸고 다음 말로 넘어가야 한다고 생각합니다. 그런데 저기서 걸리지 않고 계속 진행이 되는 이유를 모르겠어서 그 케이스를 예외처리로 빼 버렸습니다.