2011년 2월 5일 토요일

Diamond

 문제 : http://algospot.com/problems/read/DIAMOND

접근방법
특별한 스킬없이 막(?) 구현하였다.
문제를 풀면서 한 생각은... 이제 막 생각대로 프로그램 좀 짤 수 있겠다 싶은 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++;
     }
    }
   }
  }

댓글 없음:

댓글 쓰기