2016년 8월 18일 목요일

BOJ 1648 격자판 채우기

백준님의 강의자료를 보고 풀었다.
다시 한 번 풀어보면서, g+1해줘도 되지만, 경우에 따라 g+2 , s>>2를 해줘도 되는 경우가 있어서 그렇게 풀어봤는데, 예제의 답이 매우 큰 수가 나왔다. 그래서 그것을 g+1, s>>1이런 식으로 고치면 정답이 나온다... 도대체 왜 그럴까 거의 1시간을 고민하다가 아까 백준님의 소스 코드에서 본 기저사례 처리 방법이 기억이 났다. 아까 처음에 봤을 때는 별 차이 못느꼈는데 계속 틀리게 되어 차이를 알게 되었고, 왜 그렇게 기저 사례 처리를 하셨는지 알 수 있었다.

난 기저 사례 처리를 if(g==n*m) return (s==0); 이렇게 한다.
그런데 백준님은 if(g>=n*m)이 들어가있다. 바로 g+2, s>>2 같은 방식 때문이다. g+1, s>>1식으로 한 칸씩 본다면 g==n*m이 될 때가 오겠지만, 2칸씩 간다면 저 기저 사례 조건에 걸리지 않을 수 있기 때문이다. 그래서 매우 큰 엉뚱한 값이 나온 것이었다. 지금 생각해보니 무사히 종료한 것도 신기하다.


댓글 없음:

댓글 쓰기