바깥에 비가 내리고 내부는 습기가 꽉 차 있어서 후덥지근한 날이네요.^^
이번주와 다음주가 중학생들 기말고사 시험기간이라서..
대부분의 학생들이 기말고사 준비 하느라 학원에 안 나와서 오늘따라 많이도 한가 하네요.^^
그나마 오전에 우리 학원의 든든한 기둥이 얼굴 비춰 줘서 마음이 너무 편안해 지는데요...
그 학생은 알고리즘만 잘하는게 아니라 영어도 잘하는가 봅니다.
엊그제 원장님이 학교에 갔다가 그 학생이 영어 최우수상 받은 내역을 보았다네요.^^(보통 수학을 잘하는 학생이 영어를 잘 못한다는 제 인식이 있어서 인지 모르겠는데요)
그 학생 부모님은 어떻게 저렇게 아이를 잘 키웠을까? 존경심이 드는 하루네요...
(사실 공부만 잘하는게 아니라... 그 학생을 보면 공부는 둘째고 성실함과 품성이 너무 이쁜 아이랍니다.^^)
오후에는 학생들도 없고 올해 정보올림피아드 예선 문제를 풀어 보게 되었는데요~
2017년 정보올림피아드 예선 초등 22번 문제입니다.
char *A[5]={ ">_>^^<_<", "o_O||O_o", "\\(<<)//", "@-;--'--", "~[,_,]:3"}; int i,j,c=0; for(i=0;i<5;i++){ for(j=0;A[i][j];j++){} if(j==8)c++; } printf("%d\n",c); |
문제를 슬쩍 보면 5가 출력 되거든요.
A[5][9] 배열에 문자가 꽉꽉 차 있는 것처럼 보이거든요.
하지만 이렇게 쉽게 나오다니 하면서 5를 적는 순간 땡~~~ 종치는 소리를 듣게 됩니다.
문제는 A[2]행에 있는 "\\(<<)//", 입니다.
"\\" 에서 \ 은 이스케이프시퀀스라고 하며 특수문자로 \t 는 탭키를 \n 은 리턴키를 \\ 은 '\' 을 가르키게 되거든요.
그래서 "\\" 을 두개로 세는 순간 틀리게 됩니다.
그래서 정답은 4가 출력 됩니다.
그 외의 이스케이프시퀀스를 정리해 보면 다음과 같습니다.
위의 문제를 분석해 보면 다음과 같습니다.
char *A[5]={
">_>^^<_<",
"o_O||O_o",
"\\(<<)//",
"@-;--'--",
"~[,_,]:3"};
이문장은 다음과 같이 A[5][9] 배열을 잡아서 다음의 데이터를 초기화 합니다.
> |
_ |
> |
^ |
^ |
< |
_ |
< |
'\0' |
o |
_ |
O |
| |
| |
O |
_ |
o |
'\0' |
'\' |
( |
< |
< |
) |
/ |
/ |
'\0' |
|
@ |
- |
; |
- |
- |
' |
- |
- |
'\0' |
~ |
[ |
, |
_ |
, |
] |
: |
3 |
'\0' |
for(i=0;i<5;i++){
for(j=0;A[i][j];j++){}
if(j==8)c++;
}
이 문장에서
for(j=0;A[i][j];j++){} //이 문장은 A[i][j] 가 NULL(0,0x00,'/0') 이 아닌동안 j를 증가 시키고 빠져 나오게 됩니다.
따라서 i값이 0,1,3,4 인 경우에는 j가 8에서 끝나게 되어 c가 증가 되고요.
i값이 2에서는 j가 7이 되어 끝나게 됩니다.
따라서 c의 값은 4 가 됩니다.
언제 부터인가 조금만 신경을 안쓰게 되면 프로그램을 어느정도 한다고 하는 사람도 실수를 할 수 있게 유도하는 문제가 종종 출제되고 있네요...
학생들이 이런 부분을 세심하게 신경써서 좋은 결과를 낼 수 있게 알려 줘야 하니 제가 더 많이 공부해야 겠다는 생각 밖에 안 드네요~~~
'강의자료 > 정보영재' 카테고리의 다른 글
NYPC2016 예선문제]넥슨은 다람쥐를 뿌려라 문제 분석 해 봤어요. (6) | 2017.07.27 |
---|---|
2017년 정보올림피아드 지역대회 초등 39번 문제 풀어 봅니다. (4) | 2017.07.18 |
알고리즘 채점 사이트 정올(jungol.co.kr) 소개 (2) | 2017.06.23 |
소프트웨어 공부로 대학을 진학 할 수 있나요? (2) | 2017.06.09 |
제1회 소프트웨어(SW) 사고력 올림피아드 (2) | 2017.06.08 |