접근방법
특별한 스킬없이 막(?) 구현하였다.
문제를 풀면서 한 생각은... 이제 막 생각대로 프로그램 좀 짤 수 있겠다 싶은 1학년학생들 기죽이기 좋은 문제(? -_-;;)인듯하다. 'k!=0'이때문에 나온 WA가 날 포기하게 만들어서 거진 2~3주만에 부활시켜서 AC받아낸 문제..
내 소스의 단점은 다이아몬드를 점점 키우면서 검사하는데 같은 위치에서 size 1 -> 3 -> 5 ... 이렇게 늘어날 경우 테두리만 check하면 되지만, 귀차니즘으로...ㅠ Diamond 내부까지 다 검사하게 코딩했다. (TLE걱정할 문제도 아니고, Response Time도 괜찮게 나와서 궃이 수정하지 않았다.)
소스를 보면 중첨코딩으로 인해서 for문이 무려 4중첩이 되있지만 적절한 cutting으로 효율은 그리 나쁘지 않다.
위에서 언급한 k!=0 이거 찾아서 고치느라 소스 곳곳에 상세히 주석을 달았는데.. 보는사람에게 많은 도움을 줄듯하다.; (솔직히 for문장이 겹쳐서 소스보기 힘들지모르지만 주석을 보면 어느정도 이해가 가실듯...)
// 열 size를 구함 int row=0; for(int i=0; pan[0][i]!=0; i++) row++; //pan 순회 for(int i=0; i<size; i++) { for(int j=0; j<row; j++) { if( pan[i][j] == '#' ) { int k; if( max == 0 ) max=1; //더 큰 다이아가 나올수 없는 행이면 종료 if( i+max > size ) break; // 엄밀히 말하면 i+2*max-1 >size 이다. (궃이안바꿨다.) bool flag=false; while( true ) { // Diamond 확장루틴 // 세로방향(행) #판단 반복문 for(k=1; k<max+1; k++) { // 가로방향(열)으로 # 판단 반복문 // max를 아직 ++하기 전이기때문에 2k+1을 살핀다. for(int l=0; l<2*k+1; l++) { // Array Index Underflow Handle if( j-k+l < 0) { flag=true; break; } // #이 아닌경우 max확장 실패 if( pan[i+k][j-k+l]!= '#' ) { flag=true; break; } } if( flag ) break; } if( flag ) break; // Diamond 축소루틴 int bk=k; k--; // k가 1부터 시작했기 때문에 축소루틴에서는 1만큼 빼주고 시작 while( k!=0 ) { k--; for(int l=0; l<2*k+1; l++) { // Array Index Underflow Handle if( j-k+l < 0) { flag=true; break; } // #이 아닌경우 max확장 실패 if( pan[i+bk][j-k+l] != '#' ) { flag=true; break; } } if( flag ) break; bk++; } if( flag ) break; max++; } } } }
댓글 없음:
댓글 쓰기