문제 :
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;
}