+++++++++++++++++ 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; }
댓글 없음:
댓글 쓰기