본문 바로가기

대외활동/TNS Internship

100201 TNS Korea Internship (35/53)

2월이 밝았다.
저번주 금요일에 다하지 못한 IncAtLeast의 해결에 들어간다.


1. 

IncAtLeast(qid, getPrecodeSet, getNum) 함수가 자꾸 true를 반환한다. 
하나하나 logic을 따라가보기로 한다.
single 문항은 .CODED에서 true를 반환하기에 첫번째 if문으로 들어가게 된다.
test 1. ArrayToSet 함수는 제대로 원하는 값을 반환해주는가? return 기능은 당연히 정상이었다. 그렇다면?
test 2. answerArr 로 들어가는 값? 정상. single 에서 체크된 precode의 array가 들어가고 있었다.
test 3. 내가 만든 ArrayToSet 함수가 제 값을 도출하지 않는다? 이게 신빙성 있는데, for문의 ShowAlert 가 전혀 동작하질 못하는 걸로 봐서 for문에 진입 자체를 못 하는 듯. 해결.
test 4. Set으로 변환도 잘 됐는데, 잘못된 값을 넣어도 마지막엔 true가 된다. 왜?
test 5. getNum이 1이다?

찾았다!!
마지막에 내 set과 범위로 잡아넣은 getPrecodeSet과의 교집합의 원소를 비교해서
true와 false를 결정하는 if문이 있었다.

   if (answerSet.isect(getPrecodeSet).size() >= getNum)
       ShowAlert("여기 들어오면 true!");
       isTrue = true;
debug를 위해 저 코드 한 줄을 넣은것이 화근이었다.
if문에 걸리는 문장이 원래는 isTrue = true; 한 문장이었다가 
내가 저 debug를 넣음으로써 isTrue = true;가 무조건 실행되게 되었던 것.
아래와 같이 curly bracket을 넣음으로써 해결되었다. 

   if (answerSet.isect(getPrecodeSet).size() >= getNum)
   {
        ShowAlert("여기 들어오면 true!");
        isTrue = true;
   }
이제 single은 해결됐고, multi 문항도 제대로 실행 되는지 확인해 봐야 했다.
그냥 돌려본다. 
역시 안된다.
세상이 그렇게 호락호락하진 않겠지.
다시 자세히 드려다본다. (맞춤법 오류. '들여다본다'가 맞는 표현)
test 1. 왜 ArrayToSet 함수를 두번 호출하는가? answer list와 scale list를 함께 체크하기 때문.

모두 해결되었다.
결론은, single이던 multi던 grid던 간에, 내가 debug를 위해 넣는 코드 한줄 한줄들이 
기존의 로직의 흐름에 악영향을 줄 수 있다는 것이다. 

다시 한번 정리해보자.
IncAtLeast(qid, getPrecodeSet, getNum) 함수는 qid의 선택된 precode 값과 precode set의 matching 여부를 조사하여 number개 이상의 precode가 matching 되면 true를 반환, 그렇지 않으면 false를 반환한다.
var newset = set("1","2","3")
ShowAlert(IncAtLeast("q281", newset , 1))
위와 같이 validation code를 넣고,
아래와 같이 newset의 member인 3(Yellow)를 선택.
사용자 삽입 이미지
하면 바로 아래와 같은 결과를 준다.
사용자 삽입 이미지

multi 문항도 마찬가지이다. 
var newset = set('1','2','3')
ShowAlert(IncAtLeast("q272", newset,2 ))
이렇게 사용하게 되면 1, 2, 3의 precode중에 2개가 해당될 경우 true, 1개이거나 없으면 false를 return한다.

grid 문항 같은 경우는
var newset = set('1','2','3')
ShowAlert(IncAtLeast("q282", newset,2))
multi와 똑같이 사용하지만 결과는 다르다. 
grid 문항에서는 answer list의 precode가 아닌 scale list의 precode가 적용된다.
(하긴.. grid에서는 inc 안되는 answer가 없으니...'ㅁ')
사용자 삽입 이미지
이 경우 IncAtLeast의 return value는 당연히...

사용자 삽입 이미지


※ 꼭 필요한 ArrayToSet( )




2. 

ClearAMulti(qid)

클리어 어 멀티 퀘스쳔. 간단하다.
그런데... 이번에도 순탄치 않다.
사용자 삽입 이미지
setPrecodeStr를 못 보신 듯??
휴~
그래서 새로 만들어 보았다!
function ClearAMulti(qid)
{
    var j=1;
    do
    {
        if(f(qid)[j]==1)
            f(qid)[j].set(null);
    }
    while (f(qid)[++j]!=null );
} // end function
do-while문으로 만들었다. answer list의 전체길이를 측정하는게 생각보다 복잡해서
'다음 항목이 있는 동안'인 while 문을 사용했다.
적용.
사용자 삽입 이미지
사용자 삽입 이미지


3.

ClearASingle(qid)

마찬가지로 single 문항을 clear 해 주는 함수.
웹페이지에는 또 다시 실수가 보였다. 
code부분에 SetAMultiOpen이 들어있는 것. -ㅁ-;
만들자!
function ClearASingle(qid)
{
   f(qid).set(null);
}
만들었다..고 하기에는 민망한 한줄.


4.

CopyMulti(fromMulti, toMulti)

기존재하는 함수!
고로 생략.

오늘은 YG과장님의 Knowledge Sharing이 있었다.
정말 멋진 presentation!!