2011년 2월 12일 토요일

706 : LCD Display

문제 : http://goo.gl/fynA1

+++++++++++++++++ WA문제 해결 ++++++++++++++++++++++++++++++++++++++++++++++++++++
큰 문제는 아니었다. 근본적인 문제에 해당한다고 봐야 하나...
LCD양식으로 표시하는 number 배열의 SIZE가 너무 작아서 WA판정을 받았던 것이었다.
이 문제점을 찾게 해준 알고스팟의 helloneo님께 감사를 표한다.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

왜 계속 WA가 뜨는지 도저히 모르겠다.
(출력문제 인것같아 다음 사항은 이미 모두 체크해보았다.)
- Minesweeper와 같은 한 줄 더 추가해서 문제가 생기는지 여부
- 00000001234 input시 1234로 출력
- 마지막 숫자 출력 후 1줄 띄워져 있는지 여부

로직은 다음과 같다.
1. 숫자를 string으로 받는다.
2. 첫번째값이 0이고, 길이가 1이 아닌경우 첫번째 값을 pop()하는 작업을 while() loop로 돌린다. ( 숫자앞에 0 제거)
3. 숫자가 필요한 size만큼 space를 채운다.( s+3열, 2s+3행 ) - s+3열인  이유는 문자사이마다 1줄의 공백이 들어가기 때문이다. 그리고 마지막 문자의 경우는 s+2열만 space로 채워서 마지막 숫자 출력하고 공백1줄이 들어가지 않는다.
4. 숫자가 출력될 공간의 가장 왼쪽 위지점을 함수로 넘겨서 숫자에 따라 달라지는 Seven Segment에 따라 '-'또는 '|'를 출력한다. (이미 공백이 위치한 값을 '-' 또는 '|'로 바꿔주는 것이다.) : 자료형은 char[][] 이다.
5. char[][] 배열을 출력한다.

소스의 자잘한 실수가 있는건지 WA가 계속나온다.. 소스를 짜는 시간의 몇배인 4시간 가까이 찾아보고,, 다른사람의 소스를 보고, 실행시켜 비교해봐도 WA인 이유를 모르겠다..
누군가 시원하게 답변해주길 기다린다..



while(cin >> s >> input)
 {
  int i, j, k;
  char number[23][SIZE]={};
  if( s==0 && input.length()==1 && input[0]=='0') break;
  
  // 숫자 앞의 0제거
  while(input[0]=='0' && input.length()!=1) input.erase(0,1);
  
  for(i=0; i<input.length(); i++)
  {
   // space로 필요한 공간만큼 채우고
   int tmp = i*(s+3)+s+3;
   if( i==input.length()-1) tmp--;
   for(j=0; j<2*s+3; j++)
   {
    for(k=i*(s+3); k<tmp; k++)
     number[j][k] = ' ';
   }
   // 숫자별로 Seven Segment 적용
   if( input[i]=='0')
   {
    top(number, 0, i*(s+3), s);
    bottom(number, 0, i*(s+3), s);
    left_up(number, 0, i*(s+3), s);
    left_down(number, 0, i*(s+3), s);
    right_up(number, 0, i*(s+3), s);
    right_down(number, 0, i*(s+3), s);
   }
   else if( input[i]=='1')
   {
    right_up(number, 0, i*(s+3), s); 
    right_down(number, 0, i*(s+3), s);
   }
   else if( input[i]=='2')
   {
    top(number, 0, i*(s+3), s); 
    right_up(number, 0, i*(s+3), s);
    middle(number, 0, i*(s+3), s);
    left_down(number, 0, i*(s+3), s);
    bottom(number, 0, i*(s+3), s);
   }
   else if( input[i]=='3')
   {
    top(number, 0, i*(s+3), s);
    middle(number, 0, i*(s+3), s);
    bottom(number, 0, i*(s+3), s);
    right_up(number, 0, i*(s+3), s);
    right_down(number, 0, i*(s+3), s);
   }
   else if( input[i]=='4')
   {
    left_up(number, 0, i*(s+3), s);
    right_up(number, 0, i*(s+3), s);
    middle(number, 0, i*(s+3), s);
    right_down(number, 0, i*(s+3), s);
   }
   else if( input[i]=='5')
   {
    top(number, 0, i*(s+3), s);
    left_up(number, 0, i*(s+3), s);
    middle(number, 0, i*(s+3), s);
    right_down(number, 0, i*(s+3), s);
    bottom(number, 0, i*(s+3), s);
   }
   else if( input[i]=='6')
   {
    top(number, 0, i*(s+3), s);
    left_up(number, 0, i*(s+3), s);
    left_down(number, 0, i*(s+3), s);
    middle(number, 0, i*(s+3), s);
    right_down(number, 0, i*(s+3), s);
    bottom(number, 0, i*(s+3), s);
   }
   else if( input[i]=='7')
   {
    top(number, 0, i*(s+3), s);
    right_up(number, 0, i*(s+3), s);
    right_down(number, 0, i*(s+3), s);
   }
   else if( input[i]=='8')
   {
    top(number, 0, i*(s+3), s);
    middle(number, 0, i*(s+3), s);
    bottom(number, 0, i*(s+3), s);
    left_up(number, 0, i*(s+3), s);
    left_down(number, 0, i*(s+3), s);
    right_up(number, 0, i*(s+3), s);
    right_down(number, 0, i*(s+3), s);
   }
   else if( input[i]=='9')
   {
    top(number, 0, i*(s+3), s);
    middle(number, 0, i*(s+3), s);
    bottom(number, 0, i*(s+3), s);
    left_up(number, 0, i*(s+3), s);
    right_up(number, 0, i*(s+3), s);
    right_down(number, 0, i*(s+3), s);
   }
  }

  //Output
  if(cnt) cout << endl;
  for(int i=0; i<2*s+3; i++)
  {
   cout << number[i]<<  endl;
  }
  //cout << endl;
  cnt++;
 }

아래는 Seven Segment 부분을 채워주는 함수 이다.

void top(char num[][SIZE], int x, int y, int size) // up
{
 for(int i=1; i<1+size; i++) num[x][y+i] = CHARV;
}
void left_up(char num[][SIZE], int x, int y, int size) // left-up
{
 for(int i=1; i<1+size; i++) num[x+i][y] = CHARH;
}
void left_down(char num[][SIZE], int x, int y, int size) // left-down
{
 for(int i=size+2; i<2*size+2; i++) num[x+i][y] = CHARH;
}
void right_up(char num[][SIZE], int x, int y, int size) // right-up
{
 for(int i=1; i<1+size; i++) num[x+i][y+size+1] = CHARH;
}
void right_down(char num[][SIZE], int x, int y, int size) // right-down
{
 for(int i=size+2; i<2*size+2; i++) num[x+i][y+size+1] = CHARH;
}
void middle(char num[][SIZE], int x, int y, int size) // middle
{
 for(int i=1; i<1+size; i++) num[x+size+1][y+i] = CHARV;
}
void bottom(char num[][SIZE], int x, int y, int size) // down
{
 for(int i=1; i<1+size; i++) num[x+2*size+2][y+i] = CHARV;
}

댓글 없음:

댓글 쓰기